4#ifndef FTXUI_COMPONENT_RECEIVER_HPP_
5#define FTXUI_COMPONENT_RECEIVER_HPP_
9#include <condition_variable>
46template<
class T>
class SenderImpl;
48template<
class T>
class ReceiverImpl;
52template<
class T>
using Sender = std::unique_ptr<SenderImpl<T>>;
54template<
class T>
using Receiver = std::unique_ptr<ReceiverImpl<T>>;
69 void Send(T t) { receiver_->Receive(std::move(t)); }
84 std::unique_lock<std::mutex> lock(mutex_);
86 return std::unique_ptr<SenderImpl<T>>(
new SenderImpl<T>(
this));
91 while (senders_ || !queue_.empty()) {
92 std::unique_lock<std::mutex> lock(mutex_);
99 *t = std::move(queue_.front());
107 std::unique_lock<std::mutex> lock(mutex_);
108 if (queue_.empty()) {
117 std::unique_lock<std::mutex> lock(mutex_);
118 return !queue_.empty();
122 std::unique_lock<std::mutex> lock(mutex_);
123 return queue_.empty() && !senders_;
131 std::unique_lock<std::mutex> lock(mutex_);
132 queue_.push(std::move(t));
134 notifier_.notify_one();
137 void ReleaseSender() {
139 notifier_.notify_one();
143 std::queue<T> queue_;
144 std::condition_variable notifier_;
145 std::atomic<int> senders_{0};
150 return std::make_unique<ReceiverImpl<T>>();
bool ReceiveNonBlocking(T *t)
friend class SenderImpl< T >
friend class ReceiverImpl< T >
SenderImpl & operator=(const SenderImpl &)=delete
SenderImpl(SenderImpl &&)=delete
SenderImpl(const SenderImpl &)=delete
SenderImpl & operator=(SenderImpl &&)=delete
The FTXUI ftxui:: namespace.
Receiver< T > MakeReceiver()
std::unique_ptr< ReceiverImpl< T > > Receiver
std::unique_ptr< SenderImpl< T > > Sender