summaryrefslogtreecommitdiff
path: root/Source/3rdParty/Luax/luax_class.inl
diff options
context:
space:
mode:
Diffstat (limited to 'Source/3rdParty/Luax/luax_class.inl')
-rw-r--r--Source/3rdParty/Luax/luax_class.inl292
1 files changed, 233 insertions, 59 deletions
diff --git a/Source/3rdParty/Luax/luax_class.inl b/Source/3rdParty/Luax/luax_class.inl
index fd5c1d9..895152e 100644
--- a/Source/3rdParty/Luax/luax_class.inl
+++ b/Source/3rdParty/Luax/luax_class.inl
@@ -1,75 +1,249 @@
+namespace Luax
+{
-//----------------------------------------------------------------------------------------------------------------
-// ӿ
+ //----------------------------------------------------------------------------------------------------------------
+ // ӿ
-///
-/// ԲͬͣͨGetLuaClassName
-///
-template<class T>
-int LuaxClass::l_GetClassName(lua_State* L)
-{
- LUAX_SETUP(L, "*");
+ ///
+ /// ԲͬͣͨGetLuaClassName
+ ///
+ template<typename T>
+ int LuaxClass<T>::l_GetClassName(lua_State* L)
+ {
+ LUAX_SETUP(L, "*");
- cc8* type = T::GetLuaxClassName();
- state.Push(type);
- return 1;
-}
+ cc8* type = T::GetLuaxClassName();
+ state.Push(type);
+ return 1;
+ }
-//----------------------------------------------------------------------------------------------------------------
+ //----------------------------------------------------------------------------------------------------------------
-///
-/// עṤ͵еԱ
-///
-template<class T>
-void LuaxClass::RegisterLuaxClass(LuaxState& state)
-{
- luaL_Reg regTable[] = {
- { "GetClassName", l_GetClassName<T> },
- { NULL, NULL }
- };
+ ///
+ /// עṤ͵еԱ
+ ///
+ template<typename T>
+ void LuaxClass<T>::RegisterLuaxClass(LuaxState& state)
+ {
+ luaL_Reg regTable[] = {
+ { "GetClassName", l_GetClassName },
+ { NULL, NULL }
+ };
- state.Register(regTable);
-}
+ state.Register(regTable);
+ }
-///
-/// ijԱעclass table
-///
-template<class T>
-void LuaxClass::RegisterLuaxFactoryClass(LuaxState& state)
-{
- luaL_Reg regTable[] = {
- { NULL, NULL }
- };
+ ///
+ /// ijԱעclass table
+ ///
+ template<typename T>
+ void LuaxClass<T>::RegisterLuaxFactoryClass(LuaxState& state)
+ {
+ luaL_Reg regTable[] = {
+ { "GetInterfaceTable", l_GetInterfaceTable },
+ { NULL, NULL }
+ };
- state.Register(regTable);
-}
+ state.Register(regTable);
+ }
-///
-/// ʵijԱעinterface table
-///
-template<class T>
-void LuaxClass::RegisterLuaxInterface(LuaxState& state)
-{
- luaL_Reg regTable[] = {
- { "__gc", l_GC },
- { NULL, NULL }
- };
+ ///
+ /// ʵijԱעinterface table
+ ///
+ template<typename T>
+ void LuaxClass<T>::RegisterLuaxInterface(LuaxState& state)
+ {
+ luaL_Reg regTable[] = {
+ { "__gc", l_GC },
+ { NULL, NULL }
+ };
- state.Register(regTable);
-}
+ state.Register(regTable);
+ }
-///
-/// ijԱעclass table
-///
-template<class T>
-void LuaxClass::RegisterLuaxSingletonClass(LuaxState& state)
-{
- luaL_Reg regTable[] = {
- {NULL, NULL}
- };
+ ///
+ /// ijԱעclass table
+ ///
+ template<typename T>
+ void LuaxClass<T>::RegisterLuaxSingletonClass(LuaxState& state)
+ {
+ luaL_Reg regTable[] = {
+ { NULL, NULL }
+ };
+
+ state.Register(regTable);
+ }
+
+ template<typename T>
+ void LuaxClass<T>::PushInterfaceTable(LuaxState& state)
+ {
+ assert(mInterfaceTable);
+
+ mInterfaceTable.PushRef(state);
+ }
+
+ template<typename T>
+ void LuaxClass<T>::PushClassTable(LuaxState& state)
+ {
+ assert(mClassTable);
+
+ mClassTable.PushRef(state);
+ }
+
+ template<typename T>
+ void LuaxClass<T>::PushRefTable(LuaxState& state)
+ {
+ assert(mRefTable);
+
+ mRefTable.Push(state);
+ }
+
+ template<typename T>
+ void LuaxClass<T>::SetInterfaceTableRef(LuaxState& state, int idx)
+ {
+ mInterfaceTable.SetRef(state, idx);
+ }
+
+ template<typename T>
+ void LuaxClass<T>::SetClassTableRef(LuaxState& state, int idx)
+ {
+ mClassTable.SetRef(state, idx);
+ }
+
+ template<typename T>
+ LuaxClass<T>::LuaxClass()
+ : mRC(1) // ʱĬһ
+ , mSafer(false)
+ {
+ }
+
+ template<typename T>
+ LuaxClass<T>::~LuaxClass()
+ {
+ assert(mSafer);
+ }
+
+ template<typename T>
+ void LuaxClass<T>::Retain()
+ {
+ ++mRC;
+ }
+
+ template<typename T>
+ void LuaxClass<T>::Release()
+ {
+ if (--mRC <= 0)
+ {
+ mSafer = true; // safer
+ delete this;
+ }
+ }
+
+ template<typename T>
+ bool LuaxClass<T>::PushLuaUserdata(LuaxState& state)
+ {
+ if (!mUserdata)
+ {
+ BindToLua(state);
+ return true;
+ }
+ return mUserdata.PushRef(state);
+ }
+
+ template<typename T>
+ void LuaxClass<T>::BindToLua(LuaxState& state)
+ {
+ assert(!mUserdata);
+
+ // userdataջ
+ state.PushPtrUserData(this);
+
+ //
+ if (!T::IsLuaxClassSingleton())
+ {
+ lua_newtable(state); // ref table
+ lua_newtable(state); // member table
+ LuaxClass<T>::PushInterfaceTable(state); // interface table
+
+ // stack:
+ // -1: interface table
+ // -2: member table
+ // -3: ref table
+ // -4: userdata
+
+ int top = state.GetTop();
+ int memberTable = top - 1;
+ int refTable = top - 2;
+
+ // ref table ע __gc__tostring
+ lua_pushcfunction(state, LuaxClass<T>::l_GC);
+ lua_setfield(state, refTable, "__gc");
+
+ lua_pushcfunction(state, LuaxClass<T>::l_ToString);
+ lua_setfield(state, refTable, "__tostring");
+
+ // member table Ϊ ref table __index __newindex
+ lua_pushvalue(state, memberTable);
+ lua_setfield(state, refTable, "__index");
+
+ lua_pushvalue(state, memberTable);
+ lua_setfield(state, refTable, "__newindex");
+
+ // Ԫ
+ lua_setmetatable(state, -2); // interface is meta of member
+ lua_setmetatable(state, -2); // member is meta of ref
+ lua_setmetatable(state, -2); // ref is meta of userdata
+ }
+
+ // һuserdataãͨnativeָ뷵lua
+ mUserdata.SetRef(state, -1);
+ assert(mUserdata);
+
+ if (T::IsLuaxClassSingleton())
+ {
+
+ }
+ }
+
+ //--------------------------------------------------------------------------------------------------------------
+
+ ///
+ /// ͷŹʵ
+ ///
+ template<typename T>
+ int LuaxClass<T>::l_GC(lua_State* L)
+ {
+ LUAX_SETUP(L, "U");
+
+ return 0;
+ }
+
+ template<typename T>
+ int LuaxClass<T>::l_ToString(lua_State* L)
+ {
+ return 0;
+ }
+
+ template<typename T>
+ int LuaxClass<T>::l_ExtendFactory(lua_State* L)
+ {
+ return 0;
+ }
+
+ template<typename T>
+ int LuaxClass<T>::l_GetInterfaceTable(lua_State* L)
+ {
+ LUAX_STATE(L);
+ assert(mInterfaceTable);
+ mInterfaceTable.PushRef(state);
+ return 0;
+ }
+
+ template<typename T> LuaxStrongRef LuaxClass<T>::mInterfaceTable; // interface table
+ template<typename T> LuaxStrongRef LuaxClass<T>::mClassTable; // class table
+ template<typename T> LuaxStrongRef LuaxClass<T>::mRefTable; //
- state.Register(regTable);
} \ No newline at end of file