#pragma once #include #include #include #include "SystemManager.h" namespace crepe { template T & SystemManager::get_system() { using namespace std; static_assert( is_base_of::value, "get_system must recieve a derivative class of System" ); const type_info & type = typeid(T); if (!this->systems.contains(type)) throw runtime_error(format("SystemManager: {} is not initialized", type.name())); System * system = this->systems.at(type).get(); T * concrete_system = dynamic_cast(system); assert(concrete_system != nullptr); return *concrete_system; } template void SystemManager::load_system() { using namespace std; static_assert( is_base_of::value, "load_system must recieve a derivative class of System" ); const type_info & type = typeid(T); if (this->systems.contains(type)) throw runtime_error(format("SystemManager: {} is already initialized", type.name())); System * system = new T(this->mediator); this->systems[type] = unique_ptr(system); this->system_order.push_back(SystemEntry { .system = *this->systems[type], .name = type.name(), }); } } // namespace crepe