Pārlūkot izejas kodu

emitter: added discard to free explicitly a pool

Michele Caini 6 gadi atpakaļ
vecāks
revīzija
95fd4e4c99

+ 11 - 0
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<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 Emits the given event.
      *

+ 4 - 2
test/lib/emitter/lib.cpp

@@ -2,6 +2,8 @@
 #include <entt/signal/emitter.hpp>
 #include "types.h"
 
-ENTT_API void emit(int value, test_emitter &emitter) {
-    emitter.publish<message>(value);
+ENTT_API void emit(test_emitter &emitter) {
+    emitter.publish<event>();
+    emitter.publish<message>(42);
+    emitter.publish<message>(3);
 }

+ 4 - 8
test/lib/emitter/main.cpp

@@ -3,20 +3,16 @@
 #include <entt/signal/emitter.hpp>
 #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>([&](event ev, test_emitter &) { value = ev.payload; });
-    emitter.once<message>([&](message msg, test_emitter &) { value = msg.payload; });
-    emitter.publish<event>(3);
-
-    ASSERT_EQ(value, 3);
+    ASSERT_EQ(value, 0);
 
-    emit(42, emitter);
-    emit(3, emitter);
+    emitter.once<message>([&](message msg, test_emitter &) { value = msg.payload; });
+    emit(emitter);
 
     ASSERT_EQ(value, 42);
 }

+ 1 - 3
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

+ 2 - 4
test/plugin/emitter/main.cpp

@@ -9,11 +9,9 @@ TEST(Lib, Emitter) {
     test_emitter emitter;
     int value{};
 
-    emitter.once<event>([&](event ev, test_emitter &) { value = ev.payload; });
-    emitter.once<message>([&](message msg, test_emitter &) { value = msg.payload; });
-    emitter.publish<event>(3);
+    ASSERT_EQ(value, 0);
 
-    ASSERT_EQ(value, 3);
+    emitter.once<message>([&](message msg, test_emitter &) { value = msg.payload; });
 
     cr_plugin ctx;
     ctx.userdata = &emitter;

+ 4 - 1
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<test_emitter *>(ctx->userdata)->publish<event>();
         static_cast<test_emitter *>(ctx->userdata)->publish<message>(42);
         static_cast<test_emitter *>(ctx->userdata)->publish<message>(3);
         break;
+    case CR_CLOSE:
+        static_cast<test_emitter *>(ctx->userdata)->discard<event>();
+        break;
     case CR_LOAD:
     case CR_UNLOAD:
-    case CR_CLOSE:
         // nothing to do here, this is only a test.
         break;
     }

+ 1 - 3
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