Flecs v4.0
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
8#include "builder.hpp"
9
10namespace flecs
11{
12
13inline flecs::entity script_builder::run() const {
14 ecs_entity_t e = ecs_script_init(world_, &desc_);
15 return flecs::entity(world_, e);
16}
17
18namespace _ {
19 inline ecs_value_t get_const_var(const flecs::world_t *world, const char *name) {
20 flecs::entity_t v = ecs_lookup_path_w_sep(
21 world, 0, name, "::", "::", false);
22 if (!v) {
23 ecs_warn("unresolved const variable '%s', returning default", name);
24 return {};
25 }
26
27 ecs_value_t value = ecs_const_var_get(world, v);
28 if (value.ptr == nullptr) {
29 ecs_warn("entity '%s' is not a const variable, returning default",
30 name);
31 return {};
32 }
33
34 return value;
35 }
36
37 template <typename T>
38 inline T get_const_value(
39 flecs::world_t *world, const char *name, ecs_value_t value, ecs_entity_t type, const T& default_value)
40 {
41 char *requested_type = ecs_get_path(world, type);
42 char *var_type = ecs_get_path(world, value.type);
43 ecs_warn("cannot cast const variable '%s' from type '%s' to '%s', "
44 "returning default", name, var_type, requested_type);
45 ecs_os_free(requested_type);
46 ecs_os_free(var_type);
47 return default_value;
48 }
49
50 template <>
51 inline char get_const_value<char>(
52 flecs::world_t *world, const char *name, ecs_value_t value, ecs_entity_t type, const char& default_value)
53 {
54 (void)name; (void)type; (void)default_value;
55 ecs_meta_cursor_t cur = ecs_meta_cursor(world, value.type, value.ptr);
56 return ecs_meta_get_char(&cur);
57 }
58
59 template <>
60 inline int8_t get_const_value<int8_t>(
61 flecs::world_t *world, const char *name, ecs_value_t value, ecs_entity_t type, const int8_t& default_value)
62 {
63 (void)name; (void)type; (void)default_value;
64 ecs_meta_cursor_t cur = ecs_meta_cursor(world, value.type, value.ptr);
65 return static_cast<int8_t>(ecs_meta_get_int(&cur));
66 }
67
68 template <>
69 inline int16_t get_const_value<int16_t>(
70 flecs::world_t *world, const char *name, ecs_value_t value, ecs_entity_t type, const int16_t& default_value)
71 {
72 (void)name; (void)type; (void)default_value;
73 ecs_meta_cursor_t cur = ecs_meta_cursor(world, value.type, value.ptr);
74 return static_cast<int16_t>(ecs_meta_get_int(&cur));
75 }
76
77 template <>
78 inline int32_t get_const_value<int32_t>(
79 flecs::world_t *world, const char *name, ecs_value_t value, ecs_entity_t type, const int32_t& default_value)
80 {
81 (void)name; (void)type; (void)default_value;
82 ecs_meta_cursor_t cur = ecs_meta_cursor(world, value.type, value.ptr);
83 return static_cast<int32_t>(ecs_meta_get_int(&cur));
84 }
85
86 template <>
87 inline int64_t get_const_value<int64_t>(
88 flecs::world_t *world, const char *name, ecs_value_t value, ecs_entity_t type, const int64_t& default_value)
89 {
90 (void)name; (void)type; (void)default_value;
91 ecs_meta_cursor_t cur = ecs_meta_cursor(world, value.type, value.ptr);
92 return ecs_meta_get_int(&cur);
93 }
94
95 template <>
96 inline uint8_t get_const_value<uint8_t>(
97 flecs::world_t *world, const char *name, ecs_value_t value, ecs_entity_t type, const uint8_t& default_value)
98 {
99 (void)name; (void)type; (void)default_value;
100 ecs_meta_cursor_t cur = ecs_meta_cursor(world, value.type, value.ptr);
101 return static_cast<uint8_t>(ecs_meta_get_uint(&cur));
102 }
103
104 template <>
105 inline uint16_t get_const_value<uint16_t>(
106 flecs::world_t *world, const char *name, ecs_value_t value, ecs_entity_t type, const uint16_t& default_value)
107 {
108 (void)name; (void)type; (void)default_value;
109 ecs_meta_cursor_t cur = ecs_meta_cursor(world, value.type, value.ptr);
110 return static_cast<uint16_t>(ecs_meta_get_uint(&cur));
111 }
112
113 template <>
114 inline uint32_t get_const_value<uint32_t>(
115 flecs::world_t *world, const char *name, ecs_value_t value, ecs_entity_t type, const uint32_t& default_value)
116 {
117 (void)name; (void)type; (void)default_value;
118 ecs_meta_cursor_t cur = ecs_meta_cursor(world, value.type, value.ptr);
119 return static_cast<uint32_t>(ecs_meta_get_uint(&cur));
120 }
121
122 template <>
123 inline uint64_t get_const_value<uint64_t>(
124 flecs::world_t *world, const char *name, ecs_value_t value, ecs_entity_t type, const uint64_t& default_value)
125 {
126 (void)name; (void)type; (void)default_value;
127 ecs_meta_cursor_t cur = ecs_meta_cursor(world, value.type, value.ptr);
128 return ecs_meta_get_uint(&cur);
129 }
130
131 template <>
132 inline float get_const_value<float>(
133 flecs::world_t *world, const char *name, ecs_value_t value, ecs_entity_t type, const float& default_value)
134 {
135 (void)name; (void)type; (void)default_value;
136 ecs_meta_cursor_t cur = ecs_meta_cursor(world, value.type, value.ptr);
137 return static_cast<float>(ecs_meta_get_float(&cur));
138 }
139
140 template <>
141 inline double get_const_value<double>(
142 flecs::world_t *world, const char *name, ecs_value_t value, ecs_entity_t type, const double& default_value)
143 {
144 (void)name; (void)type; (void)default_value;
145 ecs_meta_cursor_t cur = ecs_meta_cursor(world, value.type, value.ptr);
146 return ecs_meta_get_float(&cur);
147 }
148}
149
150template <typename T>
151inline T world::get_const_var(
152 const char *name,
153 const T& default_value) const
154{
155 ecs_value_t value = flecs::_::get_const_var(world_, name);
156 if (!value.ptr) {
157 return default_value;
158 }
159
160 flecs::id_t type = flecs::_::type<T>::id(world_);
161 if (type == value.type) {
162 return *(static_cast<T*>(value.ptr));
163 }
164
165 return flecs::_::get_const_value<T>(
166 world_, name, value, type, default_value);
167}
168
169template <typename T>
170void world::get_const_var(
171 const char *name,
172 T& out,
173 const T& default_value) const
174{
175 ecs_value_t value = flecs::_::get_const_var(world_, name);
176 if (!value.ptr) {
177 out = default_value;
178 return;
179 }
180
181 flecs::id_t type = flecs::_::type<T>::id(world_);
182 if (type == value.type) {
183 out = *(static_cast<T*>(value.ptr));
184 return;
185 }
186
187 out = flecs::_::get_const_value<T>(
188 world_, name, value, type, default_value);
189}
190
191}
FLECS_API ecs_meta_cursor_t ecs_meta_cursor(const ecs_world_t *world, ecs_entity_t type, void *ptr)
Create meta cursor.
FLECS_API double ecs_meta_get_float(const ecs_meta_cursor_t *cursor)
Get field value as float.
FLECS_API uint64_t ecs_meta_get_uint(const ecs_meta_cursor_t *cursor)
Get field value as unsigned integer.
FLECS_API char ecs_meta_get_char(const ecs_meta_cursor_t *cursor)
Get field value as char.
FLECS_API int64_t ecs_meta_get_int(const ecs_meta_cursor_t *cursor)
Get field value as signed integer.
FLECS_API ecs_entity_t ecs_script_init(ecs_world_t *world, const ecs_script_desc_t *desc)
Load managed script.
FLECS_API ecs_value_t ecs_const_var_get(const ecs_world_t *world, ecs_entity_t var)
Returns value for a const variable.
ecs_id_t ecs_entity_t
An entity identifier.
Definition flecs.h:384
ecs_entity_t ecs_lookup_path_w_sep(const ecs_world_t *world, ecs_entity_t parent, const char *path, const char *sep, const char *prefix, bool recursive)
Lookup an entity from a path.
Script builder.
Type that enables iterating/populating a value using reflection data.
Definition meta.h:607
Utility to hold a value of a dynamic type.
Definition flecs.h:1012
void * ptr
Pointer to value.
Definition flecs.h:1014
ecs_entity_t type
Type of value.
Definition flecs.h:1013
Entity.
Definition entity.hpp:30