Corium 1.1.0
High-Performance Zero-Heap C++20 MPSC Application Runtime
Loading...
Searching...
No Matches
EventRouter.hpp
Go to the documentation of this file.
1
7#pragma once
8
9#include <array>
10#include <cstddef>
11#include <cstdint>
12#include <utility>
13#include <variant>
14
16
17namespace corium {
18
25template <
26 typename EventVariant,
27 size_t MaxSubscribersPerTopic = 8,
28 size_t MaxTopics = 8
29>
31public:
33
34 constexpr EventRouter() noexcept = default;
35
40 bool subscribe(uint32_t topicId, DelegateType subscriber) noexcept {
41 // Find existing topic slot
42 for (size_t i = 0; i < m_numTopics; ++i) {
43 if (m_topics[i].topicId == topicId) {
44 if (m_topics[i].subscriberCount >= MaxSubscribersPerTopic) {
45 return false; // Topic subscriber capacity reached
46 }
47 m_topics[i].subscribers[m_topics[i].subscriberCount++] = std::move(subscriber);
48 return true;
49 }
50 }
51
52 // Allocate new topic slot
53 if (m_numTopics >= MaxTopics) {
54 return false; // Max topics reached
55 }
56
57 auto& newTopic = m_topics[m_numTopics++];
58 newTopic.topicId = topicId;
59 newTopic.subscriberCount = 1;
60 newTopic.subscribers[0] = std::move(subscriber);
61 return true;
62 }
63
70 template <typename Event, typename Callable>
71 bool subscribeEvent(uint32_t topicId, Callable callable) noexcept {
72 return subscribe(topicId, DelegateType([c = std::move(callable)](const EventVariant& var) {
73 if (std::holds_alternative<Event>(var)) {
74 c(std::get<Event>(var));
75 }
76 }));
77 }
78
83 [[nodiscard]] size_t publish(uint32_t topicId, const EventVariant& event) const noexcept {
84 for (size_t i = 0; i < m_numTopics; ++i) {
85 if (m_topics[i].topicId == topicId) {
86 for (size_t j = 0; j < m_topics[i].subscriberCount; ++j) {
87 m_topics[i].subscribers[j](event);
88 }
89 return m_topics[i].subscriberCount;
90 }
91 }
92 return 0;
93 }
94
100 template <typename Event>
101 [[nodiscard]] size_t publishEvent(uint32_t topicId, const Event& event) const noexcept {
102 return publish(topicId, EventVariant{event});
103 }
104
106 void clear() noexcept {
107 m_numTopics = 0;
108 for (auto& topic : m_topics) {
109 topic.subscriberCount = 0;
110 }
111 }
112
114 [[nodiscard]] size_t topicCount() const noexcept {
115 return m_numTopics;
116 }
117
118private:
119 struct TopicSlot {
120 uint32_t topicId{0};
121 size_t subscriberCount{0};
122 std::array<DelegateType, MaxSubscribersPerTopic> subscribers{};
123 };
124
125 std::array<TopicSlot, MaxTopics> m_topics{};
126 size_t m_numTopics{0};
127};
128
129} // namespace corium
Zero-allocating Small Buffer Optimized (SBO) static delegate dispatcher.
Zero-heap static topic-based publish/subscribe router. Fans out events to multiple registered delegat...
Definition EventRouter.hpp:30
size_t publish(uint32_t topicId, const EventVariant &event) const noexcept
Publish an event variant to all subscribers of a specific topic.
Definition EventRouter.hpp:83
constexpr EventRouter() noexcept=default
void clear() noexcept
Reset all topic subscriptions.
Definition EventRouter.hpp:106
size_t publishEvent(uint32_t topicId, const Event &event) const noexcept
Publish a concrete event to all subscribers of a specific topic.
Definition EventRouter.hpp:101
size_t topicCount() const noexcept
Total active topics currently configured.
Definition EventRouter.hpp:114
bool subscribeEvent(uint32_t topicId, Callable callable) noexcept
Subscribe a typed event handler lambda to a specific topic ID.
Definition EventRouter.hpp:71
internal::EventHandlerDelegate< EventVariant, 32 > DelegateType
Definition EventRouter.hpp:32
bool subscribe(uint32_t topicId, DelegateType subscriber) noexcept
Subscribe a delegate callback to a specific topic ID.
Definition EventRouter.hpp:40
Lightweight non-allocating delegate wrapper with 32-byte Small Buffer Optimization (SBO)....
Definition FastDelegate.hpp:22
Definition Application.hpp:16
DefaultEvents Event
Alias for DefaultEvents.
Definition Events.hpp:65