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