Made the message queue iterable.
This commit is contained in:
parent
065181fc69
commit
803f1463dc
@ -25,9 +25,59 @@ namespace mijin
|
||||
// public types
|
||||
//
|
||||
|
||||
template<typename TMessageQueue>
|
||||
class MessageQueueIterator
|
||||
{
|
||||
public:
|
||||
using value_type = typename TMessageQueue::message_t;
|
||||
using reference = value_type&;
|
||||
using pointer = value_type*;
|
||||
private:
|
||||
TMessageQueue* queue_ = nullptr;
|
||||
std::optional<value_type> message_;
|
||||
public:
|
||||
MessageQueueIterator() = default;
|
||||
explicit MessageQueueIterator(TMessageQueue& queue) noexcept : queue_(&queue) {
|
||||
message_ = queue_->tryPop();
|
||||
}
|
||||
MessageQueueIterator(const MessageQueueIterator&) = delete;
|
||||
MessageQueueIterator(MessageQueueIterator&&) = default;
|
||||
|
||||
MessageQueueIterator& operator=(const MessageQueueIterator&) = delete;
|
||||
MessageQueueIterator& operator=(MessageQueueIterator&&) = default;
|
||||
|
||||
bool operator==(const MessageQueueIterator& other) noexcept
|
||||
{
|
||||
return message_.has_value() == other.message_.has_value();
|
||||
}
|
||||
bool operator!=(const MessageQueueIterator& other) noexcept
|
||||
{
|
||||
return !(*this == other);
|
||||
}
|
||||
|
||||
reference operator*() noexcept
|
||||
{
|
||||
return message_.value();
|
||||
}
|
||||
|
||||
pointer operator->() noexcept
|
||||
{
|
||||
return &message_.value();
|
||||
}
|
||||
|
||||
MessageQueueIterator& operator++() noexcept
|
||||
{
|
||||
message_ = queue_->tryPop();
|
||||
return *this;
|
||||
}
|
||||
};
|
||||
|
||||
template<typename TMessage, std::size_t bufferSize = 32>
|
||||
class MessageQueue
|
||||
{
|
||||
public:
|
||||
using message_t = TMessage;
|
||||
using iterator_t = MessageQueueIterator<MessageQueue<TMessage, bufferSize>>;
|
||||
private:
|
||||
std::array<TMessage, bufferSize> messages;
|
||||
mijin::BitArray<bufferSize, true> messageReady;
|
||||
@ -48,6 +98,9 @@ public:
|
||||
void push(TMessage message);
|
||||
[[nodiscard]] std::optional<TMessage> tryPop();
|
||||
[[nodiscard]] TMessage wait();
|
||||
|
||||
iterator_t begin() noexcept { return iterator_t(*this); }
|
||||
iterator_t end() noexcept { return iterator_t(); }
|
||||
};
|
||||
|
||||
template<typename TRequest, typename TResponse, std::size_t requestBufferSize = 32, std::size_t responseBufferSize = 32>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user