#pragma once #include #include #include #include "../system/System.h" #include "LoopManager.h" namespace crepe { template void LoopManager::add_scene() { this->scene_manager.add_scene(); } template T & LoopManager::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("LoopManager: {} 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 LoopManager::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("LoopManager: {} is already initialized", type.name())); System * system = new T(this->mediator); this->systems[type] = unique_ptr(system); } } // namespace crepe