#ifndef SYSTEM_MANAGER_H_544E6056 #define SYSTEM_MANAGER_H_544E6056 #include #include #include #include #include #include "system.h" class SystemManager { private: std::list> loop; std::map systems; public: template void emplaceSystem(Game& game, Args&&... args) { std::unique_ptr ptr(new T(game, std::forward(args)...)); std::type_index systemType = typeid(T); systems[systemType] = ptr.get(); loop.push_back(std::move(ptr)); } template T& getSystem() { std::type_index systemType = typeid(T); if (!systems.count(systemType)) { throw std::invalid_argument("Cannot get non-existent system"); } return *dynamic_cast(systems[systemType]); } void tick(double dt) { for (std::unique_ptr& sys : loop) { sys->tick(dt); } } virtual void render(Texture& texture) { for (std::unique_ptr& sys : loop) { sys->render(texture); } } virtual void input(int key, int action) { for (std::unique_ptr& sys : loop) { sys->input(key, action); } } }; #endif /* end of include guard: SYSTEM_MANAGER_H_544E6056 */