Browse Source

dispatcher: allow for deduced types for events

Michele Caini 7 years ago
parent
commit
0a34f22240
2 changed files with 35 additions and 4 deletions
  1. 29 1
      src/entt/signal/dispatcher.hpp
  2. 6 3
      test/entt/signal/dispatcher.cpp

+ 29 - 1
src/entt/signal/dispatcher.hpp

@@ -128,13 +128,27 @@ public:
         wrapper<Event>().trigger(std::forward<Args>(args)...);
     }
 
+    /**
+     * @brief Triggers an immediate event of the given type.
+     *
+     * All the listeners registered for the given type are immediately notified.
+     * The event is discarded after the execution.
+     *
+     * @tparam Event Type of event to trigger.
+     * @param event An instance of the given type of event.
+     */
+    template<typename Event>
+    inline void trigger(Event &&event) {
+        wrapper<std::decay_t<Event>>().trigger(std::forward<Event>(event));
+    }
+
     /**
      * @brief Enqueues an event of the given type.
      *
      * An event of the given type is queued. No listener is invoked. Use the
      * `update` member function to notify listeners when ready.
      *
-     * @tparam Event Type of event to trigger.
+     * @tparam Event Type of event to enqueue.
      * @tparam Args Types of arguments to use to construct the event.
      * @param args Arguments to use to construct the event.
      */
@@ -143,6 +157,20 @@ public:
         wrapper<Event>().enqueue(std::forward<Args>(args)...);
     }
 
+    /**
+     * @brief Enqueues an event of the given type.
+     *
+     * An event of the given type is queued. No listener is invoked. Use the
+     * `update` member function to notify listeners when ready.
+     *
+     * @tparam Event Type of event to enqueue.
+     * @param event An instance of the given type of event.
+     */
+    template<typename Event>
+    inline void enqueue(Event &&event) {
+        wrapper<std::decay_t<Event>>().enqueue(std::forward<Event>(event));
+    }
+
     /**
      * @brief Delivers all the pending events of the given type.
      *

+ 6 - 3
test/entt/signal/dispatcher.cpp

@@ -30,11 +30,14 @@ TEST(Dispatcher, Functionalities) {
 
     receiver.reset();
 
+    an_event event{};
+    const an_event &cevent = event;
+
     dispatcher.template sink<an_event>().disconnect(&receiver);
-    dispatcher.template trigger<an_event>();
-    dispatcher.template enqueue<an_event>();
+    dispatcher.template trigger(an_event{});
+    dispatcher.template enqueue(event);
     dispatcher.update();
-    dispatcher.template trigger<an_event>();
+    dispatcher.template trigger(cevent);
 
     ASSERT_EQ(receiver.cnt, 0);
 }