#pragma once #include "sol/sol.hpp" #include "U_Scripting.h" #include #define TABLE_CACHE_INLINE(_class) _class(std::shared_ptr& s) : CScriptTablesCache(s) {} #define TABLE_CACHE_DECLARE(_class) _class(std::shared_ptr& s); #define TABLE_CACHE_DEFINE(_class) _class::_class(std::shared_ptr& s) : CScriptTablesCache(s) {} template class CScriptTablesCache { public: CScriptTablesCache(std::shared_ptr& s) : State(s) {} virtual ~CScriptTablesCache() {} Value Get(const Key& key) { auto it = Items.find(key); if(it == Items.end()) { Value tabl = State->create_table(); bool succ = m_Create(key, tabl); if(succ) { Items[key] = tabl; } } auto ret = Items.find(key); return (ret != Items.end()) ? ret->second : sol::lua_nil; } void Delete(const Key& key) { Items.erase(key); } bool IsCached(const Key& key) { return Items.find(key) != Items.end(); } sol::object GatedDeleteOrGet(const Key& key, bool gates_opened) { if (gates_opened) { return Get(key); } else if(!gates_opened && IsCached(key)) { Delete(key); } return sol::lua_nil; } virtual bool m_Create(const Key& key, Value tabl) = 0; std::unordered_map Items; std::shared_ptr& State; };