File Events.h
Go to the documentation of this file
#pragma once
#include <functional>
#include <queue>
#include <typeindex>
#include <unordered_map>
class Events
{
// TODO: event id and type
};
class EventPool {
public:
template<typename Event>
using Handler = std::function<void(const Event&)>;
template<typename Event>
void subscribe(Handler<Event> handler) {
auto& vec = handlers[typeid(Event)];
vec.push_back(
[h = std::move(handler)](const void* e) {
h(*static_cast<const Event*>(e));
}
);
}
template<typename Event>
void emit(const Event& event) {
event_queue.push([this, ev = event]() {
dispatch(ev);
});
}
void Process(int max_events = 1000) {
int count = 0;
while (!event_queue.empty() && count < max_events) {
auto fn = std::move(event_queue.front());
event_queue.pop();
fn();
++count;
}
}
private:
template<typename Event>
void dispatch(const Event& event) {
auto it = handlers.find(typeid(Event));
if (it == handlers.end()) return;
for (auto& fn : it->second) {
fn(&event);
}
}
std::unordered_map<
std::type_index,
std::vector<std::function<void(const void*)>>
> handlers;
std::queue<std::function<void()>> event_queue;
public:
void EmitGlobalEvent();
};