2#include "gaia/config/config.h"
6#include "gaia/cnt/map.h"
7#include "gaia/ecs/api.h"
8#include "gaia/ecs/archetype_common.h"
9#include "gaia/ecs/component.h"
10#include "gaia/ecs/id.h"
11#include "gaia/util/logging.h"
17 using ArchetypeGraphEdge = ArchetypeIdHashPair;
29#if GAIA_ASSERT_ENABLED
33#if GAIA_ASSERT_ENABLED
37 GAIA_ASSERT(it != edges.end());
38 GAIA_ASSERT(it->second.id == archetypeId);
39 GAIA_ASSERT(it->second.hash == hash);
50 return it != edges.end() ? it->second : ArchetypeIdHashPairBad;
59 add_edge(m_edgesAdd, entity, archetypeId, hash);
67 add_edge(m_edgesDel, entity, archetypeId, hash);
73 del_edge(m_edgesAdd, entity);
79 del_edge(m_edgesDel, entity);
86 return find_edge(m_edgesAdd, entity);
93 return find_edge(m_edgesDel, entity);
96 GAIA_NODISCARD
auto& right_edges() {
100 GAIA_NODISCARD
const auto& right_edges()
const {
104 GAIA_NODISCARD
auto& left_edges() {
108 GAIA_NODISCARD
const auto& left_edges()
const {
112 void diag(
const World& world)
const {
113 auto diagEdge = [&](
const auto& edges) {
114 for (
const auto& edge: edges) {
115 const auto entity = edge.first.entity();
117 const auto* name0 = entity_name(world, entity.id());
118 const auto* name1 = entity_name(world, entity.gen());
120 " pair [%u:%u], %s -> %s, aid:%u",
122 entity.id(), entity.gen(), name0, name1, edge.second.id);
124 const auto* name = entity_name(world, entity);
126 " ent [%u:%u], %s [%s], aid:%u",
128 entity.id(), entity.gen(), name, EntityKindString[entity.kind()], edge.second.id);
134 if (!m_edgesAdd.empty()) {
135 GAIA_LOG_N(
" Add edges - count:%u", (uint32_t)m_edgesAdd.size());
136 diagEdge(m_edgesAdd);
140 if (!m_edgesDel.empty()) {
141 GAIA_LOG_N(
" Del edges - count:%u", (uint32_t)m_edgesDel.size());
142 diagEdge(m_edgesDel);
Definition archetype_graph.h:19
void add_edge_right(Entity entity, ArchetypeId archetypeId, ArchetypeIdHash hash)
Creates an "add" edge in the graph leading to the target archetype.
Definition archetype_graph.h:58
GAIA_NODISCARD ArchetypeGraphEdge find_edge_left(Entity entity) const
Checks if an archetype graph "del" edge with entity entity exists.
Definition archetype_graph.h:92
void del_edge_left(Entity entity)
Deletes the "del" edge formed by the entity entity.
Definition archetype_graph.h:78
GAIA_NODISCARD ArchetypeGraphEdge find_edge_right(Entity entity) const
Checks if an archetype graph "add" edge with entity entity exists.
Definition archetype_graph.h:85
void del_edge_right(Entity entity)
Deletes the "add" edge formed by the entity entity.
Definition archetype_graph.h:72
void add_edge_left(Entity entity, ArchetypeId archetypeId, ArchetypeIdHash hash)
Creates a "del" edge in the graph leading to the target archetype.
Definition archetype_graph.h:66
Definition robin_hood.h:720
Checks if endianess was detected correctly at compile-time.
Definition bitset.h:9
Definition archetype_common.h:18
Hashmap lookup structure used for Entity.
Definition id.h:336