5#include <unordered_map>
30 template<
typename EventType>
32 auto wrapper = [callback](
const EventPtr& event) {
33 if (
auto typed = std::dynamic_pointer_cast<const EventType>(event)) {
38 auto type_idx = std::type_index(
typeid(EventType));
55 std::remove_if(subs.begin(), subs.end(),
68 template<
typename EventType>
69 void publish(std::shared_ptr<const EventType> event) {
72 auto type_idx = std::type_index(
typeid(EventType));
75 for (
const auto& sub : it->second) {
EventBus(const EventBus &)=delete
std::vector< Subscription > global_subscribers_
SubscriptionId subscribe_all(EventCallback callback)
Subscribe to all events.
EventBus & operator=(const EventBus &)=delete
SubscriptionId subscribe(std::function< void(const EventType &)> callback)
void reset()
Reset the bus (clear all subscriptions and log)
void clear_log()
Clear the event log.
SubscriptionId next_subscription_id_
std::unordered_map< std::type_index, std::vector< Subscription > > subscriptions_
void publish(std::shared_ptr< const EventType > event)
Publish an event to all subscribers.
void unsubscribe(SubscriptionId id)
Unsubscribe using subscription ID.
std::vector< EventPtr > event_log_
const std::vector< EventPtr > & event_log() const
Get all events in chronological order (for replay/debugging)
std::size_t SubscriptionId
Subscription handle for unsubscribing.
std::shared_ptr< const Event > EventPtr
std::function< void(const EventPtr &)> EventCallback
Callback type for event subscribers.