allow attaching listeners at any time, allow removing current listener
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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<call_type> 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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user