|
|
@@ -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());
|
|
|
}
|
|
|
|