Skip to content

File Events.h

File List > editor > 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();
};