Skip to content

Commit

Permalink
Adds specialization and companion test.
Browse files Browse the repository at this point in the history
  • Loading branch information
garrett-is-a-swann committed Jul 3, 2024
1 parent a0946bd commit c482cfa
Show file tree
Hide file tree
Showing 5 changed files with 125 additions and 10 deletions.
8 changes: 8 additions & 0 deletions flecs.h
Original file line number Diff line number Diff line change
Expand Up @@ -17868,6 +17868,14 @@ struct event_builder_base {
return id(ecs_pair(first, second));
}


template <typename Enum, if_t<is_enum<Enum>::value> = 0>
Base& id(Enum value) {
const auto& et = enum_type<Enum>(this->m_world);
flecs::entity_t target = et.entity(value);
return id(et.entity(), target);
}

/** Add (component) id to emit for */
Base& id(flecs::id_t id) {
ids_.array = ids_array_;
Expand Down
8 changes: 8 additions & 0 deletions include/flecs/addons/cpp/mixins/event/builder.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,14 @@ struct event_builder_base {
return id(ecs_pair(first, second));
}


template <typename Enum, if_t<is_enum<Enum>::value> = 0>
Base& id(Enum value) {
const auto& et = enum_type<Enum>(this->m_world);
flecs::entity_t target = et.entity(value);
return id(et.entity(), target);
}

/** Add (component) id to emit for */
Base& id(flecs::id_t id) {
ids_.array = ids_array_;
Expand Down
3 changes: 2 additions & 1 deletion test/cpp/project.json
Original file line number Diff line number Diff line change
Expand Up @@ -536,7 +536,8 @@
"enqueue_event_w_payload",
"enqueue_entity_event_w_payload",
"enqueue_entity_from_readonly_world",
"enqueue_entity_w_payload_from_readonly_world"
"enqueue_entity_w_payload_from_readonly_world",
"enum_event"
]
}, {
"id": "Iterable",
Expand Down
100 changes: 100 additions & 0 deletions test/cpp/src/Event.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -792,3 +792,103 @@ void Event_enqueue_entity_w_payload_from_readonly_world(void) {

test_int(count, 1);
}

enum Type { A, B = 42, C };
void Event_enum_event(void) {
struct Event {};


struct Data {
Type type;
int value;
};


struct {
size_t _any = 0u;
size_t type_a = 0u;
size_t type_b = 0u;
size_t data = 0u;
size_t data_type_a = 0u;
size_t data_type_b = 0u;
} observered;

flecs::world ecs;

ecs.component<Event>();
ecs.component<Type>();
ecs.component<Data>();

ecs.observer()
.with(flecs::Wildcard)
.event<Event>()
.each([&](flecs::entity) {
++observered._any;
});

ecs.observer()
.with(Type::A)
.event<Event>()
.each([&](flecs::entity) {
++observered.type_a;
});

ecs.observer()
.with(Type::B)
.event<Event>()
.each([&](flecs::entity) {
++observered.type_b;
});

ecs.observer<Data>()
.event<Event>()
.each([&](flecs::entity, Data data) {
++observered.data;
test_assert(data.value >= 1 && data.value <= 2);
});


ecs.observer<Data>()
.with(Type::A)
.event<Event>()
.each([&](flecs::entity, Data data) {
++observered.data_type_a;
test_int(data.value, 1);
});

ecs.observer<Data>()
.with(Type::B)
.event<Event>()
.each([&](flecs::entity, Data data) {
++observered.data_type_b;
test_int(data.value, 2);
});

{
auto event1 = ecs.entity()
.add(Type::A)
.emplace<Data>(Type::A, 1);

ecs.event<Event>()
.id(Type::A)
.id<Data>()
.entity(event1).emit();
}

{
auto event2 = ecs.entity()
.add(Type::B)
.emplace<Data>(Type::B, 2);

ecs.event<Event>()
.id(Type::B)
.id<Data>()
.entity(event2).emit();
}

test_int(observered._any, 2u);
test_int(observered.type_a, 1u);
test_int(observered.type_b, 1u);
test_int(observered.data_type_a, 1u);
test_int(observered.data_type_b, 1u);
}
16 changes: 7 additions & 9 deletions test/cpp/src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -517,6 +517,7 @@ void Event_enqueue_event_w_payload(void);
void Event_enqueue_entity_event_w_payload(void);
void Event_enqueue_entity_from_readonly_world(void);
void Event_enqueue_entity_w_payload_from_readonly_world(void);
void Event_enum_event(void);

// Testsuite 'Iterable'
void Iterable_page_each(void);
Expand Down Expand Up @@ -3307,6 +3308,10 @@ bake_test_case Event_testcases[] = {
{
"enqueue_entity_w_payload_from_readonly_world",
Event_enqueue_entity_w_payload_from_readonly_world
},
{
"enum_event",
Event_enum_event
}
};

Expand Down Expand Up @@ -6390,11 +6395,6 @@ bake_test_case Doc_testcases[] = {
}
};

const char* QueryBuilder_cache_kind_param[] = {"default", "auto"};
bake_test_param QueryBuilder_params[] = {
{"cache_kind", (char**)QueryBuilder_cache_kind_param, 2}
};

static bake_test_suite suites[] = {
{
"PrettyFunction",
Expand Down Expand Up @@ -6449,7 +6449,7 @@ static bake_test_suite suites[] = {
"Event",
NULL,
NULL,
30,
31,
Event_testcases
},
{
Expand All @@ -6471,9 +6471,7 @@ static bake_test_suite suites[] = {
QueryBuilder_setup,
NULL,
164,
QueryBuilder_testcases,
1,
QueryBuilder_params
QueryBuilder_testcases
},
{
"SystemBuilder",
Expand Down

0 comments on commit c482cfa

Please sign in to comment.