Made the message queue iterable.
This commit is contained in:
parent
065181fc69
commit
803f1463dc
@ -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>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user