aboutsummaryrefslogtreecommitdiff
path: root/src/lua/common/je_lua_object.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lua/common/je_lua_object.cpp')
-rw-r--r--src/lua/common/je_lua_object.cpp100
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();
}
}