Skip to content
Flecs v4.1
untyped_component.inl
Go to the documentation of this file.
1/**
2 * @file addons/cpp/mixins/meta/untyped_component.inl
3 * @brief Meta component mixin.
4 */
5
6/**
7 * @memberof flecs::component
8 * @ingroup cpp_addons_meta
9 *
10 * @{
11 */
12
13untyped_component& member(flecs::entity_t type_id, flecs::entity_t unit,
14 const char *name, int32_t count = 0, size_t offset = SIZE_MAX)
15{
16 ecs_member_t m = {};
17 m.name = name;
18 m.type = type_id;
19 m.unit = unit;
20 m.count = count;
21 m.use_offset = offset != SIZE_MAX;
22 m.offset = m.use_offset ? static_cast<int32_t>(offset) : 0;
23 ecs_struct_add_member(world_, id_, &m);
24 return *this;
25}
26
27untyped_component& member(flecs::entity_t type_id, const char *name,
28 int32_t count = 0, size_t offset = SIZE_MAX)
29{
30 return member(type_id, 0, name, count, offset);
31}
32
33template <typename MemberType, typename UnitType = void>
34untyped_component& member(const char *name, int32_t count = 0, size_t offset = SIZE_MAX) {
36 if constexpr (!std::is_void_v<UnitType>) {
37 unit = _::type<UnitType>::id(world_);
38 }
39 return member(_::type<MemberType>::id(world_), unit, name, count, offset);
40}
41
42template <typename MemberType>
43untyped_component& member(flecs::entity_t unit, const char *name,
44 int32_t count = 0, size_t offset = SIZE_MAX)
45{
46 return member(_::type<MemberType>::id(world_), unit, name, count, offset);
47}
48
49template <typename MemberType, typename ComponentType,
50 typename RealType = std::remove_extent_t<MemberType>>
51untyped_component& member(const MemberType ComponentType::*ptr,
52 const char *name, flecs::entity_t unit = 0)
53{
54 size_t offset = reinterpret_cast<size_t>(&(static_cast<ComponentType*>(nullptr)->*ptr));
55 return member(_::type<RealType>::id(world_), unit, name, std::extent<MemberType>::value, offset);
56}
57
58template <typename UnitType, typename MemberType, typename ComponentType,
59 typename RealType = std::remove_extent_t<MemberType>>
60untyped_component& member(const MemberType ComponentType::*ptr, const char *name) {
61 return member<MemberType, ComponentType, RealType>(ptr, name, _::type<UnitType>::id(world_));
62}
63
64/** Add a constant. */
65template <typename T = int32_t>
67 const char *name,
68 T value)
69{
71
72 ecs_entity_desc_t desc = {};
73 desc.name = name;
74 desc.parent = id_;
76 ecs_assert(eid != 0, ECS_INTERNAL_ERROR, nullptr);
77
78 ecs_set_id(world_, eid,
79 ecs_pair(flecs::Constant, _::type<T>::id(world_)), sizeof(T),
80 &value);
81
82 return *this;
83}
84
85/** Add a bitmask constant. */
86template <typename T = uint32_t>
88 const char *name,
89 T value)
90{
92
93 ecs_entity_desc_t desc = {};
94 desc.name = name;
95 desc.parent = id_;
97 ecs_assert(eid != 0, ECS_INTERNAL_ERROR, nullptr);
98
99 ecs_set_id(world_, eid,
100 ecs_pair(flecs::Constant, _::type<T>::id(world_)), sizeof(T),
101 &value);
102
103 return *this;
104}
105
106/** Register array metadata for a component. */
107template <typename Elem>
109 int32_t elem_count)
110{
111 ecs_array_desc_t desc = {};
112 desc.entity = id_;
114 desc.count = elem_count;
115 ecs_array_init(world_, &desc);
116 return *this;
117}
118
119untyped_component& range(double min, double max) {
120 return set_member_range<&flecs::member_t::range, &flecs::MemberRanges::value>(min, max);
121}
122
123untyped_component& warning_range(double min, double max) {
124 return set_member_range<&flecs::member_t::warning_range, &flecs::MemberRanges::warning>(min, max);
125}
126
127untyped_component& error_range(double min, double max) {
128 return set_member_range<&flecs::member_t::error_range, &flecs::MemberRanges::error>(min, max);
129}
130
131private:
132 template <auto MemberRange, auto EntityRange>
133 untyped_component& set_member_range(double min, double max) {
134 auto member = ecs_cpp_last_member(world_, id_);
135 if (member) {
136 member->*MemberRange = {min, max};
137 auto member_entity = member->member;
138 if (member_entity) {
139 auto id = _::type<flecs::MemberRanges>::id(world_);
140 auto ranges = static_cast<flecs::MemberRanges*>(
141 ecs_ensure_id(world_, member_entity, id, sizeof(flecs::MemberRanges)));
142 ranges->*EntityRange = {min, max};
143 ecs_modified_id(world_, member_entity, id);
144 }
145 }
146 return *this;
147 }
148
149public:
150
151/** @} */
FLECS_API ecs_member_t * ecs_cpp_last_member(const ecs_world_t *world, ecs_entity_t type)
Get the last registered member for a type.
void ecs_add_id(ecs_world_t *world, ecs_entity_t entity, ecs_id_t component)
Add a (component) ID to an entity.
#define ecs_assert(condition, error_code,...)
Assert.
Definition log.h:473
#define ECS_INTERNAL_ERROR
Internal error code.
Definition log.h:681
FLECS_API int ecs_struct_add_member(ecs_world_t *world, ecs_entity_t type, const ecs_member_t *member)
Add member to struct.
FLECS_API ecs_entity_t ecs_array_init(ecs_world_t *world, const ecs_array_desc_t *desc)
Create a new array type.
ecs_id_t ecs_entity_t
An entity identifier.
Definition flecs.h:395
untyped_component & constant(const char *name, T value)
Add a constant.
untyped_component & array(int32_t elem_count)
Register array metadata for a component.
untyped_component & bit(const char *name, T value)
Add a bitmask constant.
ecs_entity_t entity_t
Entity type.
Definition c_types.hpp:21
ecs_entity_t ecs_entity_init(ecs_world_t *world, const ecs_entity_desc_t *desc)
Find or create an entity.
void ecs_modified_id(ecs_world_t *world, ecs_entity_t entity, ecs_id_t component)
Signal that a component has been modified.
void * ecs_ensure_id(ecs_world_t *world, ecs_entity_t entity, ecs_id_t component, size_t size)
Ensure an entity has a component and return a pointer.
void ecs_set_id(ecs_world_t *world, ecs_entity_t entity, ecs_id_t component, size_t size, const void *ptr)
Set the value of a component.
Used with ecs_array_init().
Definition meta.h:1523
ecs_entity_t entity
Existing entity to use for type (optional).
Definition meta.h:1524
ecs_entity_t type
Element type.
Definition meta.h:1525
int32_t count
Number of elements.
Definition meta.h:1526
Used with ecs_entity_init().
Definition flecs.h:1077
const char * name
Name of the entity.
Definition flecs.h:1084
ecs_entity_t parent
Parent entity.
Definition flecs.h:1082
Element type of members vector in EcsStruct.
Definition meta.h:227
const char * name
Must be set when used with ecs_struct_desc_t.
Definition meta.h:229
bool use_offset
Set to true to prevent automatic offset computation.
Definition meta.h:248
ecs_entity_t type
Member type.
Definition meta.h:232
int32_t offset
May be set when used with ecs_struct_desc_t.
Definition meta.h:239
ecs_entity_t unit
May be set when used with ecs_struct_desc_t.
Definition meta.h:243
int32_t count
Element count (for inline arrays).
Definition meta.h:236
const Self & unit(const char *symbol, flecs::entity_t prefix=0, flecs::entity_t base=0, flecs::entity_t over=0, int32_t factor=0, int32_t power=0) const
Make an entity a unit.
flecs::string_view name() const
Return the entity name.
flecs::id_t id_
The raw ID value.
Definition decl.hpp:154
flecs::world_t * world_
World is optional, but guarantees that entity identifiers extracted from the ID are valid.
Definition decl.hpp:152
Untyped component class.
untyped_component()
Default constructor.