Skip to content
Flecs v4.1
impl.hpp
Go to the documentation of this file.
1/**
2 * @file addons/cpp/mixins/event/impl.hpp
3 * @brief Event implementation.
4 */
5
6#pragma once
7
8#include "builder.hpp"
9
10namespace flecs
11{
12
13// Mixin implementation
14
16 return flecs::event_builder(world_, evt);
17}
18
19template <typename E>
22}
23
24namespace _ {
25 template <typename Event = void, typename Func>
26 void entity_observer_create(world_t *world, entity_t event, entity_t entity, Func&& func) {
27 using Delegate = entity_observer_delegate<decay_t<Func>, Event>;
28 auto ctx = FLECS_NEW(Delegate)(FLECS_FWD(func));
29 ecs_observer_desc_t desc = {};
30 desc.events[0] = event;
31 desc.query.terms[0].id = EcsAny;
32 desc.query.terms[0].src.id = entity;
33 desc.callback = Delegate::run;
34 desc.callback_ctx = ctx;
35 desc.callback_ctx_free = _::free_obj<Delegate>;
36 ecs_add_pair(world, ecs_observer_init(world, &desc), EcsChildOf, entity);
37 }
38}
39
40template <typename Self>
41template <typename Func>
42inline const Self& entity_builder<Self>::observe(flecs::entity_t evt, Func&& f) const {
43 _::entity_observer_create(world_, evt, id_, FLECS_FWD(f));
44 return to_base();
45}
46
47template <typename Self>
48template <typename Evt, typename Func>
49inline const Self& entity_builder<Self>::observe(Func&& f) const {
50 _::entity_observer_create<Evt>(world_, _::type<Evt>::id(world_), id_, FLECS_FWD(f));
51 return to_base();
52}
53
54template <typename Self>
55template <typename Func>
56inline const Self& entity_builder<Self>::observe(Func&& f) const {
57 return this->observe<_::event_from_func_t<Func>>(FLECS_FWD(f));
58}
59
60inline void entity_view::emit(flecs::entity evt) const {
61 this->emit(evt.id());
62}
63
64inline void entity_view::enqueue(flecs::entity evt) const {
65 this->enqueue(evt.id());
66}
67
68} // namespace flecs
const ecs_entity_t EcsChildOf
Used to express parent-child relationships.
const ecs_entity_t EcsAny
Any entity ("_").
flecs::event_builder_typed< E > event() const
Create a new event.
Definition impl.hpp:20
ecs_entity_t entity_t
Entity type.
Definition c_types.hpp:21
ecs_world_t world_t
World type.
Definition c_types.hpp:18
#define ecs_add_pair(world, subject, first, second)
Add a pair to an entity.
Definition flecs_c.h:275
ecs_entity_t ecs_observer_init(ecs_world_t *world, const ecs_observer_desc_t *desc)
Create an observer.
Event builder.
Int to enum.
Definition component.hpp:18
Used with ecs_observer_init().
Definition flecs.h:1399
void * callback_ctx
Context associated with callback (for language bindings).
Definition flecs.h:1439
ecs_query_desc_t query
Query for observer.
Definition flecs.h:1407
ecs_ctx_free_t callback_ctx_free
Callback to free callback ctx.
Definition flecs.h:1442
ecs_iter_action_t callback
Callback to invoke on an event, invoked when the observer matches.
Definition flecs.h:1422
ecs_entity_t events[8]
Events to observe (OnAdd, OnRemove, OnSet).
Definition flecs.h:1410
ecs_term_t terms[32]
Query terms.
Definition flecs.h:1330
ecs_entity_t id
Entity ID.
Definition flecs.h:820
ecs_term_ref_t src
Source of term.
Definition flecs.h:840
ecs_id_t id
Component ID to be matched by term.
Definition flecs.h:835
const Self & observe(flecs::entity_t evt, Func &&callback) const
Observe an event on an entity.
Definition impl.hpp:42
void emit(flecs::entity_t evt) const
Emit an event for an entity.
void enqueue() const
Enqueue an event for an entity.
void emit() const
Emit an event for an entity.
void enqueue(flecs::entity_t evt) const
Enqueue an event for an entity.
entity_t id() const
Get entity ID.
Entity.
Definition entity.hpp:30
Typed event builder.
Definition builder.hpp:97
Untyped event builder.
Definition builder.hpp:91
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
The world.
Definition world.hpp:129
world_t * world_
Pointer to the underlying C world.
Definition world.hpp:1009
flecs::event_builder event(flecs::entity_t evt) const
Create a new event.