SW Task Event Loop Framework v1.0.0
High-performance C++ asynchronous event loop framework with timer management and promise-based programming
Loading...
Searching...
No Matches
EventQueue.h
Go to the documentation of this file.
1
9 #pragma once
10
11 #include <iostream>
12 #include <mutex>
13 #include <thread>
14 #include <condition_variable>
15 #include <functional>
16 #include <future>
17 #include <deque>
18 #include <optional>
19 #include <algorithm>
20 #include <variant>
21 #include "Message.h"
22
23 // Forward declaration
24 namespace swt {
25 template<typename T> class Promise;
26 }
27
28 namespace swt {
86 {
87 public:
95 enum class QueueItemType {
96 MESSAGE,
98 };
99
115 struct QueueItem {
117 int64_t whenUs;
119 std::shared_ptr<Message> message;
120 std::packaged_task<void()> task;
130 QueueItem(std::shared_ptr<Message> msg, int64_t when)
131 : type(QueueItemType::MESSAGE), whenUs(when), message(msg) {}
132
141 QueueItem(std::packaged_task<void()>&& t, int64_t when)
142 : type(QueueItemType::FUNCTION), whenUs(when), task(std::move(t)) {}
143
151 QueueItem(QueueItem&& other) noexcept
152 : type(other.type), whenUs(other.whenUs),
153 message(std::move(other.message)), task(std::move(other.task)) {}
154
163 QueueItem& operator=(QueueItem&& other) noexcept {
164 if (this != &other) {
165 type = other.type;
166 whenUs = other.whenUs;
167 message = std::move(other.message);
168 task = std::move(other.task);
169 }
170 return *this;
171 }
172
179 QueueItem(const QueueItem&) = delete;
180
187 QueueItem& operator=(const QueueItem&) = delete;
188 };
189
190 public:
197 EventQueue();
198
205 ~EventQueue();
206
207 // ========== LEGACY MESSAGE API ==========
208
229 bool enqueueMessage(const std::shared_ptr<Message>& message, int64_t whenUs);
230
242 std::shared_ptr<Message> poll();
243
250 bool isQuit();
251
252 // ========== MODERN FUNCTION API ==========
253
270 template<typename F, typename... Args>
271 auto enqueueFunction(F&& func, Args&&... args) -> std::future<decltype(func(args...))>;
272
290 template<typename F, typename... Args>
291 auto enqueueFunctionDelayed(int64_t delayMs, F&& func, Args&&... args) -> std::future<decltype(func(args...))>;
292
293 // ========== PROMISE INTEGRATION ==========
294
323 template<typename T>
325
326 // ========== UNIFIED POLLING ==========
327
355 std::optional<QueueItem> pollNext();
356
357 // ========== QUEUE CONTROL ==========
358
365 void quit();
366
378 bool hasMessage(const std::shared_ptr<Handler>& h, int32_t what, void* obj);
379
390 int64_t uptimeMicros();
391
392 private:
393 std::deque<QueueItem> mQueue;
394 std::shared_ptr<Message> mCurrentMessage;
395 std::mutex iMutex;
396 bool mStarted;
397 mutable bool mQuit;
398 std::condition_variable mQueueChanged;
399 };
400 }
401 // Include template implementations
402 #include "EventQueue.tpp"
Thread-safe unified queue for messages and function tasks with timed execution.
Definition EventQueue.h:86
EventQueue()
Constructor - initializes empty queue.
std::optional< QueueItem > pollNext()
Poll for next ready queue item (unified interface)
int64_t uptimeMicros()
Get current system uptime in microseconds.
~EventQueue()
Destructor - cleanup remaining items.
std::shared_ptr< Message > poll()
Poll for next ready message (legacy compatibility)
QueueItemType
Type discriminator for queue items.
Definition EventQueue.h:95
@ FUNCTION
Function task with std::packaged_task.
@ MESSAGE
Traditional message with handler.
void quit()
Request queue shutdown.
auto enqueueFunctionDelayed(int64_t delayMs, F &&func, Args &&... args) -> std::future< decltype(func(args...))>
Enqueue function for delayed asynchronous execution.
bool hasMessage(const std::shared_ptr< Handler > &h, int32_t what, void *obj)
Check for specific message in queue.
bool isQuit()
Check if quit message was received.
bool enqueueMessage(const std::shared_ptr< Message > &message, int64_t whenUs)
Enqueue traditional message for timed execution.
auto enqueueFunction(F &&func, Args &&... args) -> std::future< decltype(func(args...))>
Enqueue function for immediate asynchronous execution.
Promise< T > enqueuePromise()
Create and enqueue promise for manual resolution.
Type-safe promise for asynchronous result handling with continuation chaining.
Definition Promise.h:68
Software Timer namespace containing all timer-related classes.
Definition Awaitable.h:21
Unified queue item supporting both messages and function tasks.
Definition EventQueue.h:115
QueueItem & operator=(const QueueItem &)=delete
Copy assignment - deleted (move-only semantics)
QueueItem(const QueueItem &)=delete
Copy constructor - deleted (move-only semantics)
QueueItem(std::packaged_task< void()> &&t, int64_t when)
Constructor for function queue items.
Definition EventQueue.h:141
QueueItem(QueueItem &&other) noexcept
Move constructor - transfers ownership of queue item.
Definition EventQueue.h:151
int64_t whenUs
Execution time in microseconds (absolute)
Definition EventQueue.h:117
std::shared_ptr< Message > message
Message payload (for MESSAGE type)
Definition EventQueue.h:119
QueueItem(std::shared_ptr< Message > msg, int64_t when)
Constructor for message queue items.
Definition EventQueue.h:130
QueueItemType type
Type discriminator for queue item.
Definition EventQueue.h:116
std::packaged_task< void()> task
Function task (for FUNCTION type)
Definition EventQueue.h:120
QueueItem & operator=(QueueItem &&other) noexcept
Move assignment operator - transfers ownership.
Definition EventQueue.h:163