From 8585c92b7d0744a1f1a39c872cf5096621161b6c Mon Sep 17 00:00:00 2001 From: chai Date: Thu, 16 Aug 2018 14:21:56 +0800 Subject: *update --- src/lua/luaopen_types.h | 98 +++++++++++++++++++++++++++++++------------------ 1 file changed, 63 insertions(+), 35 deletions(-) (limited to 'src/lua/luaopen_types.h') diff --git a/src/lua/luaopen_types.h b/src/lua/luaopen_types.h index a685407..b328d44 100644 --- a/src/lua/luaopen_types.h +++ b/src/lua/luaopen_types.h @@ -21,59 +21,87 @@ namespace jin { namespace lua { - - class Object - { - public: - Object() - : count(1) - { - } - int getReferenceCount() const - { - return count; - } - void retain() - { - ++count; - } - void release() - { - if (--count <= 0) - delete this; - } - - protected: - virtual ~Object() = 0 {} + class Reference + { + public: - private: - // reference count - int count; - }; + Reference(void* obj) + : count(1) + , object(obj) + { + } + void retain() + { + ++count; + } + void release() + { + if (--count <= 0) + delete this; + } + + protected: + Reference(const Reference&); + virtual ~Reference() + { + } + void* object; + int count; + + }; + + template + class Ref : public Reference + { + public: + Ref(T* obj) + : Reference(obj) + { + } + ~Ref() + { + T* obj = (T*)object; + delete obj; + } + T& operator *() + { + T* obj = (T*)object; + return *obj; + } + private: + Ref(const Ref& ref); + }; class Proxy { public: - void bind(Object* obj, const char* t) + void bind(Reference* ref, const char* t) { - if (obj == nullptr) + if (ref == nullptr) return; - object = obj; + reference = ref; type = t; } void release() { - if (object != nullptr) + if (reference != nullptr) { - object->release(); - object = nullptr; + reference->release(); + reference = nullptr; type = nullptr; } } - Object* object; // acctual object binded + template + Ref& getRef() + { + Ref* ref = (Ref*) reference; + return *ref; + } + + Reference* reference; // acctual object binded const char* type; // type name and metatable name }; -- cgit v1.1-26-g67d0