#pragma once #include "System.hpp" #include "Types.hpp" #include #include #include class SystemManager { public: template std::shared_ptr RegisterSystem() { const char* typeName = typeid(T).name(); assert(mSystems.find(typeName) == mSystems.end() && "Registering system more than once."); auto system = std::make_shared(); mSystems.insert({typeName, system}); return system; } template void SetSignature(Signature signature) { const char* typeName = typeid(T).name(); assert(mSystems.find(typeName) != mSystems.end() && "System used before registered."); mSignatures.insert({typeName, signature}); } void EntityDestroyed(Entity entity) { for (auto const& pair : mSystems) { auto const& system = pair.second; system->mEntities.erase(entity); } } void EntitySignatureChanged(Entity entity, Signature entitySignature) { for (auto const& pair : mSystems) { auto const& type = pair.first; auto const& system = pair.second; auto const& systemSignature = mSignatures[type]; if ((entitySignature & systemSignature) == systemSignature) { system->mEntities.insert(entity); } else { system->mEntities.erase(entity); } } } private: std::unordered_map mSignatures{}; std::unordered_map> mSystems{}; };