diff options
author | crupest <crupest@outlook.com> | 2018-11-09 19:59:57 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2018-11-09 19:59:57 +0800 |
commit | 6515948e3f5b97f90446536f72e99d71e96f9de7 (patch) | |
tree | 2c962abc3447529e10e0b1d255757f60aaf9f2c6 /src/any_map.cpp | |
parent | efdce672123284847bd7fb6f12ac1ec96f28f3ef (diff) | |
download | cru-6515948e3f5b97f90446536f72e99d71e96f9de7.tar.gz cru-6515948e3f5b97f90446536f72e99d71e96f9de7.tar.bz2 cru-6515948e3f5b97f90446536f72e99d71e96f9de7.zip |
Add AnyMap.
Diffstat (limited to 'src/any_map.cpp')
-rw-r--r-- | src/any_map.cpp | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/src/any_map.cpp b/src/any_map.cpp new file mode 100644 index 00000000..6f9ada66 --- /dev/null +++ b/src/any_map.cpp @@ -0,0 +1,33 @@ +#include "any_map.h" + +namespace cru +{ + 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. + } + } +} |