summaryrefslogtreecommitdiff
path: root/Runtime/LuaBind/LuaBindUtility.h
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2021-10-17 23:05:01 +0800
committerchai <chaifix@163.com>2021-10-17 23:05:01 +0800
commit7c8c68d79343d04be382334c15a73d079450857c (patch)
tree9aaacc042f0b7eeb4123c07dcc5f49c14fd8026c /Runtime/LuaBind/LuaBindUtility.h
parent6e73ca6ada8a41692809dae5db89c8db0675ce1e (diff)
*misc
Diffstat (limited to 'Runtime/LuaBind/LuaBindUtility.h')
-rw-r--r--Runtime/LuaBind/LuaBindUtility.h66
1 files changed, 66 insertions, 0 deletions
diff --git a/Runtime/LuaBind/LuaBindUtility.h b/Runtime/LuaBind/LuaBindUtility.h
new file mode 100644
index 0000000..edc5b18
--- /dev/null
+++ b/Runtime/LuaBind/LuaBindUtility.h
@@ -0,0 +1,66 @@
+#ifndef __LUA_BIND_UTILITY_H__
+#define __LUA_BIND_UTILITY_H__
+
+// 导出native接口
+
+// RegisterClass 注册类的方法和成员,比如枚举、常量等到class table GetFactoryName 获得工厂的类名,
+// 同时用来避免注册时错误注册为了singleton,通过编译时报错避免
+#define LUA_BIND_DECL_FACTORY(type, ...) \
+ friend class ::State; \
+ friend class ::NativeClass<type,##__VA_ARGS__>; \
+ static void RegisterClass(::State&); \
+ static void RegisterPostprocess(::State&); \
+ static const char* GetFactoryName() { return #type; };\
+ static const char* GetClassName() { return #type; };\
+ static bool IsClassSingleton() { return false; }
+
+// 作为基类的抽象工厂类可以使用此宏,注册一个入口,在派生类的注册函数中调用,注册基类的这些方法。
+#define LUA_BIND_DECL_ABSTRACT_FACTORY() \
+ static void RegisterClass(::State&);\
+ static void RegisterPostprocess(::State&)
+
+// RegisterClass 注册类的方法和成员,比如枚举、常量等到class table GetSingletonName 获得单例的类名
+#define LUA_BIND_DECL_SINGLETON(type, ...) \
+ friend class ::State; \
+ friend class ::NativeClass<type,##__VA_ARGS__>; \
+ static void RegisterClass(::State&); \
+ static void RegisterPostprocess(::State&); \
+ static const char* GetSingletonName() { return #type; }; \
+ static const char* GetClassName() { return #type; }; \
+ static bool IsClassSingleton() { return true; }
+
+#define LUA_BIND_DECL_METHOD(mtd) static int mtd(lua_State* L)
+
+#define LUA_BIND_DECL_ENUM(e, under_line_index)
+
+// 标明方法实现的宏。上下文里有一个L。
+#define LUA_BIND_IMPL_METHOD(type, f) int type::f(lua_State* L)
+
+// 由应用程序实现的两个接口。上下文里有一个state。
+#define LUA_BIND_REGISTRY(type) void type::RegisterClass(::State& state)
+#define LUA_BIND_POSTPROCESS(type) void type::RegisterPostprocess(::State& state)
+
+// 用来注册的宏。之前这里忘了用可变宏,导致没有luaclastable ref没有注册对。
+#define LUA_BIND_REGISTER_FACTORY(state, param) state.RegisterFactory<param>()
+#define LUA_BIND_REGISTER_SINGLETON(state, param) state.RegisterSingleton<param>()
+#define LUA_BIND_REGISTER_ABSTRACT_FACTORY(state, type) type::RegisterPostprocess(state)
+#define LUA_BIND_REGISTER_METHODS(state, ...) \
+ do{ \
+ luaL_Reg __m[] = {__VA_ARGS__,{0, 0}}; \
+ state.RegisterMethods(__m); \
+ }while(0)
+#define LUA_BIND_REGISTER_ENUM(state, name, ...) \
+ do{ \
+ ::Enum __e[] = {__VA_ARGS__,{0, 0}}; \
+ state.RegisterEnum(name, __e); \
+ }while(0)
+
+#define LUA_BIND_PREPARE(L, T) \
+ LUA_BIND_STATE(L); \
+ T* self = state.GetUserdata<T>(1);
+
+#define LUA_BIND_INHERIT(state, type) type::RegisterClass(state)
+
+#define luaxport private
+
+#endif \ No newline at end of file