diff options
Diffstat (limited to 'src/lua/common')
-rw-r--r-- | src/lua/common/je_lua.cpp | 16 | ||||
-rw-r--r-- | src/lua/common/je_lua.h | 15 | ||||
-rw-r--r-- | src/lua/common/je_lua_proxy.cpp | 32 | ||||
-rw-r--r-- | src/lua/common/je_lua_proxy.h | 27 | ||||
-rw-r--r-- | src/lua/common/je_lua_shared.cpp | 94 | ||||
-rw-r--r-- | src/lua/common/je_lua_shared.hpp | 98 |
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; } |