22 EventEntry *entry = this->find_or_create_event_(event);
23 entry->listeners.push_back({listener_id, listener});
29 EventEntry *entry = this->find_event_(event);
34 for (
auto it = entry->listeners.begin(); it != entry->listeners.end(); ++it) {
37 *it = entry->listeners.back();
38 entry->listeners.pop_back();
41 if (entry->listeners.empty()) {
42 this->remove_event_(event);
50 void emit_(EvtType event, Args... args) {
51 EventEntry *entry = this->find_event_(event);
56 for (
const auto &listener : entry->listeners) {
57 listener.callback(args...);
64 std::function<void(Args...)> callback;
69 std::vector<Listener> listeners;
75 if (next_id == INVALID_LISTENER_ID) {
78 this->current_id_ = next_id;
79 return this->current_id_;
82 EventEntry *find_event_(EvtType event) {
83 for (
auto &entry : this->events_) {
84 if (entry.event == event) {
91 EventEntry *find_or_create_event_(EvtType event) {
92 EventEntry *entry = this->find_event_(event);
97 this->events_.push_back({event, {}});
98 return &this->events_.back();
101 void remove_event_(EvtType event) {
102 for (
auto it = this->events_.begin(); it != this->events_.end(); ++it) {
103 if (it->event == event) {
105 *it = this->events_.back();
106 this->events_.pop_back();
112 std::vector<EventEntry> events_;