Skip to content

Instantly share code, notes, and snippets.

@bramblex
Created September 7, 2017 08:21
Show Gist options
  • Select an option

  • Save bramblex/52b7e1df6743c9bdc164104bf7ff98d3 to your computer and use it in GitHub Desktop.

Select an option

Save bramblex/52b7e1df6743c9bdc164104bf7ff98d3 to your computer and use it in GitHub Desktop.
#include <map>
#include <functional>
typedef unsigned long ListenerID;
template <class EventData>
using Listener = std::function<void(EventData)>;
template <class EventData>
using ListenersMap = std::map<ListenerID, Listener<EventData>>;
template <class Event, class EventData>
using EventListenerMap = std::map<Event, ListenersMap<EventData>>;
template<class Event, class EventData>
class EventEmitter {
private:
ListenerID next_id = 0;
EventListenerMap<Event, EventData> event_listener_map;
public:
ListenerID on(Event event, Listener<EventData> listener) {
auto it = this->event_listener_map.find(event);
if (it == this->event_listener_map.end()) {
this->event_listener_map.insert(std::pair<Event, ListenersMap<EventData>>(event, std::map<ListenerID, Listener<EventData>>()));
it = this->event_listener_map.find(event);
}
auto listener_id = ++this->next_id;
it->second.insert(std::pair<ListenerID , Listener<EventData>>(listener_id, listener));
return listener_id;
};
ListenerID once(Event event, Listener<EventData> listener) {
ListenerID listener_id = this->next_id + 1;
this->on(event, [this, listener_id, &listener, &event](EventData data){
this->off(event, listener_id);
listener(data);
});
return listener_id;
};
void off(Event event, ListenerID listener_id) {
auto it = this->event_listener_map.find(event);
if (it == this->event_listener_map.end()){ return; }
it->second.erase(listener_id);
};
void off(Event event) {
this->event_listener_map.erase(event);
};
void off(){
this->event_listener_map.clear();
};
bool emit(Event event, EventData data){
auto event_listeners = this->event_listener_map.find(event);
if (event_listeners == this->event_listener_map.end()) { return false; }
auto listeners = event_listeners->second;
bool sign = false;
for (auto& listener: listeners) {
sign = true;
listener.second(data);
}
return sign;
};
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment