aboutsummaryrefslogtreecommitdiff
path: root/src/any_map.cpp
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2018-11-09 19:59:57 +0800
committercrupest <crupest@outlook.com>2018-11-09 19:59:57 +0800
commit6515948e3f5b97f90446536f72e99d71e96f9de7 (patch)
tree2c962abc3447529e10e0b1d255757f60aaf9f2c6 /src/any_map.cpp
parentefdce672123284847bd7fb6f12ac1ec96f28f3ef (diff)
downloadcru-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.cpp33
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.
+ }
+ }
+}