diff options
Diffstat (limited to 'src/libjin-lua/common/l_shared.hpp')
-rw-r--r-- | src/libjin-lua/common/l_shared.hpp | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/src/libjin-lua/common/l_shared.hpp b/src/libjin-lua/common/l_shared.hpp new file mode 100644 index 0000000..6a58ab3 --- /dev/null +++ b/src/libjin-lua/common/l_shared.hpp @@ -0,0 +1,84 @@ +#ifndef __JE_LUA_SHARED_H__ +#define __JE_LUA_SHARED_H__ + +#include <map> +#include <vector> +#include <functional> + +#include "libjin/jin.h" + +namespace JinEngine +{ + namespace Lua + { + + class LuaObject; + + /// + /// Thread shared object wrapper. + /// + class Shared + { + public: + Shared(Object* obj) + : mCount(0) + , mObject(obj) + { + } + + inline Object* operator->() + { + return static_cast<Object*>(mObject); + } + + inline Object* getObject() + { + return static_cast<Object*>(mObject); + } + + template<class T> + inline T* getObject() + { + return static_cast<T*>(mObject); + } + + private: + friend class LuaObject; + + // Disable copy. + Shared(const Shared& shared); + + /// + /// Sharedֻڶ + /// + ~Shared() + { + delete mObject; + } + + /// + /// ͬһ̵߳lua_StateУLuaObjectEngineObjectӦһһӦLuaObject(lua runtime)ü + /// ͻաEngine-sideüΪά̵ͬ߳lua_StateͬһEngineObjectÿLuaObjectһ + /// Sharedʱһüͬһ߳УһEngineObjectֻһLuaObjectnew + /// instanceУômCountͱEngineObjectĹ߳ + /// + inline void Shared::retain() + { + ++mCount; + } + + inline void Shared::release() + { + if (--mCount <= 0) + delete this; + } + + Object* mObject; + int mCount; + + }; + + } // namespace Lua +} // namespace JinEngine + +#endif
\ No newline at end of file |