#pragma once #include #include /** 环形缓冲区结构体 */ typedef struct { void *buffer; /**< 缓冲区起始地址 */ size_t head; /**< 写索引 */ size_t tail; /**< 读索引 */ size_t max; /**< 最大元素数量 */ size_t sz; /**< 每个元素字节大小 */ bool full; /**< 是否已满标志 */ } RingBuffer; /** * 初始化环形缓冲区 * @param rb 指向 RingBuffer 结构 * @param capacity 最大元素个数 * @param elem_size 每个元素字节大小 * @return true 成功,false 内存分配失败 */ bool rb_init(RingBuffer *rb, size_t capacity, size_t elem_size); /** * 释放环形缓冲区占用的内存 * @param rb 指向 RingBuffer 结构 */ void rb_free(RingBuffer *rb); /** * 重置缓冲区为空 * @param rb 指向 RingBuffer 结构 */ void rb_reset(RingBuffer *rb); /** * 判断缓冲区是否为空 * @param rb 指向 RingBuffer 结构 * @return true 如果空,否则 false */ bool rb_empty(const RingBuffer *rb); /** * 判断缓冲区是否已满 * @param rb 指向 RingBuffer 结构 * @return true 如果满,否则 false */ bool rb_full(const RingBuffer *rb); /** * 向缓冲区写入一个元素 * @param rb 指向 RingBuffer 结构 * @param data 指向要写入的数据 * @return true 写入成功,false 缓冲区已满 */ bool rb_put(RingBuffer *rb, const void *data); /** * 从缓冲区读取一个元素 * @param rb 指向 RingBuffer 结构 * @param data 指向用于存放读取数据的缓冲 * @return true 读取成功,false 缓冲区为空 */ bool rb_get(RingBuffer *rb, void *data); /** * 获取当前缓冲区中已存储的元素数量 * @param rb 指向 RingBuffer 结构 * @return 已存储的元素数量 */ size_t rb_size(const RingBuffer *rb); /** * 批量向缓冲区写入多个元素 * @param rb 指向 RingBuffer 结构 * @param data 指向要写入的数据数组 * @param len 期望写入的元素个数 * @return 已成功写入的元素个数(可能小于 len,如果空间不足) */ size_t rb_put_bulk(RingBuffer *rb, const void *data, size_t len); /** * 批量向缓冲区读取多个元素 * @param rb 指向 RingBuffer 结构 * @param data 指向要写入的数据数组 * @param len 期望写入的元素个数 * @return 已成功写入的元素个数(可能小于 len,如果空间不足) */ size_t rb_get_bulk(RingBuffer *rb, void *data, size_t len) ;