3#include "gaia/config/config.h"
7#include "gaia/ecs/id.h"
8#include "gaia/ecs/observer_event.h"
9#include "gaia/ecs/query.h"
10#include "gaia/util/move_func.h"
12#if GAIA_OBSERVERS_ENABLED
19 inline constexpr const char* sc_observer_query_func_str =
"Observer_exec";
20 util::str_view entity_name(
const World& world, Entity entity);
25 struct ObserverContext {
30 Archetype* archetype_prev;
31 uint32_t index_in_chunk;
38 enum class ExecKind : uint8_t { DirectQuery, DirectFast, DiffLocal, DiffPropagated, DiffFallback };
39 enum class FastPath : uint8_t { None, SinglePositiveTerm, SingleNegativeTerm, Disabled };
40 using TObserverIterFunc = util::MoveFunc<void(Iter&)>;
43 enum class DispatchKind : uint8_t { LocalTargets, PropagatedTraversal, GlobalFallback };
46 Entity bindingVar = EntityBad;
48 Entity bindingRelation = EntityBad;
50 Entity traversalRelation = EntityBad;
53 DispatchKind dispatchKind = DispatchKind::LocalTargets;
55 QueryTravKind travKind = QueryTravKind::None;
59 uint8_t travDepth = QueryTermOptions::TravDepthUnlimited;
61 QueryEntityArray traversalTriggerTerms{};
63 uint8_t traversalTriggerTermCount = 0;
65 QueryEntityArray traversalRelations{};
67 uint8_t traversalRelationCount = 0;
71 FastPath fastPath = FastPath::None;
73 uint8_t termCount = 0;
75 bool hasNegativeTerm =
false;
77 bool monitorsQuery =
false;
79 ExecKind execKind = ExecKind::DirectQuery;
83 void refresh_exec_kind() {
84 if (monitorsQuery || diff.enabled) {
85 switch (diff.dispatchKind) {
86 case DiffPlan::DispatchKind::LocalTargets:
87 execKind = ExecKind::DiffLocal;
89 case DiffPlan::DispatchKind::PropagatedTraversal:
90 execKind = ExecKind::DiffPropagated;
92 case DiffPlan::DispatchKind::GlobalFallback:
93 execKind = ExecKind::DiffFallback;
96 }
else if (fastPath == FastPath::SinglePositiveTerm || fastPath == FastPath::SingleNegativeTerm)
97 execKind = ExecKind::DirectFast;
99 execKind = ExecKind::DirectQuery;
102 GAIA_NODISCARD ExecKind exec_kind()
const {
106 GAIA_NODISCARD
bool uses_diff_dispatch()
const {
107 switch (exec_kind()) {
108 case ExecKind::DiffLocal:
109 case ExecKind::DiffPropagated:
110 case ExecKind::DiffFallback:
112 case ExecKind::DirectQuery:
113 case ExecKind::DirectFast:
120 GAIA_NODISCARD
bool uses_direct_dispatch()
const {
121 return !uses_diff_dispatch();
124 GAIA_NODISCARD
bool uses_local_diff_targets()
const {
125 return exec_kind() == ExecKind::DiffLocal;
128 GAIA_NODISCARD
bool uses_propagated_diff_targets()
const {
129 return exec_kind() == ExecKind::DiffPropagated;
132 GAIA_NODISCARD
bool uses_fallback_diff_dispatch()
const {
133 return exec_kind() == ExecKind::DiffFallback;
136 GAIA_NODISCARD
bool is_fast_positive()
const {
137 return fastPath == FastPath::SinglePositiveTerm;
140 GAIA_NODISCARD
bool is_fast_negative()
const {
141 return fastPath == FastPath::SingleNegativeTerm;
147 void add_term_desc(QueryOpKind op,
bool allowFastPath) {
149 hasNegativeTerm |= op == QueryOpKind::Not;
151 if (!allowFastPath) {
152 fastPath = FastPath::Disabled;
156 if (fastPath == FastPath::Disabled)
159 if (termCount != 1) {
160 fastPath = FastPath::Disabled;
165 case QueryOpKind::All:
166 case QueryOpKind::Any:
167 case QueryOpKind::Or:
168 fastPath = FastPath::SinglePositiveTerm;
170 case QueryOpKind::Not:
171 fastPath = FastPath::SingleNegativeTerm;
174 fastPath = FastPath::Disabled;
183 struct ObserverRuntimeData {
184 using TObserverIterFunc = util::MoveFunc<void(Iter&)>;
186 ObserverRuntimeData() {
187 GAIA_FOR(MAX_ITEMS_IN_QUERY) {
188 queryTermIds[i] = EntityBad;
193 Entity entity = EntityBad;
195 TObserverIterFunc on_each_func;
201 QueryEntityArray queryTermIds{};
203 QueryOpKind queryTermOps[MAX_ITEMS_IN_QUERY]{};
205 QueryMatchKind queryTermMatchKinds[MAX_ITEMS_IN_QUERY]{};
207 uint64_t lastMatchStamp = 0;
213 void exec(Iter& iter, EntitySpan targets, ObserverEvent reportedEvent);
219 Entity entity = EntityBad;
221 ObserverEvent
event = ObserverEvent::OnAdd;
223 bool monitorsQuery =
false;
226 template <
typename Serializer>
227 void save(Serializer& s)
const {
231 template <
typename Serializer>
232 void load(Serializer& s) {
void load(Reader &reader, T &data)
Read data using Reader at compile-time.
Definition ser_ct.h:112
void save(Writer &writer, const T &data)
Write data using Writer at compile-time.
Definition ser_ct.h:101
Definition observer.h:242