diff options
Diffstat (limited to 'src/lua/common/je_lua_shared.hpp')
-rw-r--r-- | src/lua/common/je_lua_shared.hpp | 98 |
1 files changed, 20 insertions, 78 deletions
diff --git a/src/lua/common/je_lua_shared.hpp b/src/lua/common/je_lua_shared.hpp index 59e945d..2f1e18b 100644 --- a/src/lua/common/je_lua_shared.hpp +++ b/src/lua/common/je_lua_shared.hpp @@ -5,6 +5,9 @@ #include <map> #include <vector> +#include <functional> + +struct lua_State; namespace JinEngine { @@ -14,96 +17,37 @@ namespace JinEngine class SharedBase { public: - void retain() - { - ++mCount; - } + void retain(); - void release() - { - if (--mCount <= 0) - delete this; - } + void release(); // Object type. const char* const type; - void setDependency(int key, SharedBase* shared) - { - removeDependency(key); - shared->retain(); - mDependencies.insert(std::pair<int, SharedBase*>(key, shared)); - } + void setDependency(int key, SharedBase* shared); - void removeDependency(int key) - { - if (!isDependOn(key)) - return; - DepMap::iterator it = mDependencies.find(key); - it->second->release(); - mDependencies.erase(it); - } + void removeDependency(int key); - void removeDependency(SharedBase* dep) - { - for (DepMap::iterator it = mDependencies.begin(); it != mDependencies.end();) - { - if (it->second == dep) - { - it->second->release(); - mDependencies.erase(it); - } - else - ++it; - } - } + void removeDependency(SharedBase* dep); - bool isDependOn(int key) - { - return mDependencies.find(key) != mDependencies.end(); - } + bool isDependOn(int key); - bool isDependOn(SharedBase* shared) - { - for (std::pair<int, SharedBase*> dep : mDependencies) - { - if (dep.second == shared) - return true; - } - return false; - } + bool isDependOn(SharedBase* shared); - void clearDependencies() - { - for (std::pair<int, SharedBase*> dep : mDependencies) - dep.second->release(); - mDependencies.clear(); - } + void clearDependencies(); - SharedBase* getDependency(int key) - { - if (!isDependOn(key)) - return nullptr; - return mDependencies.find(key)->second; - } + SharedBase* getDependency(int key); - bool isType(const char* t) - { - return strcmp(type, t) == 0; - } + bool isType(const char* t); - int getDependencyCount() - { - return mDependencies.size(); - } + int getDependencyCount(); protected: - using DepMap = std::map<int, SharedBase*>; - - SharedBase(void* obj, const char* t) + SharedBase(lua_State* L, void* obj, const char* t) : mCount(0) , mObject(obj) + , mL(L) , type(t) { } @@ -117,15 +61,16 @@ namespace JinEngine void* mObject; int mCount; - DepMap mDependencies; + lua_State* mL; + std::map<int, SharedBase*> mDependencies; }; template<class T> class Shared : public SharedBase { public: - Shared(T* obj, const char* type) - : SharedBase(obj, type) + Shared(lua_State* L, T* obj, const char* type) + : SharedBase(L, obj, type) { } @@ -146,9 +91,6 @@ namespace JinEngine // Make shared only be able created with new. ~Shared() { - // Delete object mapping. - luax_removeobject(LuaState::get(), this); - // T* obj = static_cast<T*>(mObject); delete obj; } |