1 #include <samchon/library/EventDispatcher.hpp> 3 #include <samchon/library/Event.hpp> 12 EventDispatcher::EventDispatcher()
23 listeners = move(obj.listeners);
27 unique_lock<mutex> s_uk(sMtx);
29 for (
auto it = eventMap.begin(); it != eventMap.end(); it++)
30 if (it->first == &obj)
32 auto event = it->second;
34 it = eventMap.erase(it);
35 eventMap.insert(it, {
this,
event });
39 EventDispatcher::~EventDispatcher()
42 unique_lock<mutex> s_uk(sMtx);
44 for (
auto it = eventMap.begin(); it != eventMap.end();)
45 if (it->first ==
this)
54 void EventDispatcher::addEventListener(
int type, Listener listener,
void *addiction)
58 listeners[type][listener].insert(addiction);
60 void EventDispatcher::removeEventListener(
int type, Listener listener,
void *addiction)
63 if (listeners.count(type) == 0)
67 if (listeners.count(type) == 0 ||
68 listeners[type].count(listener) == 0 ||
69 listeners[type][listener].count(addiction) == 0)
72 listeners[type][listener].erase(addiction);
74 if (listeners[type][listener].empty() ==
true)
75 listeners[type].erase(listener);
77 if (listeners[type].empty() ==
true)
78 listeners.erase(type);
83 void EventDispatcher::dispatch(std::shared_ptr<Event> event)
89 if (listeners.count(event->getType()) == 0)
94 unique_lock<mutex> s_uk(sMtx);
95 eventMap.insert({
this,
event});
99 void EventDispatcher::deliver(shared_ptr<Event> event)
102 if (listeners.count(event->getType()) == 0)
105 auto listenerMap = listeners[
event->getType()];
108 for (
auto it = listenerMap.begin(); it != listenerMap.end(); it++)
110 Listener listener = it->first;
112 for (
auto s_it = it->second.begin(); s_it != it->second.end(); s_it++)
114 void *addiction = *s_it;
116 listener(event, addiction);
124 size_t EventDispatcher::THREAD_SIZE = 2;
126 bool EventDispatcher::started =
false;
127 condition_variable EventDispatcher::cv;
128 mutex EventDispatcher::cv_mtx;
130 unordered_multimap<EventDispatcher*, shared_ptr<Event>> EventDispatcher::eventMap;
131 mutex EventDispatcher::sMtx;
133 void EventDispatcher::start()
135 unique_lock<mutex> uk(sMtx);
142 for (
size_t i = 0; i < THREAD_SIZE; i++)
150 unique_lock<mutex> uk(sMtx);
151 if (eventMap.empty() ==
true)
154 auto pair = *eventMap.begin();
155 eventMap.erase(eventMap.begin());
160 shared_ptr<Event> &
event = pair.second;
165 unique_lock<mutex> cv_uk(cv_mtx);
void unlock()
Unlock on writing.
Abstract class for dispatching Event.
void unlock() const
Unlock of read.
Top level namespace of products built from samchon.