Corium 1.1.0
High-Performance Zero-Heap C++20 MPSC Application Runtime
Loading...
Searching...
No Matches
EventSink.hpp
Go to the documentation of this file.
1
7#pragma once
8
9#include <type_traits>
10#include <utility>
11#include "corium/Events.hpp"
13
14namespace corium {
15
20template <typename EventVariant = DefaultEvents>
22 using PostFn = void (*)(void* sinkPtr, EventVariant&& event, EventPriority priority);
23
24public:
25 using EventVariantType = EventVariant;
26
27 BasicEventSink() = default;
28
29 BasicEventSink(const BasicEventSink&) = default;
31 BasicEventSink(BasicEventSink&&) noexcept = default;
32 BasicEventSink& operator=(BasicEventSink&&) noexcept = default;
33
34 template <typename ConcreteSink>
35 requires (!std::is_same_v<std::decay_t<ConcreteSink>, BasicEventSink>)
36 explicit BasicEventSink(ConcreteSink& sink)
37 : _sinkPtr(&sink),
38 _postFn([](void* ptr, EventVariant&& evt, EventPriority prio) {
39 static_cast<ConcreteSink*>(ptr)->post(std::move(evt), prio);
40 })
41 {}
42
44 void post(EventVariant&& event, EventPriority priority = EventPriority::Normal) const
45 {
46 if (_postFn && _sinkPtr) {
47 _postFn(_sinkPtr, std::move(event), priority);
48 }
49 }
50
52 void post(const EventVariant& event, EventPriority priority = EventPriority::Normal) const
53 {
54 if (_postFn && _sinkPtr) {
55 EventVariant copy = event;
56 _postFn(_sinkPtr, std::move(copy), priority);
57 }
58 }
59
61 template <typename Event>
62 void postHighPriority(Event&& event) const
63 {
64 post(EventVariant(std::forward<Event>(event)), EventPriority::High);
65 }
66
67 explicit operator bool() const noexcept
68 {
69 return _sinkPtr != nullptr && _postFn != nullptr;
70 }
71
72private:
73 void* _sinkPtr = nullptr;
74 PostFn _postFn = nullptr;
75};
76
79
81template <typename EventVariant = DefaultEvents>
83
84} // namespace corium
Standard lifecycle events (QuitEvent, ErrorEvent, TimerEvent).
Bounded and multi-tier priority MPSC queueing policies.
Non-virtual type-erased event sink handle (raw pointer + static function pointer)....
Definition EventSink.hpp:21
BasicEventSink(BasicEventSink &&) noexcept=default
void post(EventVariant &&event, EventPriority priority=EventPriority::Normal) const
Post an event into the event sink with priority (rvalue overload).
Definition EventSink.hpp:44
void postHighPriority(Event &&event) const
Convenience helper for posting high-priority events (e.g. from ISR handlers).
Definition EventSink.hpp:62
void post(const EventVariant &event, EventPriority priority=EventPriority::Normal) const
Post an event into the event sink with priority (const lvalue overload).
Definition EventSink.hpp:52
BasicEventSink & operator=(const BasicEventSink &)=default
BasicEventSink(const BasicEventSink &)=default
EventVariant EventVariantType
Definition EventSink.hpp:25
Definition Application.hpp:16
EventPriority
Event priority levels for multi-priority queue policies.
Definition QueuePolicies.hpp:32
DefaultEvents Event
Alias for DefaultEvents.
Definition Events.hpp:65