⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 js_object.h

📁 这是一款2d游戏引擎
💻 H
📖 第 1 页 / 共 2 页
字号:
/*  $Id: js_object.h,v 1.7 2004/01/02 15:42:44 mbn Exp $
**
**  ClanLib Game SDK
**  Copyright (C) 2003  The ClanLib Team
**  For a total list of contributers see the file CREDITS.
**
**  This library is free software; you can redistribute it and/or
**  modify it under the terms of the GNU Lesser General Public
**  License as published by the Free Software Foundation; either
**  version 2.1 of the License, or (at your option) any later version.
**
**  This library is distributed in the hope that it will be useful,
**  but WITHOUT ANY WARRANTY; without even the implied warranty of
**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
**  Lesser General Public License for more details.
**
**  You should have received a copy of the GNU Lesser General Public
**  License along with this library; if not, write to the Free Software
**  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
*/
//! clanJavaScript="Framework"
//! header=javascript.h

#ifndef header_js_object
#define header_js_object

#if _MSC_VER > 1000
#pragma once
#endif

#include "js_config.h"
#include "js_value.h"
#include "js_arguments.h"
#include <string>
#include <map>
#include <vector>

//: JavaScript Object class.
//- !group=JavaScript/Framework!
//- !header=javascript.h!
class CL_JSObject
{
//! Construction:
public:
	CL_JSObject(const char *name = "Anonymous");

	~CL_JSObject();

//! Attributes:
public:
	typedef CL_JSValue (CL_JSObject::*MemberFuncCall)(
		CL_JSContext *context, CL_JSArguments &args);

	typedef CL_JSValue (CL_JSObject::*MemberFuncPropertyGetter)(CL_JSContext *cx);

	typedef void (CL_JSObject::*MemberFuncPropertySetter)(const CL_JSValue &value);

	const JSClass &getClass() const { return jsClass; }

	JSClass &getClass() { return jsClass; }

	const JSObject *getObject() const { return jsObject; }

	JSObject *getObject() { return jsObject; }

//! Operations:
public:
	void newObject(JSContext *cx, JSObject *proto = 0, JSObject *parent = 0);

	void defineObject(JSContext *cx, JSObject *obj, const char *name, JSObject *proto, uintN flags);

	void initStandardClasses(JSContext *cx);

	void initClass(
		JSContext *cx, JSObject *obj, JSObject *parent,
		JSNative constructor, uintN nargs,
		JSPropertySpec *ps,
		JSFunctionSpec *fs,
		JSPropertySpec *staticPs,
		JSFunctionSpec *staticFs);

	template<class Class>
	void defineFunction(
		JSContext *cx, const char *name,
		CL_JSValue(Class::*func)(CL_JSContext *cx, CL_JSArguments &args),
		int argc)
	{
		JSFunction *jsFunc = JS_DefineFunction(cx, jsObject, name, call, argc, 0);
		functionMap[jsFunc] = (MemberFuncCall) func;
	}

	template<class Class, class RetVal, class Param1>
	void defineFunction_1(
		JSContext *cx, const char *name,
		RetVal(Class::*func)(Param1))
	{
		JSBool (*ptrCall)(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
		ptrCall = CL_JSObject::Call_1<RetVal, Param1>::call;
		JSFunction *jsFunc = JS_DefineFunction(cx, jsObject, name, ptrCall, 1, 0);
		functionMap[jsFunc] = (MemberFuncCall) func;
	}

	template<class Class, class RetVal, class Param1, class Param2>
	void defineFunction_2(
		JSContext *cx, const char *name,
		RetVal(Class::*func)(Param1, Param2))
	{
		JSBool (*ptrCall)(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
		ptrCall = CL_JSObject::Call_2<RetVal, Param1, Param2>::call;
		JSFunction *jsFunc = JS_DefineFunction(cx, jsObject, name, ptrCall, 2, 0);
		functionMap[jsFunc] = (MemberFuncCall) func;
	}

	template<class Class, class RetVal, class Param1, class Param2, class Param3>
	void defineFunction_3(
		JSContext *cx, const char *name,
		RetVal(Class::*func)(Param1, Param2, Param3))
	{
		JSBool (*ptrCall)(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
		ptrCall = CL_JSObject::Call_3<RetVal, Param1, Param2, Param3>::call;
		JSFunction *jsFunc = JS_DefineFunction(cx, jsObject, name, ptrCall, 3, 0);
		functionMap[jsFunc] = (MemberFuncCall) func;
	}

	template<class Class, class RetVal, class Param1, class Param2, class Param3, class Param4>
	void defineFunction_4(
		JSContext *cx, const char *name,
		RetVal(Class::*func)(Param1, Param2, Param3, Param4))
	{
		JSBool (*ptrCall)(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
		ptrCall = CL_JSObject::Call_4<RetVal, Param1, Param2, Param3, Param4>::call;
		JSFunction *jsFunc = JS_DefineFunction(cx, jsObject, name, ptrCall, 4, 0);
		functionMap[jsFunc] = (MemberFuncCall) func;
	}

	template<class Class, class RetVal, class Param1, class Param2, class Param3, class Param4, class Param5>
	void defineFunction_5(
		JSContext *cx, const char *name,
		RetVal(Class::*func)(Param1, Param2, Param3, Param4, Param5))
	{
		JSBool (*ptrCall)(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
		ptrCall = CL_JSObject::Call_5<RetVal, Param1, Param2, Param3, Param4, Param5>::call;
		JSFunction *jsFunc = JS_DefineFunction(cx, jsObject, name, ptrCall, 5, 0);
		functionMap[jsFunc] = (MemberFuncCall) func;
	}

	template<class Class, class Param1>
	void defineFunction_v1(
		JSContext *cx, const char *name,
		void(Class::*func)(Param1))
	{
		JSBool (*ptrCall)(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
		ptrCall = CL_JSObject::Call_v1<Param1>::call;
		JSFunction *jsFunc = JS_DefineFunction(cx, jsObject, name, ptrCall, 1, 0);
		functionMap[jsFunc] = (MemberFuncCall) func;
	}

	template<class Class, class Param1, class Param2>
	void defineFunction_v2(
		JSContext *cx, const char *name,
		void(Class::*func)(Param1, Param2))
	{
		JSBool (*ptrCall)(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
		ptrCall = CL_JSObject::Call_v2<Param1, Param2>::call;
		JSFunction *jsFunc = JS_DefineFunction(cx, jsObject, name, ptrCall, 2, 0);
		functionMap[jsFunc] = (MemberFuncCall) func;
	}

	template<class Class, class Param1, class Param2, class Param3>
	void defineFunction_v3(
		JSContext *cx, const char *name,
		void(Class::*func)(Param1, Param2, Param3))
	{
		JSBool (*ptrCall)(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
		ptrCall = CL_JSObject::Call_v3<Param1, Param2, Param3>::call;
		JSFunction *jsFunc = JS_DefineFunction(cx, jsObject, name, ptrCall, 3, 0);
		functionMap[jsFunc] = (MemberFuncCall) func;
	}

	template<class Class, class Param1, class Param2, class Param3, class Param4>
	void defineFunction_v4(
		JSContext *cx, const char *name,
		void(Class::*func)(Param1, Param2, Param3, Param4))
	{
		JSBool (*ptrCall)(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
		ptrCall = CL_JSObject::Call_v4<Param1, Param2, Param3, Param4>::call;
		JSFunction *jsFunc = JS_DefineFunction(cx, jsObject, name, ptrCall, 4, 0);
		functionMap[jsFunc] = (MemberFuncCall) func;
	}

	template<class Class, class Param1, class Param2, class Param3, class Param4, class Param5>
	void defineFunction_5(
		JSContext *cx, const char *name,
		void(Class::*func)(Param1, Param2, Param3, Param4, Param5))
	{
		JSBool (*ptrCall)(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
		ptrCall = CL_JSObject::Call_v5<Param1, Param2, Param3, Param4, Param5>::call;
		JSFunction *jsFunc = JS_DefineFunction(cx, jsObject, name, ptrCall, 5, 0);
		functionMap[jsFunc] = (MemberFuncCall) func;
	}

	void defineProperty(
		JSContext *cx,
		const char *name,
		const CL_JSValue &value,
		int flags = 0)
	{
		JSBool result = JS_DefineProperty(cx, jsObject, name, value, 0, 0, flags);
	}

	template<class Class>
	void defineProperty(
		JSContext *cx,
		const char *name,
		CL_JSValue(Class::*getter)(CL_JSContext *cx),
		void(Class::*setter)(const CL_JSValue &value),
		int flags = 0)
	{
		int tinyid = getters.size();
		getters.push_back((MemberFuncPropertyGetter) getter);
		setters.push_back((MemberFuncPropertySetter) setter);

		JS_DefinePropertyWithTinyId(
			cx, jsObject, name, tinyid, JSVAL_NULL, CL_JSObject::getter, CL_JSObject::setter, flags);
	}

	template<class Class, class GetType, class SetType>
	void defineProperty_1(
		JSContext *cx,
		const char *name,
		GetType(Class::*getter)(),
		void(Class::*setter)(SetType),
		int flags = 0)
	{
		int tinyid = getters.size();
		getters.push_back((MemberFuncPropertyGetter) getter);
		setters.push_back((MemberFuncPropertySetter) setter);

		JS_DefinePropertyWithTinyId(
			cx, jsObject, name, tinyid, JSVAL_NULL,
			Property_1<GetType, SetType>::getter,
			Property_1<GetType, SetType>::setter,
			flags);
	}

	template<class VarType>
	void defineProperty_ptr(
		JSContext *cx,
		const char *name,
		VarType *varPtr,
		int flags = 0)
	{
		int tinyid = vars.size();
		vars.push_back(varPtr);

		JS_DefinePropertyWithTinyId(
			cx, jsObject, name, tinyid, JSVAL_NULL,
			Property_ptr<VarType>::getter,
			Property_ptr<VarType>::setter,
			flags);
	}

	template<class VarType>
	void defineProperty_obj(
		JSContext *cx,
		const char *name,
		VarType *varPtr,
		int flags = 0)
	{
		int tinyid = vars.size();
		vars.push_back(varPtr);

		JS_DefinePropertyWithTinyId(
			cx, jsObject, name, tinyid, JSVAL_NULL,
			Property_obj<VarType>::getter,
			Property_obj<VarType>::setter,
			flags);
	}

	template<class VarType>
	void defineProperty_objPtr(
		JSContext *cx,
		const char *name,
		VarType *varPtr,
		int flags = 0)
	{
		int tinyid = vars.size();
		vars.push_back(varPtr);

		JS_DefinePropertyWithTinyId(
			cx, jsObject, name, tinyid, JSVAL_NULL,
			Property_objPtr<VarType>::getter,
			Property_objPtr<VarType>::setter,
			flags);
	}

	bool call_v0(JScriptContext *cx, const char *funcName)
	{
		jsval rval;
		JSBool result = JS_CallFunctionName(*cx, jsObject, funcName, 0, 0, &rval);
		return result == JS_TRUE;
	}

	template <class ReturnType>
	bool call_0(JScriptContext *cx, const char *funcName, ReturnType &retValue)
	{
		jsval rval;
		JSBool result = JS_CallFunctionName(*cx, jsObject, funcName, 0, 0, &rval);
		if (result != JS_TRUE) return false;

		retValue = JScriptValue(cx, rval);
		return true;
	}

	template <class Param1>
	bool call_v1(JScriptContext *cx, const char *funcName, Param1 param1)
	{
		jsval params[1];
		params[0] = JScriptValue(cx, param1).getJsval();

		jsval rval;
		JSBool result = JS_CallFunctionName(*cx, jsObject, funcName, 1, params, &rval);
		return result == JS_TRUE;
	}

	template <class Param1, class ReturnType>
	bool call_1(JScriptContext *cx, const char *funcName, Param1 param1, ReturnType &retValue)
	{
		jsval params[1];
		params[0] = JScriptValue(cx, param1).getJsval();

		jsval rval;
		JSBool result = JS_CallFunctionName(*cx, jsObject, funcName, 1, params, &rval);
		if (result != JS_TRUE) return false;

		retValue = JScriptValue(cx, rval);
		return true;
	}

	template <class Param1, class Param2>
	bool call_v2(JScriptContext *cx, const char *funcName, Param1 param1, Param2 param2)
	{
		jsval params[2];
		params[0] = JScriptValue(cx, param1).getJsval();
		params[1] = JScriptValue(cx, param2).getJsval();

		jsval rval;
		JSBool result = JS_CallFunctionName(*cx, jsObject, funcName, 2, params, &rval);
		return result == JS_TRUE;
	}

	template <class Param1, class Param2, class ReturnType>
	bool call_2(JScriptContext *cx, const char *funcName, Param1 param1, Param2 param2, ReturnType &retValue)
	{
		jsval params[2];
		params[0] = JScriptValue(cx, param1).getJsval();
		params[1] = JScriptValue(cx, param2).getJsval();

		jsval rval;
		JSBool result = JS_CallFunctionName(*cx, jsObject, funcName, 2, params, &rval);
		if (result != JS_TRUE) return false;

		retValue = JScriptValue(cx, rval);
		return true;
	}

	template <class Param1, class Param2, class Param3>
	bool call_v3(JScriptContext *cx, const char *funcName, Param1 param1, Param2 param2, Param3 param3)
	{
		jsval params[3];
		params[0] = JScriptValue(cx, param1).getJsval();
		params[1] = JScriptValue(cx, param2).getJsval();
		params[2] = JScriptValue(cx, param3).getJsval();

		jsval rval;
		JSBool result = JS_CallFunctionName(*cx, jsObject, funcName, 3, params, &rval);
		return result == JS_TRUE;
	}

	template <class Param1, class Param2, class Param3, class ReturnType>
	bool call_3(JScriptContext *cx, const char *funcName, Param1 param1, Param2 param2, Param3 param3, ReturnType &retValue)
	{
		jsval params[3];
		params[0] = JScriptValue(cx, param1).getJsval();
		params[1] = JScriptValue(cx, param2).getJsval();
		params[2] = JScriptValue(cx, param3).getJsval();

		jsval rval;
		JSBool result = JS_CallFunctionName(*cx, jsObject, funcName, 3, params, &rval);
		if (result != JS_TRUE) return false;

		retValue = JScriptValue(cx, rval);
		return true;
	}

	template <class Param1, class Param2, class Param3, class Param4>
	bool call_v4(JScriptContext *cx, const char *funcName, Param1 param1, Param2 param2, Param3 param3, Param4 param4)
	{
		jsval params[4];
		params[0] = JScriptValue(cx, param1).getJsval();
		params[1] = JScriptValue(cx, param2).getJsval();
		params[2] = JScriptValue(cx, param3).getJsval();
		params[3] = JScriptValue(cx, param4).getJsval();

		jsval rval;
		JSBool result = JS_CallFunctionName(*cx, jsObject, funcName, 4, params, &rval);
		return result == JS_TRUE;
	}

	template <class Param1, class Param2, class Param3, class Param4, class ReturnType>
	bool call_4(JScriptContext *cx, const char *funcName, Param1 param1, Param2 param2, Param3 param3, Param4 param4, ReturnType &retValue)
	{
		jsval params[4];
		params[0] = JScriptValue(cx, param1).getJsval();
		params[1] = JScriptValue(cx, param2).getJsval();
		params[2] = JScriptValue(cx, param3).getJsval();
		params[3] = JScriptValue(cx, param4).getJsval();

		jsval rval;
		JSBool result = JS_CallFunctionName(*cx, jsObject, funcName, 4, params, &rval);
		if (result != JS_TRUE) return false;

		retValue = JScriptValue(cx, rval);
		return true;
	}

	template <class Param1, class Param2, class Param3, class Param4, class Param5>
	bool call_v5(JScriptContext *cx, const char *funcName, Param1 param1, Param2 param2, Param3 param3, Param4 param4, Param5 param5)
	{
		jsval params[5];
		params[0] = JScriptValue(cx, param1).getJsval();
		params[1] = JScriptValue(cx, param2).getJsval();
		params[2] = JScriptValue(cx, param3).getJsval();
		params[3] = JScriptValue(cx, param4).getJsval();
		params[4] = JScriptValue(cx, param5).getJsval();

		jsval rval;
		JSBool result = JS_CallFunctionName(*cx, jsObject, funcName, 5, params, &rval);
		return result == JS_TRUE;
	}

	template <class Param1, class Param2, class Param3, class Param4, class Param5, class ReturnType>
	bool call_5(JScriptContext *cx, const char *funcName, Param1 param1, Param2 param2, Param3 param3, Param4 param4, Param5 param5, ReturnType &retValue)
	{
		jsval params[5];
		params[0] = JScriptValue(cx, param1).getJsval();
		params[1] = JScriptValue(cx, param2).getJsval();
		params[2] = JScriptValue(cx, param3).getJsval();
		params[3] = JScriptValue(cx, param4).getJsval();
		params[4] = JScriptValue(cx, param5).getJsval();

		jsval rval;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -