38 std::is_same_v<EmplaceEnablerType,
typename QueueType::EmplaceEnabler>,
39 "Do not instantiate Producer on your own. Use Producer type alias "
43 using ValueType =
typename QueueType::ValueType;
46 Producer(
const Producer&) =
delete;
47 Producer(Producer&&)
noexcept =
default;
48 Producer& operator=(
const Producer&) =
delete;
49 Producer& operator=(Producer&& other)
noexcept {
50 queue_.swap(other.queue_);
51 std::swap(token_, other.token_);
57 queue_->MarkProducerIsDead();
65 [[nodiscard]]
bool Push(ValueType&& value, engine::Deadline deadline
= {})
const {
66 UASSERT_MSG(queue_,
"Trying to use a moved-from queue Producer");
68 return queue_->Push(token_, std::move(value), deadline);
76 UASSERT_MSG(queue_,
"Trying to use a moved-from queue Producer");
77 return queue_->PushNoblock(token_, std::move(value));
80 void Reset() &&
noexcept {
82 queue_->MarkProducerIsDead();
85 [[maybe_unused]] ProducerToken for_destruction = std::move(token_);
89 [[nodiscard]] std::shared_ptr<
const QueueType>
Queue()
const {
return {queue_}; }
93 Producer(std::shared_ptr<QueueType> queue, EmplaceEnablerType )
94 : queue_(std::move(queue)),
95 token_(queue_->queue_)
100 std::shared_ptr<QueueType> queue_;
101 mutable ProducerToken token_;
110class Consumer
final {
112 std::is_same_v<EmplaceEnablerType,
typename QueueType::EmplaceEnabler>,
113 "Do not instantiate Consumer on your own. Use Consumer type alias "
117 using ValueType =
typename QueueType::ValueType;
120 Consumer(
const Consumer&) =
delete;
121 Consumer(Consumer&&)
noexcept =
default;
122 Consumer& operator=(
const Consumer&) =
delete;
123 Consumer& operator=(Consumer&& other)
noexcept {
124 queue_.swap(other.queue_);
125 std::swap(token_, other.token_);
131 queue_->MarkConsumerIsDead();
143 [[nodiscard]]
bool Pop(ValueType& value, engine::Deadline deadline
= {})
const {
144 UASSERT_MSG(queue_,
"Trying to use a moved-from queue Consumer");
146 return queue_->Pop(token_, value, deadline);
154 UASSERT_MSG(queue_,
"Trying to use a moved-from queue Consumer");
155 return queue_->PopNoblock(token_, value);
160 queue_->MarkConsumerIsDead();
163 [[maybe_unused]] ConsumerToken for_destruction = std::move(token_);
167 [[nodiscard]] std::shared_ptr<
const QueueType>
Queue()
const {
return {queue_}; }
171 Consumer(std::shared_ptr<QueueType> queue, EmplaceEnablerType )
172 : queue_(std::move(queue)),
173 token_(queue_->queue_)
178 std::shared_ptr<QueueType> queue_{};
179 mutable ConsumerToken token_;