Skip to content

Commit

Permalink
sink::disconnect accepts also opaque pointers
Browse files Browse the repository at this point in the history
  • Loading branch information
skypjack committed Sep 5, 2019
1 parent ab22364 commit 6b005de
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 9 deletions.
15 changes: 12 additions & 3 deletions src/entt/signal/sigh.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -409,10 +409,19 @@ class sink<Ret(Args...)> {
* @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());
}

Expand Down
39 changes: 33 additions & 6 deletions test/entt/signal/sigh.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,15 +86,42 @@ 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;
sink.disconnect<&sigh_listener::f>();
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);
}

Expand All @@ -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) {
Expand Down

0 comments on commit 6b005de

Please sign in to comment.