From 6b005dec3d18f2e85d8afedf44e23f62c3f22b23 Mon Sep 17 00:00:00 2001 From: Michele Caini Date: Thu, 5 Sep 2019 23:23:21 +0200 Subject: [PATCH] sink::disconnect accepts also opaque pointers --- src/entt/signal/sigh.hpp | 15 ++++++++++++--- test/entt/signal/sigh.cpp | 39 +++++++++++++++++++++++++++++++++------ 2 files changed, 45 insertions(+), 9 deletions(-) diff --git a/src/entt/signal/sigh.hpp b/src/entt/signal/sigh.hpp index 165ea8f0e8..b90e5f9ee8 100644 --- a/src/entt/signal/sigh.hpp +++ b/src/entt/signal/sigh.hpp @@ -409,10 +409,19 @@ class sink { * @param value_or_instance A valid reference that fits the purpose. */ template - void disconnect(const Type &value_or_instance) { + void disconnect(Type &value_or_instance) { + disconnect(&value_or_instance); + } + + /** + * @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) { 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.erase(std::remove_if(calls.begin(), calls.end(), [value_or_instance](const auto &delegate) { + return delegate.instance() == value_or_instance; }), calls.end()); } diff --git a/test/entt/signal/sigh.cpp b/test/entt/signal/sigh.cpp index f9d927ecc6..5aa651b6f6 100644 --- a/test/entt/signal/sigh.cpp +++ b/test/entt/signal/sigh.cpp @@ -86,7 +86,7 @@ TEST(SigH, Functions) { sigh.publish(v); ASSERT_FALSE(sigh.empty()); - ASSERT_EQ(static_cast::size_type>(1), sigh.size()); + ASSERT_EQ(1u, sigh.size()); ASSERT_EQ(42, v); v = 0; @@ -94,7 +94,34 @@ TEST(SigH, Functions) { sigh.publish(v); ASSERT_TRUE(sigh.empty()); - ASSERT_EQ(static_cast::size_type>(0), sigh.size()); + ASSERT_EQ(0u, sigh.size()); + ASSERT_EQ(v, 0); +} + +TEST(SigH, FunctionsWithPayload) { + entt::sigh sigh; + entt::sink sink{sigh}; + int v = 0; + + sink.connect<&sigh_listener::f>(v); + sigh.publish(); + + ASSERT_FALSE(sigh.empty()); + ASSERT_EQ(1u, sigh.size()); + ASSERT_EQ(42, v); + + v = 0; + sink.disconnect<&sigh_listener::f>(v); + sigh.publish(); + + ASSERT_TRUE(sigh.empty()); + ASSERT_EQ(0u, sigh.size()); + ASSERT_EQ(v, 0); + + sink.connect<&sigh_listener::f>(v); + sink.disconnect(v); + sigh.publish(); + ASSERT_EQ(v, 0); } @@ -108,25 +135,25 @@ TEST(SigH, Members) { ASSERT_TRUE(l1.k); ASSERT_FALSE(sigh.empty()); - ASSERT_EQ(static_cast::size_type>(1), sigh.size()); + ASSERT_EQ(1u, sigh.size()); sink.disconnect<&sigh_listener::g>(l1); sigh.publish(42); ASSERT_TRUE(l1.k); ASSERT_TRUE(sigh.empty()); - ASSERT_EQ(static_cast::size_type>(0), sigh.size()); + ASSERT_EQ(0u, sigh.size()); sink.connect<&sigh_listener::g>(l1); sink.connect<&sigh_listener::h>(l2); ASSERT_FALSE(sigh.empty()); - ASSERT_EQ(static_cast::size_type>(2), sigh.size()); + ASSERT_EQ(2u, sigh.size()); sink.disconnect(l1); ASSERT_FALSE(sigh.empty()); - ASSERT_EQ(static_cast::size_type>(1), sigh.size()); + ASSERT_EQ(1u, sigh.size()); } TEST(SigH, Collector) {