dispatcher: added discard to free explicitly a pool

This commit is contained in:
Michele Caini
2019-12-21 17:24:58 +01:00
parent 56e7dd0de0
commit 9457a55910
7 changed files with 26 additions and 22 deletions

View File

@@ -98,6 +98,17 @@ class dispatcher {
}
public:
/**
* @brief Discards the pool for the given event.
* @tparam Event Type of event for which to discard the pool.
*/
template<typename... Event>
void discard() {
pools.erase(std::remove_if(pools.begin(), pools.end(), [](auto &&cpool) {
return ((cpool->id() == type_id_v<Event>) || ...);
}), pools.end());
}
/**
* @brief Returns a sink object for the given event.
*

View File

@@ -2,6 +2,7 @@
#include <entt/signal/dispatcher.hpp>
#include "types.h"
ENTT_API void trigger(int value, entt::dispatcher &dispatcher) {
dispatcher.trigger<message>(value);
ENTT_API void trigger(entt::dispatcher &dispatcher) {
dispatcher.trigger<event>();
dispatcher.trigger<message>(42);
}

View File

@@ -4,10 +4,9 @@
#include <entt/signal/dispatcher.hpp>
#include "types.h"
ENTT_API void trigger(int, entt::dispatcher &);
ENTT_API void trigger(entt::dispatcher &);
struct listener {
void on(event ev) { value = ev.payload; }
void on(message msg) { value = msg.payload; }
int value{};
};
@@ -16,13 +15,10 @@ TEST(Lib, Dispatcher) {
entt::dispatcher dispatcher;
listener listener;
dispatcher.sink<event>().connect<entt::overload<void(event)>(&listener::on)>(listener);
ASSERT_EQ(listener.value, 0);
dispatcher.sink<message>().connect<entt::overload<void(message)>(&listener::on)>(listener);
dispatcher.trigger<event>(3);
ASSERT_EQ(listener.value, 3);
trigger(42, dispatcher);
trigger(dispatcher);
ASSERT_EQ(listener.value, 42);
}

View File

@@ -5,8 +5,6 @@ struct message {
int payload;
};
struct event {
int payload;
};
struct event {};
#endif // ENTT_LIB_DISPATCHER_TYPES_H

View File

@@ -7,7 +7,6 @@
#include "types.h"
struct listener {
void on(event ev) { value = ev.payload; }
void on(message msg) { value = msg.payload; }
int value{};
};
@@ -16,11 +15,9 @@ TEST(Lib, Dispatcher) {
entt::dispatcher dispatcher;
listener listener;
dispatcher.sink<event>().connect<entt::overload<void(event)>(&listener::on)>(listener);
dispatcher.sink<message>().connect<entt::overload<void(message)>(&listener::on)>(listener);
dispatcher.trigger<event>(3);
ASSERT_EQ(listener.value, 0);
ASSERT_EQ(listener.value, 3);
dispatcher.sink<message>().connect<entt::overload<void(message)>(&listener::on)>(listener);
cr_plugin ctx;
ctx.userdata = &dispatcher;

View File

@@ -5,11 +5,14 @@
CR_EXPORT int cr_main(cr_plugin *ctx, cr_op operation) {
switch (operation) {
case CR_STEP:
static_cast<entt::dispatcher *>(ctx->userdata)->trigger<event>();
static_cast<entt::dispatcher *>(ctx->userdata)->trigger<message>(42);
break;
case CR_CLOSE:
static_cast<entt::dispatcher *>(ctx->userdata)->discard<event>();
break;
case CR_LOAD:
case CR_UNLOAD:
case CR_CLOSE:
// nothing to do here, this is only a test.
break;
}

View File

@@ -5,8 +5,6 @@ struct message {
int payload;
};
struct event {
int payload;
};
struct event {};
#endif // ENTT_PLUGIN_DISPATCHER_TYPES_H