plugify 1.2.8
Loading...
Searching...
No Matches
event_bus.hpp
1#pragma once
2
3#include <any>
4#include <functional>
5#include <typeindex>
6
7namespace plugify {
8 // Event bus for decoupled communication
9 class IEventBus {
10 public:
11 virtual ~IEventBus() = default;
12
13 using EventHandler = std::function<void(const std::any&)>;
14 using SubscriptionId = size_t;
15
16 virtual SubscriptionId Subscribe(std::string_view eventType, EventHandler handler) = 0;
17 virtual void Unsubscribe(SubscriptionId id) = 0;
18 virtual void Publish(std::string_view eventType, std::any data) = 0;
19
20 // Type-safe publish/subscribe
21 template <typename T>
22 SubscriptionId Subscribe(std::function<void(const T&)> handler) {
23 return Subscribe(typeid(T).name(), [handler](const std::any& data) {
24 if (auto* ptr = std::any_cast<T>(&data)) {
25 handler(*ptr);
26 }
27 });
28 }
29
30 template <typename T>
31 void Publish(T&& data) {
32 Publish(typeid(T).name(), std::any(std::forward<T>(data)));
33 }
34 };
35}