15#if defined(_WIN32) || defined(_WIN64) || defined(__unix__) || defined(__APPLE__) || (defined(_GLIBCXX_HAS_GTHREADS) && _GLIBCXX_HAS_GTHREADS) || defined(_LIBCPP_HAS_THREAD_API_PTHREAD)
17#ifndef CORIUM_HAS_STD_MUTEX
18#define CORIUM_HAS_STD_MUTEX 1
21#ifndef CORIUM_HAS_STD_MUTEX
22#define CORIUM_HAS_STD_MUTEX 0
42template <
typename EventVariant = DefaultEvents,
size_t Capacity = 1024>
46 static constexpr std::size_t
capacity = Capacity;
57 auto res = _ringBuffer.tryPush(std::move(event));
58 return {res.pushed, res.wasEmpty};
64 EventVariant copy = event;
65 return tryPush(std::move(copy), priority);
71 return _ringBuffer.tryPop(event);
75 [[nodiscard]]
bool empty() const noexcept
77 return _ringBuffer.empty();
92 size_t HighCapacity = 256,
93 size_t NormalCapacity = 1024,
94 size_t LowCapacity = 0
100 static constexpr std::size_t
capacity = HighCapacity + NormalCapacity + (LowCapacity > 0 ? LowCapacity : 0);
110 bool wasOverallEmpty =
empty();
115 auto res = _highRingBuffer.tryPush(std::move(event));
120 auto res = _normalRingBuffer.tryPush(std::move(event));
125 if constexpr (LowCapacity > 0) {
126 auto res = _lowRingBuffer.tryPush(std::move(event));
129 auto res = _normalRingBuffer.tryPush(std::move(event));
136 return {pushed, wasOverallEmpty};
142 EventVariant copy = event;
143 return tryPush(std::move(copy), priority);
149 if (_highRingBuffer.tryPop(event)) {
152 if (_normalRingBuffer.tryPop(event)) {
155 if constexpr (LowCapacity > 0) {
156 if (_lowRingBuffer.tryPop(event)) {
164 [[nodiscard]]
bool empty() const noexcept
166 bool isEmpty = _highRingBuffer.empty() && _normalRingBuffer.empty();
167 if constexpr (LowCapacity > 0) {
168 isEmpty = isEmpty && _lowRingBuffer.empty();
176 [[no_unique_address]] std::conditional_t<(LowCapacity > 0),
177 MpscRingBuffer<EventVariant, (LowCapacity > 0 ? LowCapacity : 1)>,
184template <
typename EventVariant = DefaultEvents>
198#if CORIUM_HAS_STD_MUTEX
199 std::lock_guard<std::mutex> lock(_mutex);
201 bool wasEmpty = _queue.empty();
202 _queue.push(std::move(event));
203 return {
true, wasEmpty};
209#if CORIUM_HAS_STD_MUTEX
210 std::lock_guard<std::mutex> lock(_mutex);
212 if (_queue.empty()) {
215 event = std::move(_queue.front());
223#if CORIUM_HAS_STD_MUTEX
224 std::lock_guard<std::mutex> lock(_mutex);
226 return _queue.empty();
230 std::queue<EventVariant> _queue;
231#if CORIUM_HAS_STD_MUTEX
232 mutable std::mutex _mutex;
239template <
typename EventVariant = DefaultEvents>
252 return {
false,
false};
262 [[nodiscard]]
bool empty() const noexcept
Standard lifecycle events (QuitEvent, ErrorEvent, TimerEvent).
Lock-free Multi-Producer Single-Consumer (MPSC) bounded ring buffer based on Dmitry Vyukov's algorith...
Queue Policy for a traditional mutex-protected blocking queue (power saving).
Definition QueuePolicies.hpp:185
bool tryPop(EventVariant &event)
Try to pop an event from the blocking queue.
Definition QueuePolicies.hpp:207
EventVariant EventType
Definition QueuePolicies.hpp:187
bool empty() const
Check if queue is empty.
Definition QueuePolicies.hpp:221
PushResult tryPush(EventVariant event, EventPriority priority=EventPriority::Normal)
Try to push an event into the blocking queue.
Definition QueuePolicies.hpp:195
Queue Policy for fixed-capacity, zero-allocation lock-free MPSC RingBuffer.
Definition QueuePolicies.hpp:43
PushResult tryPush(EventVariant &&event, EventPriority priority=EventPriority::Normal)
Try to push an event into the lock-free queue (thread-safe, zero allocations).
Definition QueuePolicies.hpp:54
EventVariant EventType
Definition QueuePolicies.hpp:45
bool empty() const noexcept
Check if queue is empty.
Definition QueuePolicies.hpp:75
PushResult tryPush(const EventVariant &event, EventPriority priority=EventPriority::Normal)
Try to push an event into the lock-free queue (const lvalue overload).
Definition QueuePolicies.hpp:62
static constexpr std::size_t capacity
Accessible queue capacity for profiler wiring.
Definition QueuePolicies.hpp:46
bool tryPop(EventVariant &event)
Try to pop an event from the lock-free queue (single consumer).
Definition QueuePolicies.hpp:69
Lock-free Multiple-Producer, Single-Consumer (MPSC) RingBuffer. Implements Dmitry Vyukov's algorithm ...
Definition MpscRingBuffer.hpp:33
Zero-overhead Queue Policy for services or buses that do not receive or queue incoming events....
Definition QueuePolicies.hpp:240
bool empty() const noexcept
Always returns true as no events can be queued.
Definition QueuePolicies.hpp:262
EventVariant EventType
Definition QueuePolicies.hpp:242
PushResult tryPush(EventVariant, EventPriority=EventPriority::Normal) noexcept
Always fails to push events as queue capacity is 0.
Definition QueuePolicies.hpp:250
bool tryPop(EventVariant &) noexcept
Always fails to pop events as queue capacity is 0.
Definition QueuePolicies.hpp:256
Queue Policy supporting strict event priorities using separate lock-free MPSC ring buffers....
Definition QueuePolicies.hpp:96
bool tryPop(EventVariant &event)
Try to pop an event from the priority queue (strict priority order: High -> Normal -> Low).
Definition QueuePolicies.hpp:147
PushResult tryPush(const EventVariant &event, EventPriority priority=EventPriority::Normal)
Try to push an event into the priority queue (const lvalue overload).
Definition QueuePolicies.hpp:140
PushResult tryPush(EventVariant &&event, EventPriority priority=EventPriority::Normal)
Try to push an event into the priority queue (thread-safe, zero dynamic allocation).
Definition QueuePolicies.hpp:108
static constexpr std::size_t capacity
Total accessible capacity (high + normal; low is optional).
Definition QueuePolicies.hpp:100
EventVariant EventType
Definition QueuePolicies.hpp:98
bool empty() const noexcept
Check if all priority queues are empty.
Definition QueuePolicies.hpp:164
Definition Application.hpp:16
std::variant< QuitEvent, TickEvent, UpdateEvent, ErrorEvent, SignalEvent > DefaultEvents
Default variant list of core Corium events.
Definition Events.hpp:62
EventPriority
Event priority levels for multi-priority queue policies.
Definition QueuePolicies.hpp:32
Definition QueuePolicies.hpp:189
bool wasEmpty
Definition QueuePolicies.hpp:191
bool pushed
Definition QueuePolicies.hpp:190
Definition QueuePolicies.hpp:48
bool wasEmpty
Definition QueuePolicies.hpp:50
bool pushed
Definition QueuePolicies.hpp:49
Definition QueuePolicies.hpp:244
bool pushed
Definition QueuePolicies.hpp:245
bool wasEmpty
Definition QueuePolicies.hpp:246
Definition QueuePolicies.hpp:102
bool pushed
Definition QueuePolicies.hpp:103
bool wasEmpty
Definition QueuePolicies.hpp:104