@@ -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>;
1139211392namespace 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
1146511497struct event_builder;
1146611498
11499+ template <typename E>
11500+ struct event_builder_typed;
11501+
1146711502template<typename T>
1146811503struct 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
1148911527using 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
1788517932template <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
0 commit comments