diff options
author | chai <chaifix@163.com> | 2018-11-10 20:13:55 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2018-11-10 20:13:55 +0800 |
commit | e92caa97329016d012b46b9d37e1b2c3b613a8f2 (patch) | |
tree | 5bef0b7547e12f61dede5e09843e1718b808f9c4 /src/lua/common/je_lua_shared.hpp | |
parent | 63153bc8e742c522cfd3f5ab10609966e33310e6 (diff) |
*修改代码结构
Diffstat (limited to 'src/lua/common/je_lua_shared.hpp')
-rw-r--r-- | src/lua/common/je_lua_shared.hpp | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/src/lua/common/je_lua_shared.hpp b/src/lua/common/je_lua_shared.hpp new file mode 100644 index 0000000..7ad7c1d --- /dev/null +++ b/src/lua/common/je_lua_shared.hpp @@ -0,0 +1,99 @@ +#ifndef __JIN_COMMON_REFERENCE_H +#define __JIN_COMMON_REFERENCE_H + +namespace JinEngine +{ + namespace Lua + { + + /*abstract*/class SharedBase + { + public: + void retain() + { + ++(*count); + } + + void release() + { + if (--(*count) <= 0) + delete this; + } + + // object type string + const char* const type; + + void setUserdata(void* data) + { + userdata = data; + } + + void* getUserdata() + { + return userdata; + } + + protected: + SharedBase(void* obj, const char* t) + : object(obj) + , type(t) + { + count = new int(1); + } + + SharedBase(const SharedBase&); + + virtual ~SharedBase() + { + + } + + void* object; + int* count; + void* userdata; + }; + + template<class T> + class Shared : public SharedBase + { + public: + Shared(T* obj, const char* type) + : SharedBase(obj, type) + { + } + + ~Shared() + { + T* obj = static_cast<T*>(object); + delete obj; + } + + T* operator->() + { + return static_cast<T*>(object); + } + + T* getObject() + { + return static_cast<T*>(object); + } + + T* operator &() + { + return static_cast<T*>(object); + } + + T& operator *() + { + return *(static_cast<T*>(object)); + } + + private: + Shared(const Shared<T>& ref); + + }; + + } +} + +#endif
\ No newline at end of file |