diff options
Diffstat (limited to 'include/MessageQueue.hpp')
-rw-r--r-- | include/MessageQueue.hpp | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/include/MessageQueue.hpp b/include/MessageQueue.hpp new file mode 100644 index 0000000..174a227 --- /dev/null +++ b/include/MessageQueue.hpp @@ -0,0 +1,50 @@ +#pragma once + +#include <deque> +#include <mutex> +#include <condition_variable> +#include <optional> + +namespace QuickMedia { + template <typename T> + class MessageQueue { + public: + MessageQueue() : running(true) { + + } + + void push(T data) { + std::unique_lock<std::mutex> lock(mutex); + data_queue.push_back(std::move(data)); + cv.notify_one(); + } + + std::optional<T> pop_wait() { + if(!running) + return std::nullopt; + std::unique_lock<std::mutex> lock(mutex); + while(data_queue.empty() && running) cv.wait(lock); + if(!running) + return std::nullopt; + T data = std::move(data_queue.front()); + data_queue.pop_front(); + return data; + } + + void close() { + std::unique_lock<std::mutex> lock(mutex); + running = false; + cv.notify_one(); + } + + void clear() { + std::unique_lock<std::mutex> lock(mutex); + data_queue.clear(); + } + private: + std::deque<T> data_queue; + std::mutex mutex; + std::condition_variable cv; + bool running; + }; +}
\ No newline at end of file |