6#include "queue_typed_base.hpp"
7#include "spsc_queue_base.hpp"
27template <
typename Data>
31 static_assert(
alignof(Data) <=
alignof(std::max_align_t),
32 "SPSCQueue does not support over-aligned payload types");
95 template <
typename Writer>
115 template <
typename Writer>
119 std::is_trivially_copyable_v<Data>,
120 "batched SPSCQueue::PushWithWriter requires trivially copyable payloads");
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");
131 Writer& writer_ref = writer;
133 size, [&](
void* buffer,
size_t count) ->
ErrorCode
134 {
return writer_ref(
static_cast<Data*
>(buffer), count); });
151 template <
typename Reader>
172 template <
typename Reader>
176 std::is_trivially_copyable_v<Data>,
177 "batched SPSCQueue::PopWithReader requires trivially copyable payloads");
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");
188 Reader& reader_ref = reader;
190 size, [&](
const void* buffer,
size_t count) ->
ErrorCode
191 {
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。