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.h37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/system_manager.h b/src/system_manager.h new file mode 100644 index 0000000..8f76db2 --- /dev/null +++ b/src/system_manager.h
@@ -0,0 +1,37 @@
1#ifndef SYSTEM_MANAGER_H_544E6056
2#define SYSTEM_MANAGER_H_544E6056
3
4#include <list>
5#include <memory>
6#include <map>
7#include <typeindex>
8#include "system.h"
9
10class SystemManager {
11 private:
12 std::list<std::unique_ptr<System>> loop;
13 std::map<std::type_index, System*> systems;
14
15 public:
16 template <class T, class... Args>
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
22 systems[systemType] = ptr.get();
23 loop.push_back(std::move(ptr));
24 }
25
26 template <class T>
27 T& getSystem()
28 {
29 std::type_index systemType = typeid(T);
30
31 assert(systems.count(systemType) == 1);
32
33 return *((T*)systems[systemType]);
34 }
35};
36
37#endif /* end of include guard: SYSTEM_MANAGER_H_544E6056 */