From 95fd4e4c9946321241538dcf6a2f51f938205b14 Mon Sep 17 00:00:00 2001 From: Michele Caini Date: Sat, 21 Dec 2019 17:32:17 +0100 Subject: [PATCH] emitter: added discard to free explicitly a pool --- src/entt/signal/emitter.hpp | 11 +++++++++++ test/lib/emitter/lib.cpp | 6 ++++-- test/lib/emitter/main.cpp | 12 ++++-------- test/lib/emitter/types.h | 4 +--- test/plugin/emitter/main.cpp | 6 ++---- test/plugin/emitter/plugin.cpp | 5 ++++- test/plugin/emitter/types.h | 4 +--- 7 files changed, 27 insertions(+), 21 deletions(-) diff --git a/src/entt/signal/emitter.hpp b/src/entt/signal/emitter.hpp index 19032629f..ed3bca079 100644 --- a/src/entt/signal/emitter.hpp +++ b/src/entt/signal/emitter.hpp @@ -186,6 +186,17 @@ public: /*! @brief Default move assignment operator. @return This emitter. */ emitter & operator=(emitter &&) = default; + /** + * @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 Emits the given event. * diff --git a/test/lib/emitter/lib.cpp b/test/lib/emitter/lib.cpp index e5c9b43d0..e9c4594dc 100644 --- a/test/lib/emitter/lib.cpp +++ b/test/lib/emitter/lib.cpp @@ -2,6 +2,8 @@ #include #include "types.h" -ENTT_API void emit(int value, test_emitter &emitter) { - emitter.publish(value); +ENTT_API void emit(test_emitter &emitter) { + emitter.publish(); + emitter.publish(42); + emitter.publish(3); } diff --git a/test/lib/emitter/main.cpp b/test/lib/emitter/main.cpp index 340bebd8d..9c879a0dd 100644 --- a/test/lib/emitter/main.cpp +++ b/test/lib/emitter/main.cpp @@ -3,20 +3,16 @@ #include #include "types.h" -ENTT_API void emit(int, test_emitter &); +ENTT_API void emit(test_emitter &); TEST(Lib, Emitter) { test_emitter emitter; int value{}; - emitter.once([&](event ev, test_emitter &) { value = ev.payload; }); + ASSERT_EQ(value, 0); + emitter.once([&](message msg, test_emitter &) { value = msg.payload; }); - emitter.publish(3); - - ASSERT_EQ(value, 3); - - emit(42, emitter); - emit(3, emitter); + emit(emitter); ASSERT_EQ(value, 42); } diff --git a/test/lib/emitter/types.h b/test/lib/emitter/types.h index 41274e899..c804802e4 100644 --- a/test/lib/emitter/types.h +++ b/test/lib/emitter/types.h @@ -11,8 +11,6 @@ struct message { int payload; }; -struct event { - int payload; -}; +struct event {}; #endif // ENTT_LIB_EMITTER_TYPES_H diff --git a/test/plugin/emitter/main.cpp b/test/plugin/emitter/main.cpp index 7d09d6300..e6bfb45b5 100644 --- a/test/plugin/emitter/main.cpp +++ b/test/plugin/emitter/main.cpp @@ -9,11 +9,9 @@ TEST(Lib, Emitter) { test_emitter emitter; int value{}; - emitter.once([&](event ev, test_emitter &) { value = ev.payload; }); - emitter.once([&](message msg, test_emitter &) { value = msg.payload; }); - emitter.publish(3); + ASSERT_EQ(value, 0); - ASSERT_EQ(value, 3); + emitter.once([&](message msg, test_emitter &) { value = msg.payload; }); cr_plugin ctx; ctx.userdata = &emitter; diff --git a/test/plugin/emitter/plugin.cpp b/test/plugin/emitter/plugin.cpp index d37d47e00..d3a87f3d9 100644 --- a/test/plugin/emitter/plugin.cpp +++ b/test/plugin/emitter/plugin.cpp @@ -5,12 +5,15 @@ CR_EXPORT int cr_main(cr_plugin *ctx, cr_op operation) { switch (operation) { case CR_STEP: + static_cast(ctx->userdata)->publish(); static_cast(ctx->userdata)->publish(42); static_cast(ctx->userdata)->publish(3); 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/emitter/types.h b/test/plugin/emitter/types.h index dc1af255b..01902f25c 100644 --- a/test/plugin/emitter/types.h +++ b/test/plugin/emitter/types.h @@ -11,8 +11,6 @@ struct message { int payload; }; -struct event { - int payload; -}; +struct event {}; #endif // ENTT_PLUGIN_EMITTER_TYPES_H