5#include <userver/engine/deadline.hpp>
14 template <
typename LockFreeQueue>
15 explicit NoToken(LockFreeQueue& ) {}
22template <
typename QueueType,
typename ProducerToken,
23 typename EmplaceEnablerType>
26 std::is_same_v<EmplaceEnablerType,
typename QueueType::EmplaceEnabler>,
27 "Do not instantiate Producer on your own. Use Producer type alias "
30 using ValueType =
typename QueueType::ValueType;
33 Producer(
const Producer&) =
delete;
34 Producer(Producer&&)
noexcept =
default;
35 Producer& operator=(
const Producer&) =
delete;
36 Producer& operator=(Producer&&)
noexcept =
default;
39 if (queue_) queue_->MarkProducerIsDead();
46 [[nodiscard]]
bool Push(ValueType&& value,
47 engine::Deadline deadline
= {})
const {
49 return queue_->Push(token_, std::move(value), deadline);
56 [[nodiscard]]
bool PushNoblock(ValueType&& value)
const {
58 return queue_->PushNoblock(token_, std::move(value));
62 if (queue_) queue_->MarkProducerIsDead();
67 [[nodiscard]] std::shared_ptr<
const QueueType>
Queue()
const {
73 Producer(std::shared_ptr<QueueType> queue, EmplaceEnablerType )
74 : queue_(std::move(queue)), token_(queue_->queue_) {}
78 std::shared_ptr<QueueType> queue_;
79 mutable ProducerToken token_;
84template <
typename QueueType,
typename EmplaceEnablerType>
87 std::is_same_v<EmplaceEnablerType,
typename QueueType::EmplaceEnabler>,
88 "Do not instantiate Consumer on your own. Use Consumer type alias "
91 using ValueType =
typename QueueType::ValueType;
92 using ConsumerToken =
typename QueueType::ConsumerToken;
95 Consumer(
const Consumer&) =
delete;
96 Consumer(Consumer&&)
noexcept =
default;
97 Consumer& operator=(
const Consumer&) =
delete;
98 Consumer& operator=(Consumer&&)
noexcept =
default;
101 if (queue_) queue_->MarkConsumerIsDead();
109 [[nodiscard]]
bool Pop(ValueType& value,
110 engine::Deadline deadline
= {})
const {
111 return queue_->Pop(token_, value, deadline);
117 [[nodiscard]]
bool PopNoblock(ValueType& value)
const {
118 return queue_->PopNoblock(token_, value);
122 [[nodiscard]] std::shared_ptr<
const QueueType>
Queue()
const {
128 Consumer(std::shared_ptr<QueueType> queue, EmplaceEnablerType )
129 : queue_(std::move(queue)), token_(queue_->queue_) {}
133 std::shared_ptr<QueueType> queue_{};
134 mutable ConsumerToken token_;