aboutsummaryrefslogtreecommitdiff
path: root/src/libjin-lua/common/l_object.cpp
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-01-14 16:40:14 +0800
committerchai <chaifix@163.com>2019-01-14 16:40:14 +0800
commit98c9825c49a1674f59eafb3253829ca7d5cac3c1 (patch)
treebdd2a6da72fc998ff884b011a2260dc72537c25f /src/libjin-lua/common/l_object.cpp
parent8b00d67febf133e89f6a0bfabc41feed555dc4a9 (diff)
*rename source file
Diffstat (limited to 'src/libjin-lua/common/l_object.cpp')
-rw-r--r--src/libjin-lua/common/l_object.cpp112
1 files changed, 112 insertions, 0 deletions
diff --git a/src/libjin-lua/common/l_object.cpp b/src/libjin-lua/common/l_object.cpp
new file mode 100644
index 0000000..e3ac158
--- /dev/null
+++ b/src/libjin-lua/common/l_object.cpp
@@ -0,0 +1,112 @@
+#include "l_object.h"
+#include "je_lua.h"
+
+namespace JinEngine
+{
+ namespace Lua
+ {
+
+ void LuaObject::bind(Shared* obj)
+ {
+ if (obj)
+ {
+ shared = obj;
+ shared->retain();
+ dependencies = new std::map<uint, LuaObject*>();
+ }
+ }
+
+ void LuaObject::release()
+ {
+ // Delete lua shared table reference and references.
+ if (dependencies)
+ {
+ clearDependencies();
+ delete dependencies;
+ dependencies = nullptr;
+ }
+ // Try delete engine side shared.
+ if (shared)
+ {
+ shared->release();
+ shared = nullptr;
+ }
+ }
+
+ const char* LuaObject::getObjectType()
+ {
+ return type;
+ }
+
+ Shared* LuaObject::getShared()
+ {
+ return shared;
+ }
+
+ void LuaObject::setDependency(uint key, LuaObject* dep)
+ {
+ removeDependency(key);
+ dependencies->insert(std::pair<uint, LuaObject*>(key, dep));
+ luax_addreference(state, this, dep);
+ }
+
+ void LuaObject::removeDependency(uint key)
+ {
+ if (!isDependOn(key))
+ return;
+ DepsMap::iterator it = dependencies->find(key);
+ LuaObject* dep = it->second;
+ luax_removereference(state, this, dep);
+ dependencies->erase(it);
+ }
+
+ void LuaObject::removeDependency(LuaObject* dependency)
+ {
+ for (DepsMap::iterator it = dependencies->begin(); it != dependencies->end();)
+ {
+ LuaObject* dep = it->second;
+ if (dep == dependency)
+ {
+ luax_removereference(state, this, dep);
+ dependencies->erase(it);
+ }
+ else
+ ++it;
+ }
+ }
+
+ bool LuaObject::isDependOn(uint key)
+ {
+ return dependencies->find(key) != dependencies->end();
+ }
+
+ bool LuaObject::isDependOn(LuaObject* shared)
+ {
+ for (std::pair<uint, LuaObject*> dep : (*dependencies))
+ {
+ if (dep.second == shared)
+ return true;
+ }
+ return false;
+ }
+
+ void LuaObject::clearDependencies()
+ {
+ luax_removereference(state, this);
+ dependencies->clear();
+ }
+
+ LuaObject* LuaObject::getDependency(uint key)
+ {
+ if (!isDependOn(key))
+ return nullptr;
+ return dependencies->find(key)->second;
+ }
+
+ int LuaObject::getDependenciesCount()
+ {
+ return dependencies->size();
+ }
+
+ }
+} \ No newline at end of file