Program Listing for File queue.hpp

Return to documentation for file (include/queue.hpp)

#ifndef RIG_RECONFIGURE_QUEUE_HPP
#define RIG_RECONFIGURE_QUEUE_HPP

#include <mutex>
#include <queue>
#include <optional>
#include <condition_variable>

template <typename T>
class Queue {
  public:
    template<typename F>
    void push(F&& data) {
        std::lock_guard<std::mutex> guard(mutex);
        queue.push_back(std::forward<F>(data));
        cv.notify_one();
    }

    T pop() {
        std::unique_lock<std::mutex> lock(mutex);
        while (queue.empty()) {
            cv.wait(lock);
        }
        T data = std::move(queue.front());
        queue.pop_front();

        return data;
    }

    std::optional<T> try_pop() {
        std::unique_lock<std::mutex> lock(mutex);

        if (queue.empty()) {
            return std::nullopt;
        }

        T data = std::move(queue.front());
        queue.pop_front();

        return data;
    }

    size_t length() {
        std::lock_guard<std::mutex> lock(mutex);
        return queue.size();
    }

  private:
    std::deque<T> queue;
    std::mutex mutex;
    std::condition_variable cv;
};

#endif // RIG_RECONFIGURE_QUEUE_HPP