9#include "core/memory/type_registry.h"
10#include "core/memory/types.h"
11#include "core/event/bus.h"
13namespace Vkm::Engine {
25 ~EventBus() =
default;
27 EventBus(
const EventBus& other) =
delete;
28 EventBus& operator=(
const EventBus& other) =
delete;
30 EventBus(EventBus && other) =
delete;
31 EventBus& operator=(EventBus && other) =
delete;
41 template<
typename EventT>
42 ListenerId
subscribe(std::function<
void(
const EventT&)> callback) {
43 return bus<EventT>().subscribe(std::move(callback));
53 template<
typename EventT>
55 auto* b = findBus<EventT>();
56 return b ? b->remove(
id) :
false;
65 template<
typename EventT>
66 void emit(
const EventT& event) {
67 if (
auto* b = findBus<EventT>()) b->emit(event);
76 template<
typename EventT>
78 bus<EventT>().enqueue(std::move(event));
105 std::size_t
busCount()
const {
return m_buses.count(); }
114 template<
typename EventT>
116 IBus& base = m_buses.ensure<EventT>([] {
return std::make_unique<Bus<EventT>>(); });
117 return static_cast<Bus<EventT>&
>(base);
126 template<
typename EventT>
127 Bus<EventT>* findBus() {
128 return static_cast<Bus<EventT>*
>(m_buses.find<EventT>());
132 TypeRegistry<IBus> m_buses;
134 std::vector<IBus*> m_active;
136 bool m_flushing =
false;
150 explicit EventSender(
EventBus& bus) : m_bus(&bus) {}
151 ~EventSender() =
default;
153 EventSender(
const EventSender& other) =
default;
154 EventSender& operator=(
const EventSender& other) =
default;
156 EventSender(EventSender && other) =
default;
157 EventSender& operator=(EventSender && other) =
default;
165 template<
typename EventT>
166 void emit(
const EventT& event) { m_bus->emit(event); }
174 template<
typename EventT>
175 void enqueue(EventT event) { m_bus->enqueue(std::move(event)); }
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