summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNao Pross <naopross@thearcway.org>2019-01-27 13:03:57 +0100
committerNao Pross <naopross@thearcway.org>2019-01-27 13:03:57 +0100
commit7f181b94d81a4232073817a8121cb16d879f48e7 (patch)
tree3808aa7e6b95a8c174d9b3a589c8b8a139e49d5d
parentUpdate lib/libwsdl2 (diff)
downloadflatland-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.cpp25
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
}