blob: c49464d333d244e0d69c6a8e21b1873b8da23125 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
#include "any_map.hpp"
namespace cru::util {
AnyMap::ListenerToken AnyMap::RegisterValueChangeListener(
const String& key, const Listener& listener) {
const auto token = current_listener_token_++;
map_[key].second.push_back(token);
listeners_.emplace(token, listener);
return token;
}
void AnyMap::UnregisterValueChangeListener(const ListenerToken token) {
const auto find_result = listeners_.find(token);
if (find_result != listeners_.cend()) listeners_.erase(find_result);
}
void AnyMap::InvokeListeners(std::list<ListenerToken>& listener_list,
const std::any& value) {
auto i = listener_list.cbegin();
while (i != listener_list.cend()) {
auto current_i = i++;
const auto find_result = listeners_.find(*current_i);
if (find_result != listeners_.cend())
find_result->second(value);
else
listener_list.erase(
current_i); // otherwise remove the invalid listener token.
}
}
} // namespace cru::util
|