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
10inline metrics::metrics(flecs::world& world) {
11 world.import<flecs::units>();
12
13 /* Import C module */
14 FlecsMetricsImport(world);
15
16 world.entity<metrics::Instance>("::flecs::metrics::Instance");
17 world.entity<metrics::Metric>("::flecs::metrics::Metric");
18 world.entity<metrics::Counter>("::flecs::metrics::Metric::Counter");
19 world.entity<metrics::CounterIncrement>("::flecs::metrics::Metric::CounterIncrement");
20 world.entity<metrics::Gauge>("::flecs::metrics::Metric::Gauge");
21}
22
23inline metric_builder::~metric_builder() {
24 if (!m_created) {
25 ecs_metric_init(m_world, &m_desc);
26 }
27}
28
29inline metric_builder& metric_builder::member(const char *name) {
30 return member(flecs::world(m_world).lookup(name));
31}
32
33template <typename T>
34inline metric_builder& metric_builder::member(const char *name) {
35 flecs::entity e (m_world, _::cpp_type<T>::id(m_world));
36 flecs::entity_t m = e.lookup(name);
37 if (!m) {
38 flecs::log::err("member '%s' not found in type '%s'",
39 name, e.path().c_str());
40 return *this;
41 }
42 return member(m);
43}
44
45inline metric_builder::operator flecs::entity() {
46 if (!m_created) {
47 m_created = true;
48 flecs::entity result(m_world, ecs_metric_init(m_world, &m_desc));
49 m_desc.entity = result;
50 return result;
51 } else {
52 return flecs::entity(m_world, m_desc.entity);
53 }
54}
55
56template <typename... Args>
57inline flecs::metric_builder world::metric(Args &&... args) const {
58 flecs::entity result(m_world, FLECS_FWD(args)...);
59 return flecs::metric_builder(m_world, result);
60}
61
62template <typename Kind>
63inline untyped_component& untyped_component::metric(flecs::entity_t parent, const char *brief) {
64 flecs::world w(m_world);
65 flecs::entity e = w.entity(m_id);
66 const flecs::Struct *s = e.get<flecs::Struct>();
67 if (!s) {
68 flecs::log::err("can't register metric, component '%s' is not a struct",
69 e.path().c_str());
70 return *this;
71 }
72
73 ecs_member_t *m = ecs_vec_get_t(&s->members, ecs_member_t,
74 ecs_vec_count(&s->members) - 1);
75 ecs_assert(m != NULL, ECS_INTERNAL_ERROR, NULL);
76
77 flecs::entity me = e.lookup(m->name);
78 if (!me) {
79 flecs::log::err("can't find member '%s' in component '%s' for metric",
80 m->name, e.path().c_str());
81 return *this;
82 }
83
84 flecs::entity metric_entity = me;
85 if (parent) {
86 metric_entity = w.scope(parent).entity(m->name);
87 }
88 w.metric(metric_entity).member(me).kind<Kind>().brief(brief);
89
90 return *this;
91}
92
93}
#define ecs_assert(condition, error_code,...)
Assert.
Definition: log.h:352
flecs::entity import()
Import a module.
flecs::entity entity(Args &&... args) const
Create an entity.
void err(const char *fmt,...)
Trace (level -3)
Definition: log.hpp:68
ecs_vec_t members
Populated from child entities with Member component.
Definition: meta.h:213
Element type of members vector in EcsStruct.
Definition: meta.h:193
const char * name
Must be set when used with ecs_struct_desc_t.
Definition: meta.h:195
Self & scope(const Func &func)
The function will be ran with the scope set to the current entity.
Definition: builder.hpp:923
const T * get() const
Get component value.
flecs::entity lookup(const char *path) const
Lookup an entity by name.
Definition: impl.hpp:184
flecs::string path(const char *sep="::", const char *init_sep="::") const
Return the entity path.
Definition: entity_view.hpp:94
flecs::entity parent() const
Get parent of entity.
Definition: impl.hpp:73
Entity.
Definition: entity.hpp:30
Event builder interface.
Definition: builder.hpp:18
The world.
Definition: world.hpp:113
flecs::metric_builder metric(Args &&... args) const
Create metric.