libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
spsc_queue.hpp
1#pragma once
2
3#include <cstddef>
4#include <type_traits>
5
6#include "queue_typed_base.hpp"
7#include "spsc_queue_base.hpp"
8
9namespace LibXR
10{
27template <typename Data>
28class SPSCQueue final : public QueueTypedBase<SPSCQueue<Data>, Data>, public SPSCQueueBase
29{
30 public:
31 static_assert(alignof(Data) <= alignof(std::max_align_t),
32 "SPSCQueue does not support over-aligned payload types");
33
34 using ValueType = Data;
39
47 explicit SPSCQueue(size_t length) : SPSCQueueBase(sizeof(Data), alignof(Data), length)
48 {
49 }
50
55 ~SPSCQueue() = default;
56
65 ErrorCode Peek(Data& item) { return SPSCQueueBase::PeekBytes(&item); }
66
76 ErrorCode PushBatch(const Data* data, size_t size)
77 {
78 return SPSCQueueBase::PushBatchBytes(data, size);
79 }
80
95 template <typename Writer>
96 ErrorCode PushWithWriter(Writer&& writer)
97 {
98 return PushWithWriter(1, std::forward<Writer>(writer));
99 }
100
115 template <typename Writer>
116 ErrorCode PushWithWriter(size_t size, Writer&& writer)
117 {
118 static_assert(
119 std::is_trivially_copyable_v<Data>,
120 "batched SPSCQueue::PushWithWriter requires trivially copyable payloads");
121 static_assert(
122 std::is_trivially_destructible_v<Data>,
123 "batched SPSCQueue::PushWithWriter requires trivially destructible payloads");
124 static_assert(std::is_invocable_v<Writer&, Data*, size_t>,
125 "PushWithWriter writer must be callable as "
126 "ErrorCode(Data* buffer, size_t count)");
127 using WriterRet = std::invoke_result_t<Writer&, Data*, size_t>;
128 static_assert(std::is_convertible_v<WriterRet, ErrorCode>,
129 "PushWithWriter writer return type must be convertible to ErrorCode");
130
131 Writer& writer_ref = writer;
133 size, [&](void* buffer, size_t count) -> ErrorCode
134 { return writer_ref(static_cast<Data*>(buffer), count); });
135 }
136
151 template <typename Reader>
152 ErrorCode PopWithReader(Reader&& reader)
153 {
154 return PopWithReader(1, std::forward<Reader>(reader));
155 }
156
172 template <typename Reader>
173 ErrorCode PopWithReader(size_t size, Reader&& reader)
174 {
175 static_assert(
176 std::is_trivially_copyable_v<Data>,
177 "batched SPSCQueue::PopWithReader requires trivially copyable payloads");
178 static_assert(
179 std::is_trivially_destructible_v<Data>,
180 "batched SPSCQueue::PopWithReader requires trivially destructible payloads");
181 static_assert(std::is_invocable_v<Reader&, const Data*, size_t>,
182 "PopWithReader reader must be callable as "
183 "ErrorCode(const Data* buffer, size_t count)");
184 using ReaderRet = std::invoke_result_t<Reader&, const Data*, size_t>;
185 static_assert(std::is_convertible_v<ReaderRet, ErrorCode>,
186 "PopWithReader reader return type must be convertible to ErrorCode");
187
188 Reader& reader_ref = reader;
190 size, [&](const void* buffer, size_t count) -> ErrorCode
191 { return reader_ref(static_cast<const Data*>(buffer), count); });
192 }
193
203 ErrorCode PopBatch(Data* data, size_t size)
204 {
205 return SPSCQueueBase::PopBatchBytes(data, size);
206 }
207
217 ErrorCode PeekBatch(Data* data, size_t size)
218 {
219 return SPSCQueueBase::PeekBatchBytes(data, size);
220 }
221
227};
228} // namespace LibXR
强类型队列的公共薄包装。
单生产者单消费者字节队列内核 / Single-producer single-consumer byte-queue core
void Reset()
重置队列状态 / Reset the queue state
ErrorCode PeekBytes(void *value)
按字节查看一个队头 payload 但不出队 / Peek one front payload by bytes without dequeuing it
ErrorCode PeekBatchBytes(void *data, size_t count)
按字节批量查看多个 payload 但不出队 / Peek multiple payloads by bytes without dequeuing them
ErrorCode PopBatchBytes(void *data, size_t count)
按字节批量出队多个 payload / Dequeue multiple payloads by bytes
ErrorCode PushBatchBytes(const void *data, size_t count)
按字节批量入队多个 payload / Enqueue multiple payloads by bytes
ErrorCode PopBytesWithReader(size_t count, Reader &&reader)
通过读取器回调批量出队 payload / Dequeue payloads through a reader callback
ErrorCode PushBytesWithWriter(size_t count, Writer &&writer)
通过写入器回调批量入队 payload / Enqueue payloads through a writer callback
单生产者单消费者无锁队列。
void Reset()
重置队列状态。
ErrorCode PopWithReader(size_t size, Reader &&reader)
通过读取器回调批量弹出 payload。
ErrorCode PeekBatch(Data *data, size_t size)
批量查看多个 payload 但不出队。
ErrorCode PopBatch(Data *data, size_t size)
批量弹出多个 payload。
SPSCQueue(size_t length)
构造一个 SPSC 队列。
~SPSCQueue()=default
析构一个 SPSC 队列。
ErrorCode Peek(Data &item)
查看一个队头 payload 但不出队。
ErrorCode PopWithReader(Reader &&reader)
通过读取器回调弹出一个 payload。
ErrorCode PushWithWriter(size_t size, Writer &&writer)
通过写入器回调批量推入 payload。
ErrorCode PushWithWriter(Writer &&writer)
通过写入器回调推入一个 payload。
ErrorCode PushBatch(const Data *data, size_t size)
批量推入多个 payload。
LibXR 命名空间
Definition ch32_can.hpp:14
ErrorCode
定义错误码枚举