From 7f181b94d81a4232073817a8121cb16d879f48e7 Mon Sep 17 00:00:00 2001 From: Nao Pross Date: Sun, 27 Jan 2019 13:03:57 +0100 Subject: Fix signal listener removal Beacuse std::remove_if() does not *erase* elements, it only moves them to the end of the container. --- engine/signal.cpp | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/engine/signal.cpp b/engine/signal.cpp index 0a57caa..7688785 100644 --- a/engine/signal.cpp +++ b/engine/signal.cpp @@ -67,12 +67,16 @@ bool channel::connect(listener::ptr l) void channel::disconnect(listener::ptr l) { - listeners.remove_if( - [l](std::weak_ptr p){ - - listener::ptr pt = p.lock(); - return pt.get() == l.get(); - }); + listeners.erase( + std::remove_if( + listeners.begin(), + listeners.end(), + [&l](std::weak_ptr p){ + listener::ptr pt = p.lock(); + return pt.get() == l.get(); + } + ) + ); } bool channel::connect(listener* l) @@ -146,8 +150,13 @@ void channel::check_and_call() } /* Erase invalidated listeners */ - listeners.remove_if( - [](std::weak_ptr e) { return e.expired(); }); + listeners.erase( + std::remove_if( + listeners.begin(), + listeners.end(), + [](std::weak_ptr e) { return e.expired(); } + ) + ); stack.clear(); // TODO not so efficient } -- cgit v1.2.1