Przeglądaj źródła

dispatcher: added discard to free explicitly a pool

Michele Caini 6 lat temu
rodzic
commit
9457a55910

+ 11 - 0
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<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.
      *

+ 3 - 2
test/lib/dispatcher/lib.cpp

@@ -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 - 8
test/lib/dispatcher/main.cpp

@@ -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);
-    dispatcher.sink<message>().connect<entt::overload<void(message)>(&listener::on)>(listener);
-    dispatcher.trigger<event>(3);
-
-    ASSERT_EQ(listener.value, 3);
+    ASSERT_EQ(listener.value, 0);
 
-    trigger(42, dispatcher);
+    dispatcher.sink<message>().connect<entt::overload<void(message)>(&listener::on)>(listener);
+    trigger(dispatcher);
 
     ASSERT_EQ(listener.value, 42);
 }

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

+ 2 - 5
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<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;

+ 4 - 1
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<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;
     }

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