Made the message queue iterable.

This commit is contained in:
Patrick 2023-11-19 20:03:24 +01:00
parent 065181fc69
commit 803f1463dc

View File

@ -25,9 +25,59 @@ namespace mijin
// public types // 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> template<typename TMessage, std::size_t bufferSize = 32>
class MessageQueue class MessageQueue
{ {
public:
using message_t = TMessage;
using iterator_t = MessageQueueIterator<MessageQueue<TMessage, bufferSize>>;
private: private:
std::array<TMessage, bufferSize> messages; std::array<TMessage, bufferSize> messages;
mijin::BitArray<bufferSize, true> messageReady; mijin::BitArray<bufferSize, true> messageReady;
@ -48,6 +98,9 @@ public:
void push(TMessage message); void push(TMessage message);
[[nodiscard]] std::optional<TMessage> tryPop(); [[nodiscard]] std::optional<TMessage> tryPop();
[[nodiscard]] TMessage wait(); [[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> template<typename TRequest, typename TResponse, std::size_t requestBufferSize = 32, std::size_t responseBufferSize = 32>