Line data Source code
1 : /* Copyright (C) 2021 Wildfire Games.
2 : * This file is part of 0 A.D.
3 : *
4 : * 0 A.D. is free software: you can redistribute it and/or modify
5 : * it under the terms of the GNU General Public License as published by
6 : * the Free Software Foundation, either version 2 of the License, or
7 : * (at your option) any later version.
8 : *
9 : * 0 A.D. is distributed in the hope that it will be useful,
10 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 : * GNU General Public License for more details.
13 : *
14 : * You should have received a copy of the GNU General Public License
15 : * along with 0 A.D. If not, see <http://www.gnu.org/licenses/>.
16 : */
17 :
18 : #ifndef INCLUDED_INTERFACE_SCRIPTED
19 : #define INCLUDED_INTERFACE_SCRIPTED
20 :
21 : #include "scriptinterface/FunctionWrapper.h"
22 : #include "scriptinterface/ScriptConversions.h"
23 : #include "scriptinterface/ScriptInterface.h"
24 :
25 : #define BEGIN_INTERFACE_WRAPPER(iname) \
26 : JSClass class_ICmp##iname = { \
27 : "ICmp" #iname, JSCLASS_HAS_PRIVATE \
28 : }; \
29 : static JSFunctionSpec methods_ICmp##iname[] = {
30 :
31 : #define END_INTERFACE_WRAPPER(iname) \
32 : JS_FS_END \
33 : }; \
34 : void ICmp##iname::InterfaceInit(ScriptInterface& scriptInterface) { \
35 : scriptInterface.DefineCustomObjectType(&class_ICmp##iname, NULL, 0, NULL, methods_ICmp##iname, NULL, NULL); \
36 : } \
37 : bool ICmp##iname::NewJSObject(const ScriptInterface& scriptInterface, JS::MutableHandleObject out) const\
38 : { \
39 : out.set(scriptInterface.CreateCustomObject("ICmp" #iname)); \
40 : return true; \
41 : } \
42 : void RegisterComponentInterface_##iname(ScriptInterface& scriptInterface) { \
43 : ICmp##iname::InterfaceInit(scriptInterface); \
44 : }
45 :
46 : template <typename T, JSClass* jsClass>
47 1 : inline T* ComponentGetter(const ScriptRequest& rq, JS::CallArgs& args)
48 : {
49 1 : return ScriptInterface::GetPrivate<T>(rq, args, jsClass);
50 : }
51 :
52 : #define DEFINE_INTERFACE_METHOD(scriptname, classname, methodname) \
53 : ScriptFunction::Wrap<&classname::methodname, ComponentGetter<classname, &class_##classname>>(scriptname),
54 :
55 : #endif // INCLUDED_INTERFACE_SCRIPTED
|