vkmEngine 1.0.0
A C++ game engine · vkmengine.com
Loading...
Searching...
No Matches
event_bus.h
1#pragma once
2
3#include <cstddef>
4#include <functional>
5#include <memory>
6#include <utility>
7#include <vector>
8
9#include "core/memory/type_registry.h"
10#include "core/memory/types.h"
11#include "core/event/bus.h"
12
13namespace Vkm::Engine {
14
22class EventBus {
23 public:
24 EventBus() = default;
25 ~EventBus() = default;
26
27 EventBus(const EventBus& other) = delete;
28 EventBus& operator=(const EventBus& other) = delete;
29
30 EventBus(EventBus && other) = delete;
31 EventBus& operator=(EventBus && other) = delete;
32
33 public:
41 template<typename EventT>
42 ListenerId subscribe(std::function<void(const EventT&)> callback) {
43 return bus<EventT>().subscribe(std::move(callback));
44 }
45
53 template<typename EventT>
54 bool unsubscribe(ListenerId id) {
55 auto* b = findBus<EventT>();
56 return b ? b->remove(id) : false;
57 }
58
65 template<typename EventT>
66 void emit(const EventT& event) {
67 if (auto* b = findBus<EventT>()) b->emit(event);
68 }
69
76 template<typename EventT>
77 void enqueue(EventT event) {
78 bus<EventT>().enqueue(std::move(event));
79 }
80
87 void flush();
88
99
105 std::size_t busCount() const { return m_buses.count(); }
106
107 private:
114 template<typename EventT>
115 Bus<EventT>& bus() {
116 IBus& base = m_buses.ensure<EventT>([] { return std::make_unique<Bus<EventT>>(); });
117 return static_cast<Bus<EventT>&>(base);
118 }
119
126 template<typename EventT>
127 Bus<EventT>* findBus() {
128 return static_cast<Bus<EventT>*>(m_buses.find<EventT>());
129 }
130
131 private:
132 TypeRegistry<IBus> m_buses;
133
134 std::vector<IBus*> m_active;
135
136 bool m_flushing = false;
137};
138
148class EventSender {
149 public:
150 explicit EventSender(EventBus& bus) : m_bus(&bus) {}
151 ~EventSender() = default;
152
153 EventSender(const EventSender& other) = default;
154 EventSender& operator=(const EventSender& other) = default;
155
156 EventSender(EventSender && other) = default;
157 EventSender& operator=(EventSender && other) = default;
158
165 template<typename EventT>
166 void emit(const EventT& event) { m_bus->emit(event); }
167
174 template<typename EventT>
175 void enqueue(EventT event) { m_bus->enqueue(std::move(event)); }
176
177 private:
178 EventBus* m_bus;
179};
180
181} // namespace Vkm::Engine
Listener list plus deferred-event queue for a single event type.
Definition bus.h:61
Typed pub/sub event dispatcher.
Definition event_bus.h:22
void enqueue(EventT event)
Queue event for delivery on the next flush().
Definition event_bus.h:77
bool unsubscribe(ListenerId id)
Remove a registered listener.
Definition event_bus.h:54
ListenerId subscribe(std::function< void(const EventT &)> callback)
Register a callback for events of type EventT.
Definition event_bus.h:42
void emit(const EventT &event)
Fire event synchronously to every listener now.
Definition event_bus.h:66
void dropIdleBuses()
Drop every bus nothing listens to any more.
void flush()
Drain every per-type queue to its listeners.
std::size_t busCount() const
How many event types have a bus right now.
Definition event_bus.h:105
void enqueue(EventT event)
Queue event for delivery on the next flush (EventBus::enqueue).
Definition event_bus.h:175
void emit(const EventT &event)
Fire event synchronously to every listener now (EventBus::emit).
Definition event_bus.h:166
The type-erased base EventBus holds each per-type Bus as.
Definition bus.h:19