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::CounterId>("::flecs::metrics::Metric::CounterId");
20 world.entity<metrics::CounterIncrement>("::flecs::metrics::Metric::CounterIncrement");
21 world.entity<metrics::Gauge>("::flecs::metrics::Metric::Gauge");
22}
23
24inline metric_builder::~metric_builder() {
25 if (!m_created) {
26 ecs_metric_init(m_world, &m_desc);
27 }
28}
29
30inline metric_builder& metric_builder::member(const char *name) {
32 if (m_desc.id) {
33 flecs::entity_t type = ecs_get_typeid(m_world, m_desc.id);
34 m = flecs::entity(m_world, type).lookup(name);
35 } else {
36 m = flecs::world(m_world).lookup(name);
37 }
38 if (!m) {
39 flecs::log::err("member '%s' not found", name);
40 }
41 return member(m);
42}
43
44template <typename T>
45inline metric_builder& metric_builder::member(const char *name) {
46 flecs::entity e (m_world, _::cpp_type<T>::id(m_world));
47 flecs::entity_t m = e.lookup(name);
48 if (!m) {
49 flecs::log::err("member '%s' not found in type '%s'",
50 name, e.path().c_str());
51 return *this;
52 }
53 return member(m);
54}
55
56inline metric_builder& metric_builder::dotmember(const char *expr) {
57 m_desc.dotmember = expr;
58 return *this;
59}
60
61template <typename T>
62inline metric_builder& metric_builder::dotmember(const char *expr) {
63 m_desc.dotmember = expr;
64 m_desc.id = _::cpp_type<T>::id(m_world);
65 return *this;
66}
67
68inline metric_builder::operator flecs::entity() {
69 if (!m_created) {
70 m_created = true;
71 flecs::entity result(m_world, ecs_metric_init(m_world, &m_desc));
72 m_desc.entity = result;
73 return result;
74 } else {
75 return flecs::entity(m_world, m_desc.entity);
76 }
77}
78
79template <typename... Args>
80inline flecs::metric_builder world::metric(Args &&... args) const {
81 flecs::entity result(m_world, FLECS_FWD(args)...);
82 return flecs::metric_builder(m_world, result);
83}
84
85template <typename Kind>
86inline untyped_component& untyped_component::metric(
87 flecs::entity_t parent,
88 const char *brief,
89 const char *metric_name)
90{
91 flecs::world w(m_world);
92 flecs::entity e(m_world, m_id);
93
94 const flecs::member_t *m = ecs_cpp_last_member(w, e);
95 if (!m) {
96 return *this;
97 }
98
99 flecs::entity me = w.entity(m->member);
100 flecs::entity metric_entity = me;
101 if (parent) {
102 const char *component_name = e.name();
103 if (!metric_name) {
104 if (ecs_os_strcmp(m->name, "value") || !component_name) {
105 metric_entity = w.scope(parent).entity(m->name);
106 } else {
107 // If name of member is "value", use name of type.
108 char *snake_name = flecs_to_snake_case(component_name);
109 metric_entity = w.scope(parent).entity(snake_name);
110 ecs_os_free(snake_name);
111 }
112 } else {
113 metric_entity = w.scope(parent).entity(metric_name);
114 }
115 }
116
117 w.metric(metric_entity).member(me).kind<Kind>().brief(brief);
118
119 return *this;
120}
121
122}
FLECS_API ecs_entity_t ecs_metric_init(ecs_world_t *world, const ecs_metric_desc_t *desc)
Create a new metric.
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_entity_t ecs_get_typeid(const ecs_world_t *world, ecs_id_t id)
Get the type for an id.
Element type of members vector in EcsStruct.
Definition: meta.h:210
const char * name
Must be set when used with ecs_struct_desc_t.
Definition: meta.h:212
ecs_id_t id
Tracks whether entities have the specified component id.
Definition: metrics.h:89
Self & scope(const Func &func)
The function will be ran with the scope set to the current entity.
Definition: builder.hpp:925
flecs::string_view name() const
Return the entity name.
Definition: entity_view.hpp:78
flecs::entity lookup(const char *path, bool search_path=false) const
Lookup an entity by name.
Definition: impl.hpp:184
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:132
flecs::entity lookup(const char *name, bool search_path=true) const
Lookup entity by name.
Definition: world.hpp:72
flecs::metric_builder metric(Args &&... args) const
Create metric.