#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) ;


