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>,
29 public SPSCQueueBase
30{
31 public:
32 static_assert(alignof(Data) <= alignof(std::max_align_t),
33 "SPSCQueue does not support over-aligned payload types");
34
35 using ValueType = Data;
40
48 explicit SPSCQueue(size_t length)
49 : SPSCQueueBase(sizeof(Data), alignof(Data), length)
50 {
51 }
52
57 ~SPSCQueue() = default;
58
67 ErrorCode Peek(Data& item)
68 {
69 return SPSCQueueBase::PeekBytes(&item);
70 }
71
81 ErrorCode PushBatch(const Data* data, size_t size)
82 {
83 return SPSCQueueBase::PushBatchBytes(data, size);
84 }
85
100 template <typename Writer>
101 ErrorCode PushWithWriter(Writer&& writer)
102 {
103 return PushWithWriter(1, std::forward<Writer>(writer));
104 }
105
120 template <typename Writer>
121 ErrorCode PushWithWriter(size_t size, Writer&& writer)
122 {
123 static_assert(std::is_trivially_copyable_v<Data>,
124 "batched SPSCQueue::PushWithWriter requires trivially copyable payloads");
125 static_assert(std::is_trivially_destructible_v<Data>,
126 "batched SPSCQueue::PushWithWriter requires trivially destructible payloads");
127 static_assert(std::is_invocable_v<Writer&, Data*, size_t>,
128 "PushWithWriter writer must be callable as "
129 "ErrorCode(Data* buffer, size_t count)");
130 using WriterRet = std::invoke_result_t<Writer&, Data*, size_t>;
131 static_assert(std::is_convertible_v<WriterRet, ErrorCode>,
132 "PushWithWriter writer return type must be convertible to ErrorCode");
133
134 Writer& writer_ref = writer;
136 size,
137 [&](void* buffer, size_t count) -> ErrorCode
138 {
139 return writer_ref(static_cast<Data*>(buffer), count);
140 });
141 }
142
157 template <typename Reader>
158 ErrorCode PopWithReader(Reader&& reader)
159 {
160 return PopWithReader(1, std::forward<Reader>(reader));
161 }
162
177 template <typename Reader>
178 ErrorCode PopWithReader(size_t size, Reader&& reader)
179 {
180 static_assert(std::is_trivially_copyable_v<Data>,
181 "batched SPSCQueue::PopWithReader requires trivially copyable payloads");
182 static_assert(std::is_trivially_destructible_v<Data>,
183 "batched SPSCQueue::PopWithReader requires trivially destructible payloads");
184 static_assert(std::is_invocable_v<Reader&, const Data*, size_t>,
185 "PopWithReader reader must be callable as "
186 "ErrorCode(const Data* buffer, size_t count)");
187 using ReaderRet = std::invoke_result_t<Reader&, const Data*, size_t>;
188 static_assert(std::is_convertible_v<ReaderRet, ErrorCode>,
189 "PopWithReader reader return type must be convertible to ErrorCode");
190
191 Reader& reader_ref = reader;
193 size,
194 [&](const void* buffer, size_t count) -> ErrorCode
195 {
196 return reader_ref(static_cast<const Data*>(buffer), count);
197 });
198 }
199
209 ErrorCode PopBatch(Data* data, size_t size)
210 {
211 return SPSCQueueBase::PopBatchBytes(data, size);
212 }
213
223 ErrorCode PeekBatch(Data* data, size_t size)
224 {
225 return SPSCQueueBase::PeekBatchBytes(data, size);
226 }
227
233};
234} // 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
定义错误码枚举