Przeglądaj źródła

dispatcher: the event isn't const by default anymore (see #547)

Michele Caini 5 lat temu
rodzic
commit
9b24655bbf

+ 3 - 3
docs/md/signal.md

@@ -387,9 +387,9 @@ entt::dispatcher dispatcher{};
 ```
 ```
 
 
 In order to register an instance of a class to a dispatcher, its type must
 In order to register an instance of a class to a dispatcher, its type must
-expose one or more member functions the arguments of which are such that
-`const E &` can be converted to them for each type of event `E`, no matter what
-the return value is.<br/>
+expose one or more member functions the arguments of which are such that `E &`
+can be converted to them for each type of event `E`, no matter what the return
+value is.<br/>
 The name of the member function aimed to receive the event must be provided to
 The name of the member function aimed to receive the event must be provided to
 the `connect` member function of the sink in charge for the specific event:
 the `connect` member function of the sink in charge for the specific event:
 
 

+ 6 - 5
src/entt/signal/dispatcher.hpp

@@ -23,7 +23,7 @@ namespace entt {
  * events to be published all together once per tick.<br/>
  * events to be published all together once per tick.<br/>
  * Listeners are provided in the form of member functions. For each event of
  * Listeners are provided in the form of member functions. For each event of
  * type `Event`, listeners are such that they can be invoked with an argument of
  * type `Event`, listeners are such that they can be invoked with an argument of
- * type `const Event &`, no matter what the return type is.
+ * type `Event &`, no matter what the return type is.
  *
  *
  * The dispatcher creates instances of the `sigh` class internally. Refer to the
  * The dispatcher creates instances of the `sigh` class internally. Refer to the
  * documentation of the latter for more details.
  * documentation of the latter for more details.
@@ -39,7 +39,7 @@ class dispatcher {
 
 
     template<typename Event>
     template<typename Event>
     struct pool_handler final: basic_pool {
     struct pool_handler final: basic_pool {
-        using signal_type = sigh<void(const Event &)>;
+        using signal_type = sigh<void(Event &)>;
         using sink_type = typename signal_type::sink_type;
         using sink_type = typename signal_type::sink_type;
 
 
         void publish() override {
         void publish() override {
@@ -66,7 +66,8 @@ class dispatcher {
 
 
         template<typename... Args>
         template<typename... Args>
         void trigger(Args &&... args) {
         void trigger(Args &&... args) {
-            signal.publish(Event{std::forward<Args>(args)...});
+            Event instance{std::forward<Args>(args)...};
+            signal.publish(instance);
         }
         }
 
 
         template<typename... Args>
         template<typename... Args>
@@ -115,9 +116,9 @@ public:
      *
      *
      * A sink is an opaque object used to connect listeners to events.
      * A sink is an opaque object used to connect listeners to events.
      *
      *
-     * The function type for a listener is:
+     * The function type for a listener is _compatible_ with:
      * @code{.cpp}
      * @code{.cpp}
-     * void(const Event &);
+     * void(Event &);
      * @endcode
      * @endcode
      *
      *
      * The order of invocation of the listeners isn't guaranteed.
      * The order of invocation of the listeners isn't guaranteed.

+ 1 - 1
test/entt/signal/dispatcher.cpp

@@ -8,7 +8,7 @@ struct another_event {};
 struct one_more_event {};
 struct one_more_event {};
 
 
 struct receiver {
 struct receiver {
-    static void forward(entt::dispatcher &dispatcher, const an_event &event) {
+    static void forward(entt::dispatcher &dispatcher, an_event &event) {
         dispatcher.enqueue(event);
         dispatcher.enqueue(event);
     }
     }