diff --git a/src/entt/signal/sigh.hpp b/src/entt/signal/sigh.hpp index a25221cb3..2f9e9c131 100644 --- a/src/entt/signal/sigh.hpp +++ b/src/entt/signal/sigh.hpp @@ -375,33 +375,31 @@ public: * @brief Returns a sink that connects before a given instance or specific * payload. * @tparam Type Type of class or type of payload. - * @param value_or_instance A valid reference that fits the purpose. + * @param value_or_instance A valid object that fits the purpose. * @return A properly initialized sink object. */ template - sink before(Type &value_or_instance) { - return before(&value_or_instance); - } + sink before(Type &&value_or_instance) { + auto func = [this](const void *instance) { + sink other{*this}; - /** - * @brief Returns a sink that connects before a given opaque instance or - * payload. - * @param value_or_instance An opaque pointer that fits the purpose. - * @return A properly initialized sink object. - */ - sink before(const void *value_or_instance) { - sink other{*this}; + if(instance) { + const auto &calls = signal->calls; + const auto it = std::find_if(calls.cbegin(), calls.cend(), [instance](const auto &delegate) { + return delegate.instance() == instance; + }); - if(value_or_instance) { - const auto &calls = signal->calls; - const auto it = std::find_if(calls.cbegin(), calls.cend(), [value_or_instance](const auto &delegate) { - return delegate.instance() == value_or_instance; - }); + other.offset = std::distance(it, calls.cend()); + } - other.offset = std::distance(it, calls.cend()); + return other; + }; + + if constexpr(std::is_pointer_v>) { + return func(value_or_instance); + } else { + return func(&value_or_instance); } - - return other; } /** @@ -497,24 +495,23 @@ public: * @brief Disconnects member functions or free functions based on an * instance or specific payload. * @tparam Type Type of class or type of payload. - * @param value_or_instance A valid reference that fits the purpose. + * @param value_or_instance A valid object that fits the purpose. */ template - void disconnect(Type &value_or_instance) { - disconnect(&value_or_instance); - } + void disconnect(Type &&value_or_instance) { + auto func = [this](const void *instance) { + if(instance) { + auto &calls = signal->calls; + calls.erase(std::remove_if(calls.begin(), calls.end(), [instance](const auto &delegate) { + return delegate.instance() == instance; + }), calls.end()); + } + }; - /** - * @brief Disconnects member functions or free functions based on an opaque - * instance or payload. - * @param value_or_instance An opaque pointer that fits the purpose. - */ - void disconnect(const void *value_or_instance) { - if(value_or_instance) { - auto &calls = signal->calls; - calls.erase(std::remove_if(calls.begin(), calls.end(), [value_or_instance](const auto &delegate) { - return delegate.instance() == value_or_instance; - }), calls.end()); + if constexpr(std::is_pointer_v>) { + func(value_or_instance); + } else { + func(&value_or_instance); } } diff --git a/test/entt/signal/sigh.cpp b/test/entt/signal/sigh.cpp index ffc295ec4..e994a95b2 100644 --- a/test/entt/signal/sigh.cpp +++ b/test/entt/signal/sigh.cpp @@ -176,7 +176,7 @@ TEST_F(SigH, Members) { ASSERT_FALSE(sigh.empty()); ASSERT_EQ(2u, sigh.size()); - sink.disconnect(l1); + sink.disconnect(&l1); ASSERT_FALSE(sigh.empty()); ASSERT_EQ(1u, sigh.size());