summary refs log tree commit diff stats
path: root/src/system_manager.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/system_manager.h')
-rw-r--r--src/system_manager.h43
1 files changed, 25 insertions, 18 deletions
diff --git a/src/system_manager.h b/src/system_manager.h index 087b71c..e2c98cb 100644 --- a/src/system_manager.h +++ b/src/system_manager.h
@@ -5,33 +5,40 @@
5#include <memory> 5#include <memory>
6#include <map> 6#include <map>
7#include <typeindex> 7#include <typeindex>
8#include <stdexcept>
8#include "system.h" 9#include "system.h"
9 10
10class SystemManager { 11class SystemManager {
11 private: 12private:
12 std::list<std::unique_ptr<System>> loop;
13 std::map<std::type_index, System*> systems;
14 13
15 public: 14 std::list<std::unique_ptr<System>> loop;
16 template <class T, class... Args> 15 std::map<std::type_index, System*> systems;
17 void emplaceSystem(Game& game, Args&&... args)
18 {
19 std::unique_ptr<T> ptr = std::unique_ptr<T>(new T(game, std::forward<Args>(args)...));
20 std::type_index systemType = typeid(T);
21 16
22 systems[systemType] = ptr.get(); 17public:
23 loop.push_back(std::move(ptr));
24 }
25 18
26 template <class T> 19 template <class T, class... Args>
27 T& getSystem() 20 void emplaceSystem(Game& game, Args&&... args)
28 { 21 {
29 std::type_index systemType = typeid(T); 22 std::unique_ptr<T> ptr(new T(game, std::forward<Args>(args)...));
23 std::type_index systemType = typeid(T);
24
25 systems[systemType] = ptr.get();
26 loop.push_back(std::move(ptr));
27 }
30 28
31 assert(systems.count(systemType) == 1); 29 template <class T>
30 T& getSystem()
31 {
32 std::type_index systemType = typeid(T);
32 33
33 return *((T*)systems[systemType]); 34 if (!systems.count(systemType))
35 {
36 throw std::invalid_argument("Cannot get non-existent system");
34 } 37 }
38
39 return *dynamic_cast<T*>(systems[systemType]);
40 }
41
35}; 42};
36 43
37#endif /* end of include guard: SYSTEM_MANAGER_H_544E6056 */ 44#endif /* end of include guard: SYSTEM_MANAGER_H_544E6056 */