Flecs v3.2
A fast entity component system (ECS) for C & C++
Loading...
Searching...
No Matches
impl.hpp
Go to the documentation of this file.
1
6#pragma once
7
8namespace flecs {
9
10namespace _ {
11
12template <typename T>
13ecs_entity_t do_import(world& world, const char *symbol) {
14 ecs_trace("#[magenta]import#[reset] %s", _::type_name<T>());
15 ecs_log_push();
16
17 ecs_entity_t scope = ecs_set_scope(world, 0);
18
19 // Initialize module component type & don't allow it to be registered as a
20 // tag, as this would prevent calling emplace()
21 auto m_c = component<T>(world, nullptr, false);
22 ecs_add_id(world, m_c, EcsModule);
23
24 ecs_set_scope(world, m_c);
25 world.emplace<T>(world);
26 ecs_set_scope(world, scope);
27
28 // It should now be possible to lookup the module
29 ecs_entity_t m = ecs_lookup_symbol(world, symbol, false, false);
30 ecs_assert(m != 0, ECS_MODULE_UNDEFINED, symbol);
31 ecs_assert(m == m_c, ECS_INTERNAL_ERROR, NULL);
32
33 ecs_log_pop();
34
35 return m;
36}
37
38template <typename T>
39flecs::entity import(world& world) {
40 const char *symbol = _::symbol_name<T>();
41
42 ecs_entity_t m = ecs_lookup_symbol(world, symbol, true, false);
43
44 if (!_::cpp_type<T>::registered(world)) {
45
46 /* Module is registered with world, initialize static data */
47 if (m) {
48 _::cpp_type<T>::init(m, false);
49
50 /* Module is not yet registered, register it now */
51 } else {
52 m = _::do_import<T>(world, symbol);
53 }
54
55 /* Module has been registered, but could have been for another world. Import
56 * if module hasn't been registered for this world. */
57 } else if (!m) {
58 m = _::do_import<T>(world, symbol);
59 }
60
61 return flecs::entity(world, m);
62}
63
64}
65
74template <typename Module>
75inline flecs::entity world::module(const char *name) const {
76 flecs::id_t result = _::cpp_type<Module>::id(m_world, nullptr, false);
77 if (name) {
78 ecs_add_path_w_sep(m_world, result, 0, name, "::", "::");
79 }
80 ecs_set_scope(m_world, result);
81 return flecs::entity(m_world, result);
82}
83
84template <typename Module>
86 return flecs::_::import<Module>(*this);
87}
88
91}
void ecs_add_id(ecs_world_t *world, ecs_entity_t entity, ecs_id_t id)
Add a (component) id to an entity.
const ecs_entity_t EcsModule
Tag added to module entities.
#define ecs_assert(condition, error_code,...)
Assert.
Definition log.h:351
ecs_id_t ecs_entity_t
An entity identifier.
Definition flecs.h:318
flecs::entity import()
Import a module.
flecs::entity module(const char *name=nullptr) const
Define a module.
ecs_entity_t ecs_lookup_symbol(const ecs_world_t *world, const char *symbol, bool lookup_as_path, bool recursive)
Lookup an entity by its symbol name.
ecs_entity_t ecs_add_path_w_sep(ecs_world_t *world, ecs_entity_t entity, ecs_entity_t parent, const char *path, const char *sep, const char *prefix)
Add specified path to entity.
ecs_entity_t ecs_set_scope(ecs_world_t *world, ecs_entity_t scope)
Set the current scope.
Entity.
Definition entity.hpp:30