Corium 1.1.0
High-Performance Zero-Heap C++20 MPSC Application Runtime
Loading...
Searching...
No Matches
EventQueue.hpp
Go to the documentation of this file.
1
7#pragma once
8
9#include <optional>
10#include <utility>
11
12#include "corium/Events.hpp"
16
17namespace corium {
18namespace internal {
19
24template <
25 typename QueuePolicy = BoundedMpscQueuePolicy<DefaultEvents, 1024>,
26 typename SignalPolicy = NoSignalPolicy,
27 typename OverflowPolicy = DropNewestOverflowPolicy
28>
30public:
31 using EventVariant = typename QueuePolicy::EventType;
32
33 EventQueue() = default;
34
37 {
38 auto res = _queuePolicy.tryPush(event, priority);
39 if (!res.pushed) {
40 return _overflowPolicy.handleOverflow(_queuePolicy, std::move(event), priority);
41 }
42
43 if (res.wasEmpty) {
44 _signalPolicy.signal();
45 }
46
47 return true;
48 }
49
52 {
53 EventVariant copy = event;
54 return pushEvent(std::move(copy), priority);
55 }
56
59 {
60 return _queuePolicy.tryPop(event);
61 }
62
65 std::optional<EventVariant> tryPopEvent()
66 {
67 EventVariant event;
68 if (_queuePolicy.tryPop(event)) {
69 return event;
70 }
71 return std::nullopt;
72 }
73
75 [[nodiscard]] bool empty() const
76 {
77 return _queuePolicy.empty();
78 }
79
82 {
83 _signalPolicy.setOnQueueNonEmpty(callback);
84 }
85
87 [[nodiscard]] SignalPolicy& signalPolicy() noexcept
88 {
89 return _signalPolicy;
90 }
91
93 [[nodiscard]] const SignalPolicy& signalPolicy() const noexcept
94 {
95 return _signalPolicy;
96 }
97
99 [[nodiscard]] OverflowPolicy& overflowPolicy() noexcept
100 {
101 return _overflowPolicy;
102 }
103
105 [[nodiscard]] const OverflowPolicy& overflowPolicy() const noexcept
106 {
107 return _overflowPolicy;
108 }
109
110private:
111 [[no_unique_address]] QueuePolicy _queuePolicy;
112 [[no_unique_address]] SignalPolicy _signalPolicy;
113 [[no_unique_address]] OverflowPolicy _overflowPolicy;
114};
115
116} // namespace internal
117
118using internal::EventQueue;
119
120} // namespace corium
Standard lifecycle events (QuitEvent, ErrorEvent, TimerEvent).
Queue saturation policies (DropNewest, DropOldest, Audit, Panic).
Bounded and multi-tier priority MPSC queueing policies.
Thread wake-up policies (NoSignalPolicy, ConditionVariableSignalPolicy).
Event queue composing QueuePolicy, SignalPolicy, and OverflowPolicy strategy types.
Definition EventQueue.hpp:29
std::optional< EventVariant > tryPopEvent()
Pop an event from the queue.
Definition EventQueue.hpp:65
const OverflowPolicy & overflowPolicy() const noexcept
Access const reference to overflow policy.
Definition EventQueue.hpp:105
bool tryPopEvent(EventVariant &event)
Pop an event directly into output reference without intermediate optional.
Definition EventQueue.hpp:58
SignalPolicy & signalPolicy() noexcept
Access reference to signal policy.
Definition EventQueue.hpp:87
bool empty() const
Check if event queue is empty.
Definition EventQueue.hpp:75
bool pushEvent(EventVariant &&event, EventPriority priority=EventPriority::Normal)
Push an event into the queue and trigger signal policy on 0->1 transition (rvalue overload).
Definition EventQueue.hpp:36
bool pushEvent(const EventVariant &event, EventPriority priority=EventPriority::Normal)
Push an event into the queue (const lvalue overload).
Definition EventQueue.hpp:51
void setOnQueueNonEmpty(StaticCallback callback)
Set non-allocating static callback triggered when queue transitions from empty to non-empty.
Definition EventQueue.hpp:81
typename QueuePolicy::EventType EventVariant
Definition EventQueue.hpp:31
OverflowPolicy & overflowPolicy() noexcept
Access reference to overflow policy.
Definition EventQueue.hpp:99
const SignalPolicy & signalPolicy() const noexcept
Access const reference to signal policy.
Definition EventQueue.hpp:93
Definition Application.hpp:16
EventPriority
Event priority levels for multi-priority queue policies.
Definition QueuePolicies.hpp:32
Lightweight non-allocating static callback wrapper (function pointer + optional context argument).
Definition SignalPolicies.hpp:35