24#include <condition_variable>
41class IBusMessageQueue {
43 IBusMessageQueue() =
default;
50 void Push(
const std::shared_ptr<IBusMessage>& message);
60 void Push(
const std::vector<uint8_t>& message_buffer);
70 void PushFront(
const std::shared_ptr<IBusMessage>& message);
80 std::shared_ptr<IBusMessage>
Pop();
89 template <
class Rep,
class Period >
90 std::shared_ptr<IBusMessage>
PopWait(
const std::chrono::duration<Rep,
103 [[nodiscard]]
size_t Size()
const;
117 template <
class Rep,
class Period >
118 void EmptyWait(
const std::chrono::duration<Rep, Period>& rel_time);
136 std::deque<std::shared_ptr<IBusMessage>> queue_;
137 mutable std::mutex queue_mutex_;
138 std::atomic<size_t> queue_size_ = 0;
139 std::condition_variable queue_not_empty_;
142template<
class Rep,
class Period >
145 std::unique_lock lock(queue_mutex_);
146 queue_not_empty_.wait_for(lock, rel_time, [&] () ->
bool {
147 return queue_size_.load() > 0;
150 std::shared_ptr<IBusMessage> message;
151 if (!queue_.empty()) {
152 message = std::move(queue_.front());
154 queue_size_ = queue_.size();
162template<
class Rep,
class Period >
164 std::unique_lock lock(queue_mutex_);
165 queue_not_empty_.wait_for(lock, rel_time, [&] () ->
bool {
166 return queue_size_.load() > 0;
bool Empty() const
Returns true if the queue is empty.
size_t MessageSize() const
Retuns the size of next message.
virtual ~IBusMessageQueue()
Destructor.
void Clear()
Removes all messages in the queue.
void Push(const std::shared_ptr< IBusMessage > &message)
Adds a message to the end of the queue.
virtual void Stop()
Stops the queue.
void Push(const std::vector< uint8_t > &message_buffer)
Adds a serialized message to the queue.
size_t Size() const
Retuns the number messages in the queue.
virtual void Start()
Initialize the queue.
std::shared_ptr< IBusMessage > PopWait(const std::chrono::duration< Rep, Period > &rel_time)
Blocks a period if queue is empty otherwise returning a message.
Definition ibusmessagequeue.h:143
std::shared_ptr< IBusMessage > Pop()
Extract a message from the front of the queue.
void EmptyWait(const std::chrono::duration< Rep, Period > &rel_time)
Waits a period or direct if the queue not is empty.
Definition ibusmessagequeue.h:163
void PushFront(const std::shared_ptr< IBusMessage > &message)
Adds a message first in the queue.
Defines an interface against a bus message.
Main namespace for the MDF library.
Definition buslogstream.h:24