Explorar o código

sink::[before|disconnect]: const void * -> Type *

Michele Caini %!s(int64=6) %!d(string=hai) anos
pai
achega
d525a1536c
Modificáronse 2 ficheiros con 14 adicións e 35 borrados
  1. 12 7
      src/entt/signal/sigh.hpp
  2. 2 28
      test/entt/signal/sigh.cpp

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

@@ -405,11 +405,14 @@ public:
     }
 
     /**
-     * @brief Returns a sink that connects before an opaque instance or payload.
-     * @param value_or_instance An opaque pointer that fits the purpose.
+     * @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 pointer that fits the purpose.
      * @return A properly initialized sink object.
      */
-    sink before(const void *value_or_instance) {
+    template<typename Type>
+    sink before(Type *value_or_instance) {
         sink other{*this};
 
         if(value_or_instance) {
@@ -570,11 +573,13 @@ public:
     }
 
     /**
-     * @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.
+     * @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 pointer that fits the purpose.
      */
-    void disconnect(const void *value_or_instance) {
+    template<typename Type>
+    void disconnect(Type *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) {

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

@@ -64,7 +64,7 @@ TEST_F(SigH, Clear) {
     ASSERT_FALSE(sink.empty());
     ASSERT_FALSE(sigh.empty());
 
-    sink.disconnect(nullptr);
+    sink.disconnect(static_cast<const void *>(nullptr));
 
     ASSERT_FALSE(sink.empty());
     ASSERT_FALSE(sigh.empty());
@@ -171,7 +171,7 @@ TEST_F(SigH, Members) {
     ASSERT_FALSE(sigh.empty());
     ASSERT_EQ(2u, sigh.size());
 
-    sink.disconnect(nullptr);
+    sink.disconnect(static_cast<const void *>(nullptr));
 
     ASSERT_FALSE(sigh.empty());
     ASSERT_EQ(2u, sigh.size());
@@ -400,32 +400,6 @@ TEST_F(SigH, BeforeInstanceOrPayload) {
     ASSERT_EQ(functor.value, 6);
 }
 
-TEST_F(SigH, BeforeOpaqueInstanceOrPayload) {
-    entt::sigh<void(int)> sigh;
-    entt::sink sink{sigh};
-    before_after functor;
-
-    sink.connect<&before_after::static_mul>(functor);
-    sink.connect<&before_after::add>(functor);
-    sink.before(&functor).connect<&before_after::static_add>();
-    sigh.publish(2);
-
-    ASSERT_EQ(functor.value, 6);
-}
-
-TEST_F(SigH, BeforeNullOpaqueInstanceOrPayload) {
-    entt::sigh<void(int)> sigh;
-    entt::sink sink{sigh};
-    before_after functor;
-
-    sink.connect<&before_after::static_mul>(functor);
-    sink.connect<&before_after::add>(functor);
-    sink.before(nullptr).connect<&before_after::static_add>();
-    sigh.publish(2);
-
-    ASSERT_EQ(functor.value, 4);
-}
-
 TEST_F(SigH, BeforeAnythingElse) {
     entt::sigh<void(int)> sigh;
     entt::sink sink{sigh};