From 9457a55910765325286db3fd581771961ba797f0 Mon Sep 17 00:00:00 2001 From: Michele Caini Date: Sat, 21 Dec 2019 17:24:58 +0100 Subject: [PATCH] dispatcher: added discard to free explicitly a pool --- src/entt/signal/dispatcher.hpp | 11 +++++++++++ test/lib/dispatcher/lib.cpp | 5 +++-- test/lib/dispatcher/main.cpp | 12 ++++-------- test/lib/dispatcher/types.h | 4 +--- test/plugin/dispatcher/main.cpp | 7 ++----- test/plugin/dispatcher/plugin.cpp | 5 ++++- test/plugin/dispatcher/types.h | 4 +--- 7 files changed, 26 insertions(+), 22 deletions(-) diff --git a/src/entt/signal/dispatcher.hpp b/src/entt/signal/dispatcher.hpp index 219b40486..9ceee9160 100644 --- a/src/entt/signal/dispatcher.hpp +++ b/src/entt/signal/dispatcher.hpp @@ -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 + void discard() { + pools.erase(std::remove_if(pools.begin(), pools.end(), [](auto &&cpool) { + return ((cpool->id() == type_id_v) || ...); + }), pools.end()); + } + /** * @brief Returns a sink object for the given event. * diff --git a/test/lib/dispatcher/lib.cpp b/test/lib/dispatcher/lib.cpp index 82c00e3c3..3641667fe 100644 --- a/test/lib/dispatcher/lib.cpp +++ b/test/lib/dispatcher/lib.cpp @@ -2,6 +2,7 @@ #include #include "types.h" -ENTT_API void trigger(int value, entt::dispatcher &dispatcher) { - dispatcher.trigger(value); +ENTT_API void trigger(entt::dispatcher &dispatcher) { + dispatcher.trigger(); + dispatcher.trigger(42); } diff --git a/test/lib/dispatcher/main.cpp b/test/lib/dispatcher/main.cpp index 9d4041a5c..73998534b 100644 --- a/test/lib/dispatcher/main.cpp +++ b/test/lib/dispatcher/main.cpp @@ -4,10 +4,9 @@ #include #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().connect(&listener::on)>(listener); + ASSERT_EQ(listener.value, 0); + dispatcher.sink().connect(&listener::on)>(listener); - dispatcher.trigger(3); - - ASSERT_EQ(listener.value, 3); - - trigger(42, dispatcher); + trigger(dispatcher); ASSERT_EQ(listener.value, 42); } diff --git a/test/lib/dispatcher/types.h b/test/lib/dispatcher/types.h index ad2e78b9a..124f13a81 100644 --- a/test/lib/dispatcher/types.h +++ b/test/lib/dispatcher/types.h @@ -5,8 +5,6 @@ struct message { int payload; }; -struct event { - int payload; -}; +struct event {}; #endif // ENTT_LIB_DISPATCHER_TYPES_H diff --git a/test/plugin/dispatcher/main.cpp b/test/plugin/dispatcher/main.cpp index f698af371..7cfd793dd 100644 --- a/test/plugin/dispatcher/main.cpp +++ b/test/plugin/dispatcher/main.cpp @@ -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().connect(&listener::on)>(listener); - dispatcher.sink().connect(&listener::on)>(listener); - dispatcher.trigger(3); + ASSERT_EQ(listener.value, 0); - ASSERT_EQ(listener.value, 3); + dispatcher.sink().connect(&listener::on)>(listener); cr_plugin ctx; ctx.userdata = &dispatcher; diff --git a/test/plugin/dispatcher/plugin.cpp b/test/plugin/dispatcher/plugin.cpp index 6ab54f430..7b0f930a3 100644 --- a/test/plugin/dispatcher/plugin.cpp +++ b/test/plugin/dispatcher/plugin.cpp @@ -5,11 +5,14 @@ CR_EXPORT int cr_main(cr_plugin *ctx, cr_op operation) { switch (operation) { case CR_STEP: + static_cast(ctx->userdata)->trigger(); static_cast(ctx->userdata)->trigger(42); break; + case CR_CLOSE: + static_cast(ctx->userdata)->discard(); + break; case CR_LOAD: case CR_UNLOAD: - case CR_CLOSE: // nothing to do here, this is only a test. break; } diff --git a/test/plugin/dispatcher/types.h b/test/plugin/dispatcher/types.h index 8bd52cd85..662bbf6ef 100644 --- a/test/plugin/dispatcher/types.h +++ b/test/plugin/dispatcher/types.h @@ -5,8 +5,6 @@ struct message { int payload; }; -struct event { - int payload; -}; +struct event {}; #endif // ENTT_PLUGIN_DISPATCHER_TYPES_H