Merge branch 'fun-with-interfaces' into develop

This commit is contained in:
Kayne Ruse
2014-10-07 02:10:23 +11:00
14 changed files with 254 additions and 166 deletions
+18 -16
View File
@@ -87,13 +87,13 @@ int AccountManager::Load(std::string username, int clientIndex) {
int uid = sqlite3_column_int(statement, 0); int uid = sqlite3_column_int(statement, 0);
//check to see if this account is already loaded //check to see if this account is already loaded
if (accountMap.find(uid) != accountMap.end()) { if (elementMap.find(uid) != elementMap.end()) {
sqlite3_finalize(statement); sqlite3_finalize(statement);
return -1; return -1;
} }
//extract the data into memory //extract the data into memory
AccountData& newAccount = accountMap[uid]; AccountData& newAccount = elementMap[uid];
newAccount.username = reinterpret_cast<const char*>(sqlite3_column_text(statement, 1)); newAccount.username = reinterpret_cast<const char*>(sqlite3_column_text(statement, 1));
newAccount.blackListed = sqlite3_column_int(statement, 2); newAccount.blackListed = sqlite3_column_int(statement, 2);
newAccount.whiteListed = sqlite3_column_int(statement, 3); newAccount.whiteListed = sqlite3_column_int(statement, 3);
@@ -121,11 +121,11 @@ int AccountManager::Save(int uid) {
//DOCS: To use this method, change the in-memory copy, and then call this function using that object's UID. //DOCS: To use this method, change the in-memory copy, and then call this function using that object's UID.
//this method fails if this account is not loaded //this method fails if this account is not loaded
if (accountMap.find(uid) == accountMap.end()) { if (elementMap.find(uid) == elementMap.end()) {
return -1; return -1;
} }
AccountData& account = accountMap[uid]; AccountData& account = elementMap[uid];
sqlite3_stmt* statement = nullptr; sqlite3_stmt* statement = nullptr;
//prep //prep
@@ -163,7 +163,7 @@ void AccountManager::Unload(int uid) {
//save this user account, and then unload it //save this user account, and then unload it
//NOTE: the associated characters are unloaded externally //NOTE: the associated characters are unloaded externally
Save(uid); Save(uid);
accountMap.erase(uid); elementMap.erase(uid);
} }
void AccountManager::Delete(int uid) { void AccountManager::Delete(int uid) {
@@ -190,27 +190,29 @@ void AccountManager::Delete(int uid) {
//finish the routine //finish the routine
sqlite3_finalize(statement); sqlite3_finalize(statement);
accountMap.erase(uid); elementMap.erase(uid);
} }
void AccountManager::UnloadAll() { void AccountManager::UnloadAll() {
for (auto& it : accountMap) { for (auto& it : elementMap) {
Save(it.first); Save(it.first);
} }
accountMap.clear(); elementMap.clear();
} }
void AccountManager::UnloadIf(std::function<bool(std::pair<int, AccountData>)> fn) { void AccountManager::UnloadIf(std::function<bool(std::pair<const int, AccountData>)> fn) {
//replicate std::remove_if, using custom code //replicate std::remove_if, using custom code
for (std::map<int, AccountData>::iterator it = accountMap.begin(); it != accountMap.end(); /* empty */) { std::map<int, AccountData>::iterator it = elementMap.begin();
while (it != elementMap.end()) {
if (fn(*it)) { if (fn(*it)) {
Save(it->first); Save(it->first);
it = accountMap.erase(it); it = elementMap.erase(it);
continue;
} }
else {
++it; ++it;
} }
} }
}
//------------------------- //-------------------------
//Define the accessors and mutators //Define the accessors and mutators
@@ -218,9 +220,9 @@ void AccountManager::UnloadIf(std::function<bool(std::pair<int, AccountData>)> f
AccountData* AccountManager::Get(int uid) { AccountData* AccountManager::Get(int uid) {
//TODO: could this load an account first? //TODO: could this load an account first?
std::map<int, AccountData>::iterator it = accountMap.find(uid); std::map<int, AccountData>::iterator it = elementMap.find(uid);
if (it == accountMap.end()) { if (it == elementMap.end()) {
return nullptr; return nullptr;
} }
@@ -228,7 +230,7 @@ AccountData* AccountManager::Get(int uid) {
} }
int AccountManager::GetLoadedCount() { int AccountManager::GetLoadedCount() {
return accountMap.size(); return elementMap.size();
} }
int AccountManager::GetTotalCount() { int AccountManager::GetTotalCount() {
@@ -250,7 +252,7 @@ int AccountManager::GetTotalCount() {
} }
std::map<int, AccountData>* AccountManager::GetContainer() { std::map<int, AccountData>* AccountManager::GetContainer() {
return &accountMap; return &elementMap;
} }
sqlite3* AccountManager::SetDatabase(sqlite3* db) { sqlite3* AccountManager::SetDatabase(sqlite3* db) {
+17 -14
View File
@@ -24,29 +24,33 @@
#include "account_data.hpp" #include "account_data.hpp"
#include "singleton.hpp" #include "singleton.hpp"
#include "manager_interface.hpp"
#include "sqlite3/sqlite3.h" #include "sqlite3/sqlite3.h"
#include <functional> #include <functional>
#include <map> #include <map>
class AccountManager : public Singleton<AccountManager> { class AccountManager:
public Singleton<AccountManager>,
public ManagerInterface<AccountData, std::string, int>
{
public: public:
//public access methods //common public methods
int Create(std::string username, int clientIndex); int Create(std::string username, int clientIndex) override;
int Load(std::string username, int clientIndex); int Load(std::string username, int clientIndex) override;
int Save(int uid); int Save(int uid) override;
void Unload(int uid); void Unload(int uid) override;
void Delete(int uid); void Delete(int uid) override;
void UnloadAll(); void UnloadAll() override;
void UnloadIf(std::function<bool(std::pair<int, AccountData>)> fn); void UnloadIf(std::function<bool(std::pair<const int, AccountData>)> fn) override;
//accessors and mutators //accessors and mutators
AccountData* Get(int uid); AccountData* Get(int uid) override;
int GetLoadedCount(); int GetLoadedCount() override;
int GetTotalCount(); int GetTotalCount() override;
std::map<int, AccountData>* GetContainer(); std::map<int, AccountData>* GetContainer() override;
sqlite3* SetDatabase(sqlite3* db); sqlite3* SetDatabase(sqlite3* db);
sqlite3* GetDatabase(); sqlite3* GetDatabase();
@@ -57,7 +61,6 @@ private:
AccountManager() = default; AccountManager() = default;
~AccountManager() = default; ~AccountManager() = default;
std::map<int, AccountData> accountMap;
sqlite3* database = nullptr; sqlite3* database = nullptr;
}; };
+1 -1
View File
@@ -1,5 +1,5 @@
#config #config
INCLUDES+=. ../../common/utilities INCLUDES+=. ../server_utilities ../../common/utilities
LIBS+= LIBS+=
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
+18 -17
View File
@@ -98,7 +98,7 @@ int CharacterManager::Load(int owner, std::string handle, std::string avatar) {
int uid = sqlite3_column_int(statement, 0); int uid = sqlite3_column_int(statement, 0);
//check to see if this character is already loaded //check to see if this character is already loaded
if (characterMap.find(uid) != characterMap.end()) { if (elementMap.find(uid) != elementMap.end()) {
sqlite3_finalize(statement); sqlite3_finalize(statement);
return -1; return -1;
} }
@@ -110,7 +110,7 @@ int CharacterManager::Load(int owner, std::string handle, std::string avatar) {
} }
//extract the data into memory //extract the data into memory
CharacterData& newChar = characterMap[uid]; CharacterData& newChar = elementMap[uid];
//metadata //metadata
newChar.owner = owner; newChar.owner = owner;
@@ -145,11 +145,11 @@ int CharacterManager::Save(int uid) {
//DOCS: To use this method, change the in-memory copy, and then call this function using that object's UID. //DOCS: To use this method, change the in-memory copy, and then call this function using that object's UID.
//this method fails if this character is not loaded //this method fails if this character is not loaded
if (characterMap.find(uid) == characterMap.end()) { if (elementMap.find(uid) == elementMap.end()) {
return -1; return -1;
} }
CharacterData& character = characterMap[uid]; CharacterData& character = elementMap[uid];
sqlite3_stmt* statement = nullptr; sqlite3_stmt* statement = nullptr;
//prep //prep
@@ -187,7 +187,7 @@ int CharacterManager::Save(int uid) {
void CharacterManager::Unload(int uid) { void CharacterManager::Unload(int uid) {
//save this character, then unload it //save this character, then unload it
Save(uid); Save(uid);
characterMap.erase(uid); elementMap.erase(uid);
} }
void CharacterManager::Delete(int uid) { void CharacterManager::Delete(int uid) {
@@ -213,36 +213,37 @@ void CharacterManager::Delete(int uid) {
//finish the routine //finish the routine
sqlite3_finalize(statement); sqlite3_finalize(statement);
characterMap.erase(uid); elementMap.erase(uid);
} }
void CharacterManager::UnloadAll() { void CharacterManager::UnloadAll() {
for (auto& it : characterMap) { for (auto& it : elementMap) {
Save(it.first); Save(it.first);
} }
characterMap.clear(); elementMap.clear();
} }
void CharacterManager::UnloadIf(std::function<bool(std::pair<int, CharacterData>)> fn) { void CharacterManager::UnloadIf(std::function<bool(std::pair<const int, CharacterData>)> fn) {
//replicate std::remove_if, using custom code std::map<int, CharacterData>::iterator it = elementMap.begin();
for (std::map<int, CharacterData>::iterator it = characterMap.begin(); it != characterMap.end(); /* empty */) { while (it != elementMap.end()) {
if (fn(*it)) { if (fn(*it)) {
Save(it->first); Save(it->first);
it = characterMap.erase(it); it = elementMap.erase(it);
continue;
} }
else {
++it; ++it;
} }
} }
}
//------------------------- //-------------------------
//Define the accessors and mutators //Define the accessors and mutators
//------------------------- //-------------------------
CharacterData* CharacterManager::Get(int uid) { CharacterData* CharacterManager::Get(int uid) {
std::map<int, CharacterData>::iterator it = characterMap.find(uid); std::map<int, CharacterData>::iterator it = elementMap.find(uid);
if (it == characterMap.end()) { if (it == elementMap.end()) {
return nullptr; return nullptr;
} }
@@ -250,7 +251,7 @@ CharacterData* CharacterManager::Get(int uid) {
} }
int CharacterManager::GetLoadedCount() { int CharacterManager::GetLoadedCount() {
return characterMap.size(); return elementMap.size();
} }
int CharacterManager::GetTotalCount() { int CharacterManager::GetTotalCount() {
@@ -272,7 +273,7 @@ int CharacterManager::GetTotalCount() {
} }
std::map<int, CharacterData>* CharacterManager::GetContainer() { std::map<int, CharacterData>* CharacterManager::GetContainer() {
return &characterMap; return &elementMap;
} }
sqlite3* CharacterManager::SetDatabase(sqlite3* db) { sqlite3* CharacterManager::SetDatabase(sqlite3* db) {
+17 -14
View File
@@ -24,29 +24,33 @@
#include "character_data.hpp" #include "character_data.hpp"
#include "singleton.hpp" #include "singleton.hpp"
#include "manager_interface.hpp"
#include "sqlite3/sqlite3.h" #include "sqlite3/sqlite3.h"
#include <functional> #include <functional>
#include <map> #include <map>
class CharacterManager : public Singleton<CharacterManager> { class CharacterManager:
public Singleton<CharacterManager>,
public ManagerInterface<CharacterData, int, std::string, std::string>
{
public: public:
//public access methods //common public methods
int Create(int owner, std::string handle, std::string avatar); int Create(int owner, std::string handle, std::string avatar) override;
int Load(int owner, std::string handle, std::string avatar); int Load(int owner, std::string handle, std::string avatar) override;
int Save(int uid); int Save(int uid) override;
void Unload(int uid); void Unload(int uid) override;
void Delete(int uid); void Delete(int uid) override;
void UnloadAll(); void UnloadAll() override;
void UnloadIf(std::function<bool(std::pair<int, CharacterData>)> fn); void UnloadIf(std::function<bool(std::pair<const int, CharacterData>)> fn) override;
//accessors and mutators //accessors and mutators
CharacterData* Get(int uid); CharacterData* Get(int uid) override;
int GetLoadedCount(); int GetLoadedCount() override;
int GetTotalCount(); int GetTotalCount() override;
std::map<int, CharacterData>* GetContainer(); std::map<int, CharacterData>* GetContainer() override;
sqlite3* SetDatabase(sqlite3* db); sqlite3* SetDatabase(sqlite3* db);
sqlite3* GetDatabase(); sqlite3* GetDatabase();
@@ -57,7 +61,6 @@ private:
CharacterManager() = default; CharacterManager() = default;
~CharacterManager() = default; ~CharacterManager() = default;
std::map<int, CharacterData> characterMap;
sqlite3* database = nullptr; sqlite3* database = nullptr;
}; };
+1 -1
View File
@@ -1,5 +1,5 @@
#config #config
INCLUDES+=. ../../common/gameplay ../../common/utilities INCLUDES+=. ../server_utilities ../../common/gameplay ../../common/utilities
LIBS+= LIBS+=
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
+1 -1
View File
@@ -1,5 +1,5 @@
#config #config
INCLUDES+=. ../../common/map ../../common/utilities INCLUDES+=. ../server_utilities ../../common/map ../../common/utilities
LIBS+= LIBS+=
CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES))
+22 -7
View File
@@ -29,21 +29,36 @@ static int getPager(lua_State* L) {
return 1; return 1;
} }
static int create(lua_State* L) { static int setRoomName(lua_State* L) {
//EMPTY RoomData* room = reinterpret_cast<RoomData*>(lua_touserdata(L, 1));
//NOTE: This can be used to set defaults for the pager room->SetRoomName(lua_tostring(L, 2));
return 0; return 0;
} }
static int unload(lua_State* L) { static int getRoomName(lua_State* L) {
//EMPTY RoomData* room = reinterpret_cast<RoomData*>(lua_touserdata(L, 1));
lua_pushstring(L, room->GetRoomName().c_str());
return 1;
}
static int setTilesetName(lua_State* L) {
RoomData* room = reinterpret_cast<RoomData*>(lua_touserdata(L, 1));
room->SetTilesetName(lua_tostring(L, 2));
return 0; return 0;
} }
static int getTilesetName(lua_State* L) {
RoomData* room = reinterpret_cast<RoomData*>(lua_touserdata(L, 1));
lua_pushstring(L, room->GetTilesetName().c_str());
return 1;
}
static const luaL_Reg roomLib[] = { static const luaL_Reg roomLib[] = {
{"GetPager",getPager}, {"GetPager",getPager},
{"Create", create}, {"SetRoomName", setRoomName},
{"Unload", unload}, {"GetRoomName", getRoomName},
{"SetTileset", setTilesetName},
{"GetTileset", getTilesetName},
{nullptr, nullptr} {nullptr, nullptr}
}; };
+6
View File
@@ -35,6 +35,9 @@ public:
//accessors and mutators //accessors and mutators
RegionPagerLua* GetPager() { return &pager; } RegionPagerLua* GetPager() { return &pager; }
std::string SetRoomName(std::string s) { return roomName = s; }
std::string GetRoomName() { return roomName; }
std::string SetTilesetName(std::string s) { return tilesetName = s; } std::string SetTilesetName(std::string s) { return tilesetName = s; }
std::string GetTilesetName() { return tilesetName; } std::string GetTilesetName() { return tilesetName; }
@@ -43,7 +46,10 @@ private:
//members //members
RegionPagerLua pager; RegionPagerLua pager;
std::string roomName;
std::string tilesetName; std::string tilesetName;
//TODO: pass the room name & tileset name to the clients
//TODO: lua references i.e. create, unload, etc.
}; };
#endif #endif
+52 -54
View File
@@ -29,78 +29,76 @@
//public access methods //public access methods
//------------------------- //-------------------------
int RoomManager::CreateRoom() { int RoomManager::Create() {
//create the room //create the room
RoomData* newRoom = new RoomData(); RoomData* newRoom = &elementMap[counter]; //implicitly constructs the element
newRoom->pager.SetLuaState(luaState); newRoom->pager.SetLuaState(lua);
//register the room
roomMap[counter] = newRoom;
//API hook
lua_getglobal(luaState, TORTUGA_ROOM_NAME);
lua_getfield(luaState, -1, "Create");
lua_pushlightuserdata(luaState, newRoom);
if (lua_pcall(luaState, 1, 0, 0) != LUA_OK) {
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(luaState, -1) ));
}
lua_pop(luaState, 1);
//finish the routine //finish the routine
return counter++; return counter++;
} }
void RoomManager::UnloadRoom(int uid) { int RoomManager::Load() {
//TODO: RoomManager::Load()
return -1;
}
int RoomManager::Save(int uid) {
//TODO: RoomManager::Save(uid)
return -1;
}
void RoomManager::Unload(int uid) {
//find the room //find the room
RoomData* room = FindRoom(uid); std::map<int, RoomData>::iterator it = elementMap.find(uid);
if (!room) { if (it == elementMap.end()) {
return; return;
} }
//API hook
lua_getglobal(luaState, TORTUGA_ROOM_NAME);
lua_getfield(luaState, -1, "Unload");
lua_pushlightuserdata(luaState, room);
if (lua_pcall(luaState, 1, 0, 0) != LUA_OK) {
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(luaState, -1) ));
}
lua_pop(luaState, 1);
//free the memory //free the memory
delete room; elementMap.erase(uid);
roomMap.erase(uid);
} }
RoomData* RoomManager::GetRoom(int uid) { void RoomManager::Delete(int uid) {
return FindRoom(uid); //TODO: RoomManager::Delete(int uid)
//TODO: expand this to auto-create the room //NOTE: aliased to RoomManager::Unload(int uid)
} Unload(uid);
RoomData* RoomManager::FindRoom(int uid) {
std::map<int, RoomData*>::iterator it = roomMap.find(uid);
if (it == roomMap.end()) {
return nullptr;
}
return it->second;
}
int RoomManager::PushRoom(RoomData* room) {
roomMap[counter++] = room;
return counter;
} }
void RoomManager::UnloadAll() { void RoomManager::UnloadAll() {
lua_getglobal(luaState, TORTUGA_ROOM_NAME); elementMap.clear();
}
for (auto& it : roomMap) { void RoomManager::UnloadIf(std::function<bool(std::pair<const int,RoomData>)> fn) {
//API hook std::map<int, RoomData>::iterator it = elementMap.begin();
lua_getfield(luaState, -1, "Unload"); while (it != elementMap.end()) {
lua_pushlightuserdata(luaState, it.second); if (fn(*it)) {
if (lua_pcall(luaState, 1, 0, 0) != LUA_OK) { it = elementMap.erase(it);
throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(luaState, -1) )); }
else {
++it;
}
} }
} }
lua_pop(luaState, 1); RoomData* RoomManager::Get(int uid) {
roomMap.clear(); std::map<int, RoomData>::iterator it = elementMap.find(uid);
if (it == elementMap.end()) {
return nullptr;
}
return &it->second;
}
int RoomManager::GetLoadedCount() {
return elementMap.size();
}
int RoomManager::GetTotalCount() {
return elementMap.size();
}
std::map<int, RoomData>* RoomManager::GetContainer() {
return &elementMap;
} }
+21 -16
View File
@@ -24,28 +24,34 @@
#include "room_data.hpp" #include "room_data.hpp"
#include "singleton.hpp" #include "singleton.hpp"
#include "manager_interface.hpp"
#include "lua/lua.hpp" #include "lua/lua.hpp"
#include <map> class RoomManager:
public Singleton<RoomManager>,
class RoomManager : public Singleton<RoomManager> { public ManagerInterface<RoomData>
{
public: public:
//public access methods //common public methods
int CreateRoom(); int Create() override;
void UnloadRoom(int uid); int Load() override;
int Save(int uid) override;
void Unload(int uid) override;
void Delete(int uid) override;
RoomData* GetRoom(int uid); void UnloadAll() override;
RoomData* FindRoom(int uid); void UnloadIf(std::function<bool(std::pair<const int,RoomData>)> fn) override;
int PushRoom(RoomData*);
void UnloadAll();
//accessors and mutators //accessors and mutators
std::map<int, RoomData*>* GetContainer() { return &roomMap; } RoomData* Get(int uid) override;
int GetLoadedCount() override;
int GetTotalCount() override;
std::map<int, RoomData>* GetContainer() override;
lua_State* SetLuaState(lua_State* L) { return luaState = L; } //hooks
lua_State* GetLuaState() { return luaState; } lua_State* SetLuaState(lua_State* L) { return lua = L; }
lua_State* GetLuaState() { return lua; }
private: private:
friend Singleton<RoomManager>; friend Singleton<RoomManager>;
@@ -53,8 +59,7 @@ private:
RoomManager() = default; RoomManager() = default;
~RoomManager() = default; ~RoomManager() = default;
std::map<int, RoomData*> roomMap; lua_State* lua = nullptr;
lua_State* luaState = nullptr;
int counter = 0; int counter = 0;
}; };
+19 -19
View File
@@ -23,32 +23,32 @@
#include "room_manager.hpp" #include "room_manager.hpp"
#include <string> int createRoom(lua_State* L) {
//create & get the room
RoomManager& roomMgr = RoomManager::GetSingleton();
int uid = roomMgr.Create();
RoomData* room = roomMgr.Get(uid);
static int getRoom(lua_State* L) { //setup the room
//find, push and return the room //TODO: room parameters only set via lua, fix this
RoomData* room = RoomManager::GetSingleton().GetRoom(lua_tointeger(L, -2)); room->SetRoomName(lua_tostring(L, 1));
lua_pushlightuserdata(L, reinterpret_cast<void*>(room)); room->SetTilesetName(lua_tostring(L, 2));
return 1;
//return room, uid
lua_pushlightuserdata(L, static_cast<void*>(room));
lua_pushinteger(L, uid);
return 2;
} }
static int createRoom(lua_State* L) { int unloadRoom(lua_State* L) {
//TODO: check parameter count for the glue functions //TODO: check authorization for room deletion
RoomManager& roomMgr = RoomManager::GetSingleton();
//create, find and return the room roomMgr.Unload(lua_tointeger(L, 1));
int uid = RoomManager::GetSingleton().CreateRoom();
lua_pushlightuserdata(L, RoomManager::GetSingleton().FindRoom(uid));
return 1;
}
static int unloadRoom(lua_State* L) {
//unload the specified room
RoomManager::GetSingleton().UnloadRoom(lua_tointeger(L, -2));
return 0; return 0;
} }
static const luaL_Reg roomManagerLib[] = { static const luaL_Reg roomManagerLib[] = {
{"GetRoom",getRoom},
{"CreateRoom", createRoom}, {"CreateRoom", createRoom},
{"UnloadRoom", unloadRoom}, {"UnloadRoom", unloadRoom},
{nullptr, nullptr} {nullptr, nullptr}
+1 -1
View File
@@ -161,7 +161,7 @@ void ServerApplication::HandleRegionRequest(RegionPacket* const argPacket) {
newPacket.y = argPacket->y; newPacket.y = argPacket->y;
//BUG: possibly related to #35 //BUG: possibly related to #35
newPacket.region = roomMgr.GetRoom(argPacket->roomIndex)->GetPager()->GetRegion(argPacket->x, argPacket->y); newPacket.region = roomMgr.Get(argPacket->roomIndex)->GetPager()->GetRegion(argPacket->x, argPacket->y);
//send the content //send the content
network.SendTo(argPacket->srcAddress, static_cast<SerialPacket*>(&newPacket)); network.SendTo(argPacket->srcAddress, static_cast<SerialPacket*>(&newPacket));
@@ -0,0 +1,55 @@
/* Copyright: (c) Kayne Ruse 2014
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*/
#ifndef MANAGERINTERFACE_HPP_
#define MANAGERINTERFACE_HPP_
#include <functional>
#include <map>
template<typename T, typename... Arguments>
class ManagerInterface {
public:
//common public methods
virtual int Create(Arguments... parameters) = 0;
virtual int Load(Arguments... parameters) = 0;
virtual int Save(int uid) = 0;
virtual void Unload(int uid) = 0;
virtual void Delete(int uid) = 0;
virtual void UnloadAll() = 0;
virtual void UnloadIf(std::function<bool(std::pair<const int, T>)> fn) = 0;
//accessors & mutators
virtual T* Get(int uid) = 0;
virtual int GetLoadedCount() = 0;
virtual int GetTotalCount() = 0; //can be an alias of GetLoadedCount()
virtual std::map<int, T>* GetContainer() = 0;
protected:
ManagerInterface() = default;
~ManagerInterface() = default;
//members
std::map<int, T> elementMap;
};
#endif