diff options
Diffstat (limited to 'src/lua/common/je_lua_reference.hpp')
-rw-r--r-- | src/lua/common/je_lua_reference.hpp | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/src/lua/common/je_lua_reference.hpp b/src/lua/common/je_lua_reference.hpp new file mode 100644 index 0000000..ba918bb --- /dev/null +++ b/src/lua/common/je_lua_reference.hpp @@ -0,0 +1,88 @@ +#ifndef __JIN_COMMON_REFERENCE_H +#define __JIN_COMMON_REFERENCE_H + +namespace JinEngine +{ + namespace Lua + { + + /*abstract*/class RefBase + { + 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: + RefBase(void* obj, const char* t) + : count(1) + , object(obj) + , type(t) + { + } + + RefBase(const RefBase&); + + virtual ~RefBase() + { + } + + void* object; + int count; + void* userdata; + }; + + template<class T> + class Ref : public RefBase + { + public: + Ref(T* obj, const char* type) + : RefBase(obj, type) + { + } + + ~Ref() + { + T* obj = static_cast<T*>(object); + delete obj; + } + + T* operator->() + { + return (T*)object; + } + + T* getObject() + { + return (T*)object; + } + + private: + Ref(const Ref<T>& ref); + + }; + + } +} + +#endif
\ No newline at end of file |