@@ -5881,7 +5881,7 @@ typedef struct ecs_event_desc_t {
5881
5881
int32_t count;
5882
5882
5883
5883
/* Optional context. Assigned to iter param member */
5884
- void *param;
5884
+ const void *param;
5885
5885
5886
5886
/* Observable (usually the world) */
5887
5887
ecs_poly_t *observable;
@@ -11392,8 +11392,9 @@ using filter_m_world = filter_m<flecs::world>;
11392
11392
namespace flecs {
11393
11393
11394
11394
// 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)
11397
11398
: m_world(world)
11398
11399
, m_desc{}
11399
11400
, m_ids{}
@@ -11404,23 +11405,23 @@ struct event_builder {
11404
11405
11405
11406
/** Add component to trigger on */
11406
11407
template <typename T>
11407
- event_builder & id() {
11408
+ Base & id() {
11408
11409
m_ids.array = m_ids_array;
11409
11410
m_ids.array[m_ids.count] = _::cpp_type<T>().id(m_world);
11410
11411
m_ids.count ++;
11411
11412
return *this;
11412
11413
}
11413
11414
11414
11415
/** Add (component) id to trigger on */
11415
- event_builder & id(flecs::id_t id) {
11416
+ Base & id(flecs::id_t id) {
11416
11417
m_ids.array = m_ids_array;
11417
11418
m_ids.array[m_ids.count] = id;
11418
11419
m_ids.count ++;
11419
11420
return *this;
11420
11421
}
11421
11422
11422
11423
/** Set entity for which to trigger */
11423
- event_builder & entity(flecs::entity_t e) {
11424
+ Base & entity(flecs::entity_t e) {
11424
11425
ecs_record_t *r = ecs_record_find(m_world, e);
11425
11426
11426
11427
/* can't trigger for empty entity */
@@ -11434,13 +11435,19 @@ struct event_builder {
11434
11435
}
11435
11436
11436
11437
/* 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) {
11438
11439
m_desc.table = t;
11439
11440
m_desc.offset = offset;
11440
11441
m_desc.count = count;
11441
11442
return *this;
11442
11443
}
11443
11444
11445
+ /* Set event data */
11446
+ Base& ctx(const E* ptr) {
11447
+ m_desc.param = ptr;
11448
+ return *this;
11449
+ }
11450
+
11444
11451
void emit() {
11445
11452
ecs_assert(m_ids.count != 0, ECS_INVALID_PARAMETER, NULL);
11446
11453
ecs_assert(m_desc.table != nullptr, ECS_INVALID_PARAMETER, NULL);
@@ -11450,11 +11457,36 @@ struct event_builder {
11450
11457
ecs_emit(m_world, &m_desc);
11451
11458
}
11452
11459
11453
- private :
11460
+ protected :
11454
11461
flecs::world_t *m_world;
11455
11462
ecs_event_desc_t m_desc;
11456
11463
flecs::ids_t m_ids;
11457
11464
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
+ }
11458
11490
};
11459
11491
11460
11492
}
@@ -11464,6 +11496,9 @@ namespace flecs {
11464
11496
11465
11497
struct event_builder;
11466
11498
11499
+ template <typename E>
11500
+ struct event_builder_typed;
11501
+
11467
11502
template<typename T>
11468
11503
struct event_m : mixin<T> { };
11469
11504
@@ -11474,16 +11509,19 @@ struct event_m<flecs::world> : mixin<flecs::world> {
11474
11509
11475
11510
/** Create a new event.
11476
11511
*
11512
+ * @param evt The event id.
11513
+ * @param ctx (Optional) user data for event.
11477
11514
* @return Event builder.
11478
11515
*/
11479
- flecs::event_builder event(flecs::entity_t event ) const;
11516
+ flecs::event_builder event(flecs::entity_t evt ) const;
11480
11517
11481
11518
/** Create a new event.
11482
11519
*
11520
+ * @tparam E The event type.
11483
11521
* @return Event builder.
11484
11522
*/
11485
11523
template <typename E>
11486
- flecs::event_builder event() const;
11524
+ flecs::event_builder_typed<E> event() const;
11487
11525
};
11488
11526
11489
11527
using event_m_world = event_m<flecs::world>;
@@ -13515,6 +13553,15 @@ struct iter {
13515
13553
return m_iter->param;
13516
13554
}
13517
13555
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
+
13518
13565
/** Obtain mutable handle to entity being iterated over.
13519
13566
*
13520
13567
* @param row Row being iterated over.
@@ -17883,8 +17930,8 @@ inline flecs::event_builder event_m_world::event(flecs::entity_t evt) const {
17883
17930
}
17884
17931
17885
17932
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()));
17888
17935
}
17889
17936
17890
17937
} // namespace flecs
0 commit comments