93 lines
2.5 KiB
C
93 lines
2.5 KiB
C
#pragma once
|
||
|
||
|
||
#include <stdbool.h>
|
||
#include <stddef.h>
|
||
|
||
/** 环形缓冲区结构体 */
|
||
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) ;
|
||
|
||
|