dispatcher: added discard to free explicitly a pool
This commit is contained in:
@@ -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.
|
||||
*
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -5,8 +5,6 @@ struct message {
|
||||
int payload;
|
||||
};
|
||||
|
||||
struct event {
|
||||
int payload;
|
||||
};
|
||||
struct event {};
|
||||
|
||||
#endif // ENTT_LIB_DISPATCHER_TYPES_H
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -5,8 +5,6 @@ struct message {
|
||||
int payload;
|
||||
};
|
||||
|
||||
struct event {
|
||||
int payload;
|
||||
};
|
||||
struct event {};
|
||||
|
||||
#endif // ENTT_PLUGIN_DISPATCHER_TYPES_H
|
||||
|
||||
Reference in New Issue
Block a user