From cb49910ed294a169508bd871a310fdd2329211dd Mon Sep 17 00:00:00 2001 From: Michele Caini Date: Fri, 29 Dec 2017 18:25:49 +0100 Subject: [PATCH] allow attaching listeners at any time, allow removing current listener --- src/entt/signal/dispatcher.hpp | 4 +++- src/entt/signal/sigh.hpp | 7 +++++-- src/entt/signal/signal.hpp | 12 +++++++++--- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/entt/signal/dispatcher.hpp b/src/entt/signal/dispatcher.hpp index 746512007..df6e253f1 100644 --- a/src/entt/signal/dispatcher.hpp +++ b/src/entt/signal/dispatcher.hpp @@ -181,7 +181,9 @@ public: const auto buf = buffer(mode); mode = !mode; - for(auto &&wrapper: wrappers) { + for(auto pos = wrappers.size(); pos > decltype(pos){0}; --pos) { + auto &wrapper = wrappers[pos-1]; + if(wrapper) { wrapper->publish(buf); } diff --git a/src/entt/signal/sigh.hpp b/src/entt/signal/sigh.hpp index 36098d8fd..0d313dd54 100644 --- a/src/entt/signal/sigh.hpp +++ b/src/entt/signal/sigh.hpp @@ -229,7 +229,8 @@ public: * @param args Arguments to use to invoke listeners. */ void publish(Args... args) { - for(auto &&call: calls) { + for(auto pos = calls.size(); pos > size_type{0}; --pos) { + auto &call = calls[pos-1]; call.second(call.first, args...); } } @@ -242,7 +243,9 @@ public: collector_type collect(Args... args) { collector_type collector; - for(auto &&call: calls) { + for(auto pos = calls.size(); pos > size_type{0}; --pos) { + auto &call = calls[pos-1]; + if(!this->invoke(collector, call.second, call.first, args...)) { break; } diff --git a/src/entt/signal/signal.hpp b/src/entt/signal/signal.hpp index f6400d3e6..12f244faf 100644 --- a/src/entt/signal/signal.hpp +++ b/src/entt/signal/signal.hpp @@ -167,11 +167,17 @@ public: * @param args Arguments to use to invoke listeners. */ void publish(Args... args) { - for(auto it = calls.rbegin(), end = calls.rend(); it != end; it++) { - if(!(it->second)(it->first, args...)) { - calls.erase(std::next(it).base()); + std::vector next; + + for(auto pos = calls.size(); pos > size_type{0}; --pos) { + auto &call = calls[pos-1]; + + if((call.second)(call.first, args...)) { + next.push_back(call); } } + + calls.swap(next); } /**