Browse Source

sigh: internal changes

Michele Caini 1 year ago
parent
commit
3927ddeb58
2 changed files with 30 additions and 10 deletions
  1. 2 3
      src/entt/signal/sigh.hpp
  2. 28 7
      test/entt/signal/sigh.cpp

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

@@ -440,9 +440,8 @@ public:
      * @param value_or_instance A valid object that fits the purpose.
      * @param value_or_instance A valid object that fits the purpose.
      */
      */
     void disconnect(const void *value_or_instance) {
     void disconnect(const void *value_or_instance) {
-        if(value_or_instance) {
-            disconnect_if([value_or_instance](const auto &elem) { return elem.data() == value_or_instance; });
-        }
+        ENTT_ASSERT(value_or_instance != nullptr, "Invalid value or instance");
+        disconnect_if([value_or_instance](const auto &elem) { return elem.data() == value_or_instance; });
     }
     }
 
 
     /*! @brief Disconnects all the listeners from a signal. */
     /*! @brief Disconnects all the listeners from a signal. */

+ 28 - 7
test/entt/signal/sigh.cpp

@@ -70,7 +70,8 @@ TEST(SigH, Lifetime) {
     ASSERT_NO_THROW(delete new signal{});
     ASSERT_NO_THROW(delete new signal{});
 }
 }
 
 
-TEST(SigH, Clear) {
+TEST(SigH, Disconnect) {
+    sigh_listener listener;
     entt::sigh<void(int &)> sigh;
     entt::sigh<void(int &)> sigh;
     entt::sink sink{sigh};
     entt::sink sink{sigh};
 
 
@@ -79,7 +80,32 @@ TEST(SigH, Clear) {
     ASSERT_FALSE(sink.empty());
     ASSERT_FALSE(sink.empty());
     ASSERT_FALSE(sigh.empty());
     ASSERT_FALSE(sigh.empty());
 
 
-    sink.disconnect(static_cast<const void *>(nullptr));
+    sink.disconnect<&sigh_listener::f>();
+
+    ASSERT_TRUE(sink.empty());
+    ASSERT_TRUE(sigh.empty());
+
+    sink.connect<&sigh_listener::g>(listener);
+
+    ASSERT_FALSE(sink.empty());
+    ASSERT_FALSE(sigh.empty());
+
+    sink.disconnect<&sigh_listener::g>(listener);
+
+    ASSERT_TRUE(sink.empty());
+    ASSERT_TRUE(sigh.empty());
+
+    sink.connect<&sigh_listener::g>(listener);
+
+    ASSERT_FALSE(sink.empty());
+    ASSERT_FALSE(sigh.empty());
+
+    sink.disconnect(&listener);
+
+    ASSERT_TRUE(sink.empty());
+    ASSERT_TRUE(sigh.empty());
+
+    sink.connect<&sigh_listener::f>();
 
 
     ASSERT_FALSE(sink.empty());
     ASSERT_FALSE(sink.empty());
     ASSERT_FALSE(sigh.empty());
     ASSERT_FALSE(sigh.empty());
@@ -186,11 +212,6 @@ TEST(SigH, Members) {
     ASSERT_FALSE(sigh.empty());
     ASSERT_FALSE(sigh.empty());
     ASSERT_EQ(sigh.size(), 2u);
     ASSERT_EQ(sigh.size(), 2u);
 
 
-    sink.disconnect(static_cast<const void *>(nullptr));
-
-    ASSERT_FALSE(sigh.empty());
-    ASSERT_EQ(sigh.size(), 2u);
-
     sink.disconnect(&l1);
     sink.disconnect(&l1);
 
 
     ASSERT_FALSE(sigh.empty());
     ASSERT_FALSE(sigh.empty());