Răsfoiți Sursa

sigh: cleanup to reduce redundancy

Michele Caini 3 ani în urmă
părinte
comite
ee67032af1
1 a modificat fișierele cu 19 adăugiri și 53 ștergeri
  1. 19 53
      src/entt/signal/sigh.hpp

+ 19 - 53
src/entt/signal/sigh.hpp

@@ -476,81 +476,47 @@ public:
     }
 
     /**
-     * @brief Connects a free function or an unbound member to a signal.
+     * @brief Connects a free function (with or without payload), a bound or an
+     * unbound member to a signal.
      *
-     * The signal handler performs checks to avoid multiple connections for the
-     * same function.
-     *
-     * @tparam Candidate Function or member to connect to the signal.
-     * @return A properly initialized connection object.
-     */
-    template<auto Candidate>
-    connection connect() {
-        disconnect<Candidate>();
-
-        delegate<Ret(Args...)> call{};
-        call.template connect<Candidate>();
-        signal->calls.insert(signal->calls.end() - offset, std::move(call));
-
-        delegate<void(void *)> conn{};
-        conn.template connect<&release<Candidate>>();
-        return {std::move(conn), signal};
-    }
-
-    /**
-     * @brief Connects a free function with payload or a bound member to a
-     * signal.
-     *
-     * The signal isn't responsible for the connected object or the payload.
-     * Users must always guarantee that the lifetime of the instance overcomes
-     * the one of the signal. On the other side, the signal handler performs
+     * The signal isn't responsible for the connected object or the payload, if
+     * any. Users must guarantee that the lifetime of the instance overcomes the
+     * one of the signal. On the other side, the signal handler performs
      * checks to avoid multiple connections for the same function.<br/>
      * When used to connect a free function with payload, its signature must be
      * such that the instance is the first argument before the ones used to
      * define the signal itself.
      *
      * @tparam Candidate Function or member to connect to the signal.
-     * @tparam Type Type of class or type of payload.
-     * @param value_or_instance A valid object that fits the purpose.
+     * @tparam Type Type of class or type of payload, if any.
+     * @param value_or_instance A valid object that fits the purpose, if any.
      * @return A properly initialized connection object.
      */
-    template<auto Candidate, typename Type>
-    connection connect(Type &&value_or_instance) {
-        disconnect<Candidate>(value_or_instance);
+    template<auto Candidate, typename... Type>
+    connection connect(Type &&...value_or_instance) {
+        disconnect<Candidate>(value_or_instance...);
 
         delegate<Ret(Args...)> call{};
-        call.template connect<Candidate>(value_or_instance);
+        call.template connect<Candidate>(value_or_instance...);
         signal->calls.insert(signal->calls.end() - offset, std::move(call));
 
         delegate<void(void *)> conn{};
-        conn.template connect<&release<Candidate, Type>>(value_or_instance);
+        conn.template connect<&release<Candidate, Type...>>(value_or_instance...);
         return {std::move(conn), signal};
     }
 
     /**
-     * @brief Disconnects a free function or an unbound member from a signal.
+     * @brief Disconnects a free function (with or without payload), a bound or
+     * an unbound member from a signal.
      * @tparam Candidate Function or member to disconnect from the signal.
+     * @tparam Type Type of class or type of payload, if any.
+     * @param value_or_instance A valid object that fits the purpose, if any.
      */
-    template<auto Candidate>
-    void disconnect() {
+    template<auto Candidate, typename... Type>
+    void disconnect(Type &&...value_or_instance) {
         auto &calls = signal->calls;
         delegate<Ret(Args...)> call{};
-        call.template connect<Candidate>();
-        calls.erase(std::remove(calls.begin(), calls.end(), std::move(call)), calls.end());
-    }
-
-    /**
-     * @brief Disconnects a free function with payload or a bound member from a
-     * signal.
-     * @tparam Candidate Function or member to disconnect from the signal.
-     * @tparam Type Type of class or type of payload.
-     * @param value_or_instance A valid object that fits the purpose.
-     */
-    template<auto Candidate, typename Type>
-    void disconnect(Type &&value_or_instance) {
-        auto &calls = signal->calls;
-        delegate<Ret(Args...)> call{};
-        call.template connect<Candidate>(value_or_instance);
+        call.template connect<Candidate>(value_or_instance...);
         calls.erase(std::remove(calls.begin(), calls.end(), std::move(call)), calls.end());
     }