File msg_queue.h
File List > bindings > ipc > msg_queue.h
Go to the documentation of this file
#pragma once
#include <condition_variable>
#include <mutex>
#include <optional>
#include <queue>
template <typename T>
class MsgQueue {
public:
void Push(T&& message) {
std::unique_lock<std::mutex> lock(mutex_);
queue_.push(std::move(message));
condition_.notify_one();
}
std::optional<T> TryPop() {
std::unique_lock<std::mutex> lock(mutex_);
if (queue_.empty()) {
return std::nullopt;
}
auto message = std::move(queue_.front());
queue_.pop();
return message;
}
T Pop() {
std::unique_lock<std::mutex> lock(mutex_);
condition_.wait(lock, [&] {
return !queue_.empty();
});
auto message = std::move(queue_.front());
queue_.pop();
return message;
}
bool Empty() const {
std::unique_lock<std::mutex> lock(mutex_);
return queue_.empty();
}
uint32_t Size() const {
std::unique_lock<std::mutex> lock(mutex_);
return queue_.size();
}
private:
mutable std::mutex mutex_;
std::queue<T> queue_;
std::condition_variable condition_;
};