Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added Enum specialization for event_builder_base::id(Enum::Value) #1210

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions flecs.h
Original file line number Diff line number Diff line change
Expand Up @@ -17673,6 +17673,13 @@ 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) {
m_ids.array = m_ids_array;
Expand Down
7 changes: 7 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,13 @@ 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) {
m_ids.array = m_ids_array;
Expand Down
3 changes: 2 additions & 1 deletion test/cpp_api/project.json
Original file line number Diff line number Diff line change
Expand Up @@ -529,7 +529,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_api/src/Event.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -786,3 +786,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);
}
8 changes: 6 additions & 2 deletions test/cpp_api/src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -510,6 +510,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 @@ -3336,6 +3337,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 @@ -6659,7 +6664,6 @@ bake_test_case Doc_testcases[] = {
}
};


static bake_test_suite suites[] = {
{
"PrettyFunction",
Expand Down Expand Up @@ -6714,7 +6718,7 @@ static bake_test_suite suites[] = {
"Event",
NULL,
NULL,
30,
31,
Event_testcases
},
{
Expand Down
Loading