diff --git a/C++/eventemitter.h b/C++/eventemitter.h new file mode 100644 index 0000000..e539aad --- /dev/null +++ b/C++/eventemitter.h @@ -0,0 +1,53 @@ +#include +#include +#include + +template class EventEmitter { + private: + std::map>> + events; + unsigned long long listenerKey = 0; + public: + std::function on(EventName event, + std::function listener) { + auto key = listenerKey; + auto unsubscribe = [ =, this ]() { + events[event].erase(key); + }; + events[event][key] = listener; + listenerKey++; + return unsubscribe; + } + void emit(EventName event, Arguments... args) { + if (events.contains(event)) { + for (auto listener : events[event]) { + listener.second(args...); + } + } + } + void clear(EventName event) { + events[event].clear(); + } + int count(EventName event) { + return events.contains(event) ? events[event].size() : 0; + } + std::list> listeners(EventName event) { + std::list> result; + + if (events.contains(event)) + for (auto listener : events[event]) { + result.push_back(listener.second); + } + + return result; + } + std::list names() { + std::list result; + + for (auto event : events) { + result.push_back(event.first); + } + + return result; + } +}; diff --git a/C++/usage.cpp b/C++/usage.cpp new file mode 100644 index 0000000..fa0f95b --- /dev/null +++ b/C++/usage.cpp @@ -0,0 +1,37 @@ +#include "eventemitter.h" +#include + +int main() { + EventEmitter ee; + ee.on("event", []() { + std::cout << 1; + }); + auto cancel2 = ee.on("event", []() { + std::cout << 2; + }); + ee.on("event", []() { + std::cout << 3; + }); + std::cout << "Number of existing event names:" << + ee.names().size() << std::endl; + std::cout << + "Number of listeners listening to the event using EventEmitter::count:" << + ee.count("event") << std::endl; + std::cout << + "Number of listeners listening to the event using EventEmitter::listeners:" << + ee.listeners("event").size() << std::endl; + ee.emit("event"); + std::cout << std::endl; + cancel2(); + ee.emit("event"); + std::cout << std::endl; + ee.clear("event"); + ee.emit("event"); + + EventEmitter eeWithArgs; + eeWithArgs.on("event", [](std::string data) { + std::cout << data; + }); + eeWithArgs.emit("event", "hello "); + eeWithArgs.emit("event", "there"); +}