Skip to content

Commit 8506832

Browse files
committed
#124 implement event data API
1 parent caddd3a commit 8506832

File tree

11 files changed

+225
-28
lines changed

11 files changed

+225
-28
lines changed

flecs.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -13884,7 +13884,7 @@ void ecs_emit(
1388413884
.other_table = desc->other_table,
1388513885
.offset = row,
1388613886
.count = count,
13887-
.param = desc->param
13887+
.param = (void*)desc->param
1388813888
};
1388913889

1389013890
world->event_id ++;

flecs.h

+59-12
Original file line numberDiff line numberDiff line change
@@ -5881,7 +5881,7 @@ typedef struct ecs_event_desc_t {
58815881
int32_t count;
58825882

58835883
/* Optional context. Assigned to iter param member */
5884-
void *param;
5884+
const void *param;
58855885

58865886
/* Observable (usually the world) */
58875887
ecs_poly_t *observable;
@@ -11392,8 +11392,9 @@ using filter_m_world = filter_m<flecs::world>;
1139211392
namespace flecs {
1139311393

1139411394
// Event builder interface
11395-
struct event_builder {
11396-
event_builder(flecs::world_t *world, flecs::entity_t event)
11395+
template <typename Base, typename E>
11396+
struct event_builder_base {
11397+
event_builder_base(flecs::world_t *world, flecs::entity_t event)
1139711398
: m_world(world)
1139811399
, m_desc{}
1139911400
, m_ids{}
@@ -11404,23 +11405,23 @@ struct event_builder {
1140411405

1140511406
/** Add component to trigger on */
1140611407
template <typename T>
11407-
event_builder& id() {
11408+
Base& id() {
1140811409
m_ids.array = m_ids_array;
1140911410
m_ids.array[m_ids.count] = _::cpp_type<T>().id(m_world);
1141011411
m_ids.count ++;
1141111412
return *this;
1141211413
}
1141311414

1141411415
/** Add (component) id to trigger on */
11415-
event_builder& id(flecs::id_t id) {
11416+
Base& id(flecs::id_t id) {
1141611417
m_ids.array = m_ids_array;
1141711418
m_ids.array[m_ids.count] = id;
1141811419
m_ids.count ++;
1141911420
return *this;
1142011421
}
1142111422

1142211423
/** Set entity for which to trigger */
11423-
event_builder& entity(flecs::entity_t e) {
11424+
Base& entity(flecs::entity_t e) {
1142411425
ecs_record_t *r = ecs_record_find(m_world, e);
1142511426

1142611427
/* can't trigger for empty entity */
@@ -11434,13 +11435,19 @@ struct event_builder {
1143411435
}
1143511436

1143611437
/* Set table for which to trigger */
11437-
event_builder& table(flecs::table_t *t, int32_t offset = 0, int32_t count = 0) {
11438+
Base& table(flecs::table_t *t, int32_t offset = 0, int32_t count = 0) {
1143811439
m_desc.table = t;
1143911440
m_desc.offset = offset;
1144011441
m_desc.count = count;
1144111442
return *this;
1144211443
}
1144311444

11445+
/* Set event data */
11446+
Base& ctx(const E* ptr) {
11447+
m_desc.param = ptr;
11448+
return *this;
11449+
}
11450+
1144411451
void emit() {
1144511452
ecs_assert(m_ids.count != 0, ECS_INVALID_PARAMETER, NULL);
1144611453
ecs_assert(m_desc.table != nullptr, ECS_INVALID_PARAMETER, NULL);
@@ -11450,11 +11457,36 @@ struct event_builder {
1145011457
ecs_emit(m_world, &m_desc);
1145111458
}
1145211459

11453-
private:
11460+
protected:
1145411461
flecs::world_t *m_world;
1145511462
ecs_event_desc_t m_desc;
1145611463
flecs::ids_t m_ids;
1145711464
flecs::id_t m_ids_array[ECS_EVENT_DESC_ID_COUNT_MAX];
11465+
11466+
private:
11467+
operator Base&() {
11468+
return *static_cast<Base*>(this);
11469+
}
11470+
};
11471+
11472+
struct event_builder : event_builder_base<event_builder, void> {
11473+
using event_builder_base::event_builder_base;
11474+
};
11475+
11476+
template <typename E>
11477+
struct event_builder_typed : event_builder_base<event_builder_typed<E>, E> {
11478+
private:
11479+
using Class = event_builder_typed<E>;
11480+
using Base = event_builder_base<Class, E>;
11481+
11482+
public:
11483+
using Base::event_builder_base;
11484+
11485+
/* Set event data */
11486+
Class& ctx(const E& ptr) {
11487+
this->m_desc.param = &ptr;
11488+
return *this;
11489+
}
1145811490
};
1145911491

1146011492
}
@@ -11464,6 +11496,9 @@ namespace flecs {
1146411496

1146511497
struct event_builder;
1146611498

11499+
template <typename E>
11500+
struct event_builder_typed;
11501+
1146711502
template<typename T>
1146811503
struct event_m : mixin<T> { };
1146911504

@@ -11474,16 +11509,19 @@ struct event_m<flecs::world> : mixin<flecs::world> {
1147411509

1147511510
/** Create a new event.
1147611511
*
11512+
* @param evt The event id.
11513+
* @param ctx (Optional) user data for event.
1147711514
* @return Event builder.
1147811515
*/
11479-
flecs::event_builder event(flecs::entity_t event) const;
11516+
flecs::event_builder event(flecs::entity_t evt) const;
1148011517

1148111518
/** Create a new event.
1148211519
*
11520+
* @tparam E The event type.
1148311521
* @return Event builder.
1148411522
*/
1148511523
template <typename E>
11486-
flecs::event_builder event() const;
11524+
flecs::event_builder_typed<E> event() const;
1148711525
};
1148811526

1148911527
using event_m_world = event_m<flecs::world>;
@@ -13515,6 +13553,15 @@ struct iter {
1351513553
return m_iter->param;
1351613554
}
1351713555

13556+
/** Access param.
13557+
* param contains the pointer passed to the param argument of system::run
13558+
*/
13559+
template <typename T>
13560+
T* param() {
13561+
/* TODO: type check */
13562+
return static_cast<T*>(m_iter->param);
13563+
}
13564+
1351813565
/** Obtain mutable handle to entity being iterated over.
1351913566
*
1352013567
* @param row Row being iterated over.
@@ -17883,8 +17930,8 @@ inline flecs::event_builder event_m_world::event(flecs::entity_t evt) const {
1788317930
}
1788417931

1788517932
template <typename E>
17886-
inline flecs::event_builder event_m_world::event() const {
17887-
return flecs::event_builder(this->me(), _::cpp_type<E>().id(this->me()));
17933+
inline flecs::event_builder_typed<E> event_m_world::event() const {
17934+
return flecs::event_builder_typed<E>(this->me(), _::cpp_type<E>().id(this->me()));
1788817935
}
1788917936

1789017937
} // namespace flecs

include/flecs.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -2982,7 +2982,7 @@ typedef struct ecs_event_desc_t {
29822982
int32_t count;
29832983

29842984
/* Optional context. Assigned to iter param member */
2985-
void *param;
2985+
const void *param;
29862986

29872987
/* Observable (usually the world) */
29882988
ecs_poly_t *observable;

include/flecs/addons/cpp/iter.hpp

+9
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,15 @@ struct iter {
219219
return m_iter->param;
220220
}
221221

222+
/** Access param.
223+
* param contains the pointer passed to the param argument of system::run
224+
*/
225+
template <typename T>
226+
T* param() {
227+
/* TODO: type check */
228+
return static_cast<T*>(m_iter->param);
229+
}
230+
222231
/** Obtain mutable handle to entity being iterated over.
223232
*
224233
* @param row Row being iterated over.

include/flecs/addons/cpp/mixins/event/builder.hpp

+39-7
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55
namespace flecs {
66

77
// Event builder interface
8-
struct event_builder {
9-
event_builder(flecs::world_t *world, flecs::entity_t event)
8+
template <typename Base, typename E>
9+
struct event_builder_base {
10+
event_builder_base(flecs::world_t *world, flecs::entity_t event)
1011
: m_world(world)
1112
, m_desc{}
1213
, m_ids{}
@@ -17,23 +18,23 @@ struct event_builder {
1718

1819
/** Add component to trigger on */
1920
template <typename T>
20-
event_builder& id() {
21+
Base& id() {
2122
m_ids.array = m_ids_array;
2223
m_ids.array[m_ids.count] = _::cpp_type<T>().id(m_world);
2324
m_ids.count ++;
2425
return *this;
2526
}
2627

2728
/** Add (component) id to trigger on */
28-
event_builder& id(flecs::id_t id) {
29+
Base& id(flecs::id_t id) {
2930
m_ids.array = m_ids_array;
3031
m_ids.array[m_ids.count] = id;
3132
m_ids.count ++;
3233
return *this;
3334
}
3435

3536
/** Set entity for which to trigger */
36-
event_builder& entity(flecs::entity_t e) {
37+
Base& entity(flecs::entity_t e) {
3738
ecs_record_t *r = ecs_record_find(m_world, e);
3839

3940
/* can't trigger for empty entity */
@@ -47,13 +48,19 @@ struct event_builder {
4748
}
4849

4950
/* Set table for which to trigger */
50-
event_builder& table(flecs::table_t *t, int32_t offset = 0, int32_t count = 0) {
51+
Base& table(flecs::table_t *t, int32_t offset = 0, int32_t count = 0) {
5152
m_desc.table = t;
5253
m_desc.offset = offset;
5354
m_desc.count = count;
5455
return *this;
5556
}
5657

58+
/* Set event data */
59+
Base& ctx(const E* ptr) {
60+
m_desc.param = ptr;
61+
return *this;
62+
}
63+
5764
void emit() {
5865
ecs_assert(m_ids.count != 0, ECS_INVALID_PARAMETER, NULL);
5966
ecs_assert(m_desc.table != nullptr, ECS_INVALID_PARAMETER, NULL);
@@ -63,11 +70,36 @@ struct event_builder {
6370
ecs_emit(m_world, &m_desc);
6471
}
6572

66-
private:
73+
protected:
6774
flecs::world_t *m_world;
6875
ecs_event_desc_t m_desc;
6976
flecs::ids_t m_ids;
7077
flecs::id_t m_ids_array[ECS_EVENT_DESC_ID_COUNT_MAX];
78+
79+
private:
80+
operator Base&() {
81+
return *static_cast<Base*>(this);
82+
}
83+
};
84+
85+
struct event_builder : event_builder_base<event_builder, void> {
86+
using event_builder_base::event_builder_base;
87+
};
88+
89+
template <typename E>
90+
struct event_builder_typed : event_builder_base<event_builder_typed<E>, E> {
91+
private:
92+
using Class = event_builder_typed<E>;
93+
using Base = event_builder_base<Class, E>;
94+
95+
public:
96+
using Base::event_builder_base;
97+
98+
/* Set event data */
99+
Class& ctx(const E& ptr) {
100+
this->m_desc.param = &ptr;
101+
return *this;
102+
}
71103
};
72104

73105
}

include/flecs/addons/cpp/mixins/event/decl.hpp

+8-2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ namespace flecs {
66

77
struct event_builder;
88

9+
template <typename E>
10+
struct event_builder_typed;
11+
912
template<typename T>
1013
struct event_m : mixin<T> { };
1114

@@ -16,16 +19,19 @@ struct event_m<flecs::world> : mixin<flecs::world> {
1619

1720
/** Create a new event.
1821
*
22+
* @param evt The event id.
23+
* @param ctx (Optional) user data for event.
1924
* @return Event builder.
2025
*/
21-
flecs::event_builder event(flecs::entity_t event) const;
26+
flecs::event_builder event(flecs::entity_t evt) const;
2227

2328
/** Create a new event.
2429
*
30+
* @tparam E The event type.
2531
* @return Event builder.
2632
*/
2733
template <typename E>
28-
flecs::event_builder event() const;
34+
flecs::event_builder_typed<E> event() const;
2935
};
3036

3137
using event_m_world = event_m<flecs::world>;

include/flecs/addons/cpp/mixins/event/impl.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ inline flecs::event_builder event_m_world::event(flecs::entity_t evt) const {
1212
}
1313

1414
template <typename E>
15-
inline flecs::event_builder event_m_world::event() const {
16-
return flecs::event_builder(this->me(), _::cpp_type<E>().id(this->me()));
15+
inline flecs::event_builder_typed<E> event_m_world::event() const {
16+
return flecs::event_builder_typed<E>(this->me(), _::cpp_type<E>().id(this->me()));
1717
}
1818

1919
} // namespace flecs

src/observable.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ void ecs_emit(
116116
.other_table = desc->other_table,
117117
.offset = row,
118118
.count = count,
119-
.param = desc->param
119+
.param = (void*)desc->param
120120
};
121121

122122
world->event_id ++;

test/cpp_api/project.json

+4-1
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,10 @@
345345
"evt_2_ids_table",
346346
"evt_type",
347347
"evt_1_component",
348-
"evt_2_components"
348+
"evt_2_components",
349+
"evt_void_ctx",
350+
"evt_typed_ctx",
351+
"evt_implicit_typed_ctx"
349352
]
350353
}, {
351354
"id": "Trigger",

0 commit comments

Comments
 (0)