6#include "queue_typed_base.hpp"
7#include "spsc_queue_base.hpp"
27template <
typename Data>
32 static_assert(
alignof(Data) <=
alignof(std::max_align_t),
33 "SPSCQueue does not support over-aligned payload types");
100 template <
typename Writer>
120 template <
typename Writer>
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");
134 Writer& writer_ref = writer;
137 [&](
void* buffer,
size_t count) ->
ErrorCode
139 return writer_ref(
static_cast<Data*
>(buffer), count);
157 template <
typename Reader>
177 template <
typename Reader>
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");
191 Reader& reader_ref = reader;
194 [&](
const void* buffer,
size_t count) ->
ErrorCode
196 return reader_ref(
static_cast<const Data*
>(buffer), count);
ErrorCode Push(const Data &item)
单生产者单消费者字节队列内核 / 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
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。