aboutsummaryrefslogtreecommitdiff
path: root/src/lua/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/lua/common')
-rw-r--r--src/lua/common/je_lua.cpp16
-rw-r--r--src/lua/common/je_lua.h15
-rw-r--r--src/lua/common/je_lua_proxy.cpp32
-rw-r--r--src/lua/common/je_lua_proxy.h27
-rw-r--r--src/lua/common/je_lua_shared.cpp94
-rw-r--r--src/lua/common/je_lua_shared.hpp98
6 files changed, 161 insertions, 121 deletions
diff --git a/src/lua/common/je_lua.cpp b/src/lua/common/je_lua.cpp
index 2011e15..ad3f756 100644
--- a/src/lua/common/je_lua.cpp
+++ b/src/lua/common/je_lua.cpp
@@ -1,22 +1,14 @@
+#include "libjin/jin.h"
+
#include "je_lua.h"
+using namespace JinEngine::Math;
+
namespace JinEngine
{
namespace Lua
{
- lua_State * LuaState::mL = nullptr;
-
- void LuaState::set(lua_State* L)
- {
- mL = L;
- }
-
- lua_State* LuaState::get()
- {
- return mL;
- }
-
///
/// Lua objects table. Map object to proxy, like objects_table[object] = proxy.
///
diff --git a/src/lua/common/je_lua.h b/src/lua/common/je_lua.h
index 753230e..56a5090 100644
--- a/src/lua/common/je_lua.h
+++ b/src/lua/common/je_lua.h
@@ -1,5 +1,8 @@
#ifndef __JE_LUA_H__
#define __JE_LUA_H__
+
+#include <vector>
+
#include "LuaJIT/lua.hpp"
#include "libraries/luax/luax.h"
@@ -12,18 +15,6 @@ namespace JinEngine
namespace Lua
{
- // Lua state singleton.
- class LuaState
- {
- public:
- static lua_State * get();
- static void set(lua_State* L);
-
- private:
- static lua_State * mL;
-
- };
-
///
///
///
diff --git a/src/lua/common/je_lua_proxy.cpp b/src/lua/common/je_lua_proxy.cpp
new file mode 100644
index 0000000..dc6df30
--- /dev/null
+++ b/src/lua/common/je_lua_proxy.cpp
@@ -0,0 +1,32 @@
+#include "je_lua.h"
+#include "je_lua_proxy.h"
+
+namespace JinEngine
+{
+ namespace Lua
+ {
+
+ void Proxy::bind(SharedBase* s)
+ {
+ if (s == nullptr)
+ return;
+ shared = s;
+ shared->retain();
+ }
+
+ void Proxy::release()
+ {
+ if (shared != nullptr)
+ {
+ shared->release();
+ shared = nullptr;
+ }
+ }
+
+ const char* Proxy::getObjectType()
+ {
+ return shared->type;
+ }
+
+ }
+} \ No newline at end of file
diff --git a/src/lua/common/je_lua_proxy.h b/src/lua/common/je_lua_proxy.h
index d6a6a0a..aa03fa0 100644
--- a/src/lua/common/je_lua_proxy.h
+++ b/src/lua/common/je_lua_proxy.h
@@ -3,6 +3,8 @@
#include "je_lua_shared.hpp"
+struct lua_State;
+
namespace JinEngine
{
namespace Lua
@@ -11,22 +13,12 @@ namespace JinEngine
class Proxy
{
public:
- void bind(SharedBase* s)
- {
- if (s == nullptr)
- return;
- shared = s;
- shared->retain();
- }
+ ///
+ /// Set lua_State and object it bind.
+ ///
+ void bind(SharedBase* s);
- void release()
- {
- if (shared != nullptr)
- {
- shared->release();
- shared = nullptr;
- }
- }
+ void release();
template<class T>
Shared<T>& getShared()
@@ -44,10 +36,7 @@ namespace JinEngine
return shared.getObject();
}
- const char* getObjectType()
- {
- return shared->type;
- }
+ const char* getObjectType();
// Bind shared object.
SharedBase* shared;
diff --git a/src/lua/common/je_lua_shared.cpp b/src/lua/common/je_lua_shared.cpp
new file mode 100644
index 0000000..a3478dd
--- /dev/null
+++ b/src/lua/common/je_lua_shared.cpp
@@ -0,0 +1,94 @@
+#include "je_lua.h"
+#include "je_lua_shared.hpp"
+
+namespace JinEngine
+{
+ namespace Lua
+ {
+
+ void SharedBase::retain()
+ {
+ ++mCount;
+ }
+
+ void SharedBase::release()
+ {
+ if (--mCount <= 0)
+ {
+ luax_removeobject(mL, this);
+ delete this;
+ }
+ }
+
+ void SharedBase::setDependency(int key, SharedBase* shared)
+ {
+ removeDependency(key);
+ shared->retain();
+ mDependencies.insert(std::pair<int, SharedBase*>(key, shared));
+ }
+
+ void SharedBase::removeDependency(int key)
+ {
+ if (!isDependOn(key))
+ return;
+ std::map<int, SharedBase*>::iterator it = mDependencies.find(key);
+ it->second->release();
+ mDependencies.erase(it);
+ }
+
+ void SharedBase::removeDependency(SharedBase* dep)
+ {
+ for (std::map<int, SharedBase*>::iterator it = mDependencies.begin(); it != mDependencies.end();)
+ {
+ if (it->second == dep)
+ {
+ it->second->release();
+ mDependencies.erase(it);
+ }
+ else
+ ++it;
+ }
+ }
+
+ bool SharedBase::isDependOn(int key)
+ {
+ return mDependencies.find(key) != mDependencies.end();
+ }
+
+ bool SharedBase::isDependOn(SharedBase* shared)
+ {
+ for (std::pair<int, SharedBase*> dep : mDependencies)
+ {
+ if (dep.second == shared)
+ return true;
+ }
+ return false;
+ }
+
+ void SharedBase::clearDependencies()
+ {
+ for (std::pair<int, SharedBase*> dep : mDependencies)
+ dep.second->release();
+ mDependencies.clear();
+ }
+
+ SharedBase* SharedBase::getDependency(int key)
+ {
+ if (!isDependOn(key))
+ return nullptr;
+ return mDependencies.find(key)->second;
+ }
+
+ bool SharedBase::isType(const char* t)
+ {
+ return strcmp(type, t) == 0;
+ }
+
+ int SharedBase::getDependencyCount()
+ {
+ return mDependencies.size();
+ }
+
+
+ }
+} \ No newline at end of file
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;
}