From d483916cc59c0cf17ed48677d8d804be74b267c3 Mon Sep 17 00:00:00 2001 From: maverickdgg Date: Tue, 13 Sep 2022 14:28:32 +0800 Subject: [PATCH] Changed SystemManager to use SystemID map instead of using a string map --- SHADE_Engine/src/ECS_Base/System/SHSystem.h | 1 + .../src/ECS_Base/System/SHSystemManager.cpp | 11 ------ .../src/ECS_Base/System/SHSystemManager.h | 35 ++++++++++++++----- 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/SHADE_Engine/src/ECS_Base/System/SHSystem.h b/SHADE_Engine/src/ECS_Base/System/SHSystem.h index 817b9718..dd84fe64 100644 --- a/SHADE_Engine/src/ECS_Base/System/SHSystem.h +++ b/SHADE_Engine/src/ECS_Base/System/SHSystem.h @@ -55,6 +55,7 @@ namespace SHADE virtual void Exit() = 0; }; + } #endif \ No newline at end of file diff --git a/SHADE_Engine/src/ECS_Base/System/SHSystemManager.cpp b/SHADE_Engine/src/ECS_Base/System/SHSystemManager.cpp index 67d6f781..5b861161 100644 --- a/SHADE_Engine/src/ECS_Base/System/SHSystemManager.cpp +++ b/SHADE_Engine/src/ECS_Base/System/SHSystemManager.cpp @@ -19,17 +19,6 @@ namespace SHADE SHSystemManager::SystemContainer SHSystemManager::systemContainer; - SHSystem* SHSystemManager::GetSystem(std::string name) - { - if (systemContainer.find(name) == systemContainer.end()) - { - assert("Get System Error: No system with such name exist."); - return nullptr; - } - - return systemContainer.find(name)->second.get(); - } - void SHSystemManager::Init() noexcept { for (auto& system : systemContainer) diff --git a/SHADE_Engine/src/ECS_Base/System/SHSystemManager.h b/SHADE_Engine/src/ECS_Base/System/SHSystemManager.h index a81370e9..dada878b 100644 --- a/SHADE_Engine/src/ECS_Base/System/SHSystemManager.h +++ b/SHADE_Engine/src/ECS_Base/System/SHSystemManager.h @@ -19,6 +19,7 @@ #include #include #include +#include #include "../System/SHSystem.h" #include "../General/SHFamily.h" @@ -33,7 +34,7 @@ namespace SHADE class SHSystemManager { //type definition for the container we use to store our system - using SystemContainer = std::unordered_map>; + using SystemContainer = std::unordered_map>; private: static SystemContainer systemContainer; @@ -57,14 +58,18 @@ namespace SHADE * none ***************************************************************************/ template - static std::enable_if_t, void> CreateSystem(std::string const& name) + static std::enable_if_t, void> CreateSystem() { - if (systemContainer.find(name) != systemContainer.end()) - { - assert("System Creation Error: System with the same name already exist."); - } + SystemTypeID typeID = SystemFamily::GetID(); - systemContainer.emplace(name, std::make_unique()); + SystemVersionID version = 0; + SystemID id = ((SystemID)version << sizeof(SystemVersionID) * CHAR_BIT) + typeID; + while (systemContainer.find(id) != systemContainer.end()) + { + ++version; + SystemID id = ((SystemID)version << sizeof(SystemVersionID) * CHAR_BIT) + typeID; + } + systemContainer.emplace(id, std::make_unique()); } @@ -77,7 +82,21 @@ namespace SHADE * \return * Base System pointer. ***************************************************************************/ - static SHSystem* GetSystem(std::string name); + template + static std::enable_if_t, T*> GetSystem(SystemVersionID version = 0) + { + SystemTypeID typeID = SystemFamily::GetID(); + + SystemID id = ((SystemID)version << sizeof(SystemVersionID) * CHAR_BIT) + typeID; + + if (systemContainer.find(id) == systemContainer.end()) + { + std::cout << "System Manager error: System Version " << version << " does not exit." << std::endl; + return nullptr; + } + + return (T*)systemContainer.find(id)->second.get(); + } /************************************************************************** * \brief