aboutsummaryrefslogtreecommitdiff
path: root/src/util/any_map.cpp
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