diff options
author | Nao Pross <naopross@thearcway.org> | 2019-01-27 13:03:57 +0100 |
---|---|---|
committer | Nao Pross <naopross@thearcway.org> | 2019-01-27 13:03:57 +0100 |
commit | 7f181b94d81a4232073817a8121cb16d879f48e7 (patch) | |
tree | 3808aa7e6b95a8c174d9b3a589c8b8a139e49d5d | |
parent | Update lib/libwsdl2 (diff) | |
download | flatland-7f181b94d81a4232073817a8121cb16d879f48e7.tar.gz flatland-7f181b94d81a4232073817a8121cb16d879f48e7.zip |
Fix signal listener removal
Beacuse std::remove_if() does not *erase* elements, it only moves
them to the end of the container.
-rw-r--r-- | engine/signal.cpp | 25 |
1 files 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<listener> p){ - - listener::ptr pt = p.lock(); - return pt.get() == l.get(); - }); + listeners.erase( + std::remove_if( + listeners.begin(), + listeners.end(), + [&l](std::weak_ptr<listener> 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<listener> e) { return e.expired(); }); + listeners.erase( + std::remove_if( + listeners.begin(), + listeners.end(), + [](std::weak_ptr<listener> e) { return e.expired(); } + ) + ); stack.clear(); // TODO not so efficient } |