Skip to content

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_;
};