diff options
Diffstat (limited to 'Source/3rdParty/Luax/luax_class.inl')
-rw-r--r-- | Source/3rdParty/Luax/luax_class.inl | 292 |
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 |