Gaia-ECS v0.9.3
A simple and powerful entity component system
Loading...
Searching...
No Matches
system.h
1#pragma once
2#include "gaia/config/config.h"
3
4#include "gaia/cnt/map.h"
5#include "gaia/ecs/id.h"
6#include "gaia/ecs/query.h"
7#include "gaia/util/move_func.h"
8
9#if GAIA_SYSTEMS_ENABLED
10namespace gaia {
11 namespace ecs {
18 struct SystemRuntimeData {
20 enum class RunMode {
22 Immediate,
24 DeferredJob
25 };
26
36 using TSystemRunFunc = util::MoveFunc<SchedJob(Query&, QueryExecType, RunMode)>;
37
39 TSystemRunFunc on_each_func;
40 };
41
47 class SystemRegistry {
48 cnt::map<EntityLookupKey, SystemRuntimeData> m_system_data;
49
50 public:
55 void teardown() {
56 for (auto& it: m_system_data) {
57 it.second.on_each_func = {};
58 }
59
60 m_system_data = {};
61 }
62
66 SystemRuntimeData& data_add(Entity system) {
67 return m_system_data[EntityLookupKey(system)];
68 }
69
73 GAIA_NODISCARD SystemRuntimeData* data_try(Entity system) {
74 const auto it = m_system_data.find(EntityLookupKey(system));
75 if (it == m_system_data.end())
76 return nullptr;
77 return &it->second;
78 }
79
83 GAIA_NODISCARD const SystemRuntimeData* data_try(Entity system) const {
84 const auto it = m_system_data.find(EntityLookupKey(system));
85 if (it == m_system_data.end())
86 return nullptr;
87 return &it->second;
88 }
89
94 GAIA_NODISCARD SystemRuntimeData& data(Entity system) {
95 auto* pData = data_try(system);
96 GAIA_ASSERT(pData != nullptr);
97 return *pData;
98 }
99
104 GAIA_NODISCARD const SystemRuntimeData& data(Entity system) const {
105 const auto* pData = data_try(system);
106 GAIA_ASSERT(pData != nullptr);
107 return *pData;
108 }
109
115 void del(Entity system) {
116 const auto it = m_system_data.find(EntityLookupKey(system));
117 if (it == m_system_data.end())
118 return;
119
120 it->second.on_each_func = {};
121 m_system_data.erase(it);
122 }
123 };
124 } // namespace ecs
125} // namespace gaia
126#endif
Checks if endianess was detected correctly at compile-time.
Definition bitset.h:9