2#include <condition_variable>
14 std::unique_ptr<Node>
next;
43 void push(
const T& value) {
44 auto dummy = std::make_unique<Node>();
48 tail_->next = std::move(dummy);
57 auto dummy = std::make_unique<Node>();
60 tail_->value = std::move(value);
61 tail_->next = std::move(dummy);
69 template <
typename... Args>
71 auto dummy = std::make_unique<Node>();
74 tail_->value.emplace(std::forward<Args>(args)...);
75 tail_->next = std::move(dummy);
99 auto oldHead = std::move(
head_);
100 head_ = std::move(oldHead->next);
101 return std::move(oldHead->value);
110 auto oldHead = std::move(
head_);
111 head_ = std::move(oldHead->next);
112 return oldHead->value.value();
ConcurrentFlexQueue(const ConcurrentFlexQueue &)=delete
std::unique_ptr< Node > head_
void emplace(Args &&... args)
Constructs a new element in place at the end of the queue.
bool empty() const
Checks if the queue is empty.
ConcurrentFlexQueue(ConcurrentFlexQueue &&)=delete
void push(T &&value)
Pushes a new element into the queue.
std::optional< T > tryPop()
Attempts to pop and return the first element.
T waitPop()
Waits until the queue is not empty, then pops and returns the first element.
ConcurrentFlexQueue & operator=(const ConcurrentFlexQueue &)=delete
void push(const T &value)
Pushes a new element into the queue.
std::optional< T > tryFront() const
Attempts to retrieve the first element without removing it.
ConcurrentFlexQueue & operator=(ConcurrentFlexQueue &&)=delete
ConcurrentFlexQueue()
Constructs an empty queue.
std::condition_variable blocked_
std::unique_ptr< Node > next