32#include <unordered_map>
39 std::ostringstream oss;
46ListenersByKey& ListenersByKey::GetInstance(
const std::string& key) {
47 static std::unordered_map<std::string, ListenersByKey> instances;
48 static std::mutex s_mutex;
50 std::lock_guard<std::mutex> lock(s_mutex);
51 if (instances.find(key) == instances.end()) {
54 return instances[key];
59using ev_pair = std::pair<wxEvtHandler*, wxEventType>;
61void Observable::Listen(wxEvtHandler* listener, wxEventType ev_type) {
62 std::lock_guard<std::mutex> lock(m_mutex);
63 const auto& listeners = m_list.listeners;
65 ev_pair key_pair(listener, ev_type);
66 auto found = std::find(listeners.begin(), listeners.end(), key_pair);
67 assert((found == listeners.end()) &&
"Duplicate listener");
68 m_list.listeners.push_back(key_pair);
72 std::lock_guard<std::mutex> lock(m_mutex);
73 auto& listeners = m_list.listeners;
75 ev_pair key_pair(listener, ev_type);
76 auto found = std::find(listeners.begin(), listeners.end(), key_pair);
77 if (found == listeners.end())
return false;
78 listeners.erase(found);
83 const std::string& s,
int num,
85 std::lock_guard<std::mutex> lock(m_mutex);
86 auto& listeners = m_list.listeners;
88 for (
const auto& l : listeners) {
90 evt->SetSharedPtr(ptr);
91 evt->SetClientData(client_data);
92 evt->SetString(s.c_str());
94 wxQueueEvent(l.first, evt);
104 if (!key.empty()) Unlisten();
111void ObservableListener::Listen() {
118void ObservableListener::Unlisten() {
void Listen(const std::string &key, wxEvtHandler *listener, wxEventType evt)
Set object to send wxEventType ev to listener on changes in key.
The observable notify/listen basic nuts and bolts.
virtual void Notify()
Notify all listeners about variable change.
bool Unlisten(wxEvtHandler *listener, wxEventType ev)
Remove window listening to ev from list of listeners.
Custom event class for OpenCPN's notification system.
std::string ptr_key(const void *ptr)
Return address as printable string.
General observable implementation with several specializations.