Browse Source

sink::disconnect accepts also opaque pointers

Michele Caini 6 years ago
parent
commit
f8774f314b
2 changed files with 45 additions and 9 deletions
  1. 12 3
      src/entt/signal/sigh.hpp
  2. 33 6
      test/entt/signal/sigh.cpp

+ 12 - 3
src/entt/signal/sigh.hpp

@@ -409,10 +409,19 @@ public:
      * @param value_or_instance A valid reference that fits the purpose.
      */
     template<typename Type>
-    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());
     }
 

+ 33 - 6
test/entt/signal/sigh.cpp

@@ -86,7 +86,7 @@ TEST(SigH, Functions) {
     sigh.publish(v);
 
     ASSERT_FALSE(sigh.empty());
-    ASSERT_EQ(static_cast<entt::sigh<void(int &)>::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<entt::sigh<void(int &)>::size_type>(0), sigh.size());
+    ASSERT_EQ(0u, sigh.size());
+    ASSERT_EQ(v, 0);
+}
+
+TEST(SigH, FunctionsWithPayload) {
+    entt::sigh<void()> 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<entt::sigh<bool(int)>::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<entt::sigh<bool(int)>::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<entt::sigh<bool(int)>::size_type>(2), sigh.size());
+    ASSERT_EQ(2u, sigh.size());
 
     sink.disconnect(l1);
 
     ASSERT_FALSE(sigh.empty());
-    ASSERT_EQ(static_cast<entt::sigh<bool(int)>::size_type>(1), sigh.size());
+    ASSERT_EQ(1u, sigh.size());
 }
 
 TEST(SigH, Collector) {