diff options
Diffstat (limited to 'src/lua/common/je_lua_object.cpp')
-rw-r--r-- | src/lua/common/je_lua_object.cpp | 100 |
1 files changed, 90 insertions, 10 deletions
diff --git a/src/lua/common/je_lua_object.cpp b/src/lua/common/je_lua_object.cpp index ce71283..d98099e 100644 --- a/src/lua/common/je_lua_object.cpp +++ b/src/lua/common/je_lua_object.cpp @@ -1,31 +1,111 @@ -#include "je_lua.h" #include "je_lua_object.h" +#include "je_lua.h" namespace JinEngine { namespace Lua { - void LuaObject::bind(SharedBase* s) + void LuaObject::bind(SharedBase* obj) { - if (s == nullptr) - return; - shared = s; - shared->retain(); + if (obj) + { + object = obj; + object->retain(); + dependencies = new std::map<uint, SharedBase*>(); + } } void LuaObject::release() { - if (shared != nullptr) + // Delete lua object table reference and references. + if (dependencies) { - shared->release(); - shared = nullptr; + clearDependencies(); + delete dependencies; + dependencies = nullptr; + } + // Try delete engine side object. + if (object) + { + object->release(); + object = nullptr; } } const char* LuaObject::getObjectType() { - return shared->getType(); + return object->getType(); + } + + SharedBase* LuaObject::getSharedBase() + { + return object; + } + + void LuaObject::setDependency(uint key, SharedBase* dep) + { + removeDependency(key); + dependencies->insert(std::pair<uint, SharedBase*>(key, dep)); + luax_addreference(state, object, dep); + } + + void LuaObject::removeDependency(uint key) + { + if (!isDependOn(key)) + return; + DepsMap::iterator it = dependencies->find(key); + SharedBase* dep = it->second; + luax_removereference(state, object, dep); + dependencies->erase(it); + } + + void LuaObject::removeDependency(SharedBase* dependency) + { + for (DepsMap::iterator it = dependencies->begin(); it != dependencies->end();) + { + SharedBase* dep = it->second; + if (dep == dependency) + { + luax_removereference(state, object, dep); + dependencies->erase(it); + } + else + ++it; + } + } + + bool LuaObject::isDependOn(uint key) + { + return dependencies->find(key) != dependencies->end(); + } + + bool LuaObject::isDependOn(SharedBase* shared) + { + for (std::pair<uint, SharedBase*> dep : (*dependencies)) + { + if (dep.second == shared) + return true; + } + return false; + } + + void LuaObject::clearDependencies() + { + luax_removereference(state, object); + dependencies->clear(); + } + + SharedBase* LuaObject::getDependency(uint key) + { + if (!isDependOn(key)) + return nullptr; + return dependencies->find(key)->second; + } + + int LuaObject::getDependenciesCount() + { + return dependencies->size(); } } |