145 lines
5.1 KiB
C
145 lines
5.1 KiB
C
/**
|
|
* 日期: 2025-03-08
|
|
* 作者: coffee
|
|
* 描述: vector数组, 可用于存储8, 16, 32位数据
|
|
* 长度可扩展到4字节, 需定义宏, 默认1字节长度
|
|
* 使用宏定义变量, HVECTOR_DEFINE
|
|
*/
|
|
|
|
|
|
#ifndef _H_VECTOR_H
|
|
#define _H_VECTOR_H
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
|
|
enum eHVectorFlag {
|
|
kHVectorFlag8 = 0x01, // 数据8位
|
|
kHVectorFlag16 = 0x02, // 数据16位
|
|
kHVectorFlag32 = 0x04, // 数据32位
|
|
|
|
kHVectorFlagAllMask = 0x07, // 数据掩码
|
|
|
|
kHVectorNeedInit = 0x80, // 需要初始化
|
|
};
|
|
|
|
|
|
typedef uint8_t HVectorType; // vector类型
|
|
typedef uint32_t HVectorDataType; // vector统一数据类型
|
|
|
|
#ifdef _HVECTOR_LEN_USE32
|
|
#define HVECTOR_ERROR (0xffffffff)
|
|
typedef uint32_t HVectorLenType;
|
|
#elif defined(_HVECTOR_LEN_USE16)
|
|
#define HVECTOR_ERROR (0xffff)
|
|
typedef uint16_t HVectorLenType;
|
|
#else
|
|
#define HVECTOR_ERROR (0xff)
|
|
typedef uint8_t HVectorLenType; // vector长度类型
|
|
#endif
|
|
|
|
#pragma pack(1)
|
|
|
|
typedef struct _HVectorBase {
|
|
uint8_t flag;
|
|
HVectorLenType len;
|
|
HVectorLenType useLen;
|
|
} _HVectorBase;
|
|
|
|
typedef struct _HVector8 {
|
|
_HVectorBase base;
|
|
uint8_t data[0];
|
|
} _HVector8;
|
|
|
|
typedef struct _HVector16 {
|
|
_HVectorBase base;
|
|
uint16_t data[0];
|
|
} _HVector16;
|
|
|
|
typedef struct _HVector32 {
|
|
_HVectorBase base;
|
|
uint32_t data[0];
|
|
} _HVector32;
|
|
#pragma pack()
|
|
|
|
// 用于支持多数据类型的宏
|
|
#define _HVECTOR_CALC_LEN8(len) (sizeof(_HVector8) + (len))
|
|
#define _HVECTOR_CALC_LEN16(len) (sizeof(_HVector16) + (len) * sizeof(uint16_t))
|
|
#define _HVECTOR_CALC_LEN32(len) (sizeof(_HVector32) + (len) * sizeof(uint32_t))
|
|
#define _HVECTOR_CALC_LEN(num, type) (_HVECTOR_CALC_LEN##type(num))
|
|
|
|
// 用于辅助多类型数值计算
|
|
#ifdef _HVECTOR_LEN_USE32
|
|
#define _HVECTOR_INIT_SIZE(size) ((size >> 24) & 0xff), ((size >> 16) & 0xff), ((size >> 8) & 0xff), (size & 0xff)
|
|
#define _HVECTOR_INIT_SIZE_INIT(size) ((size[0] << 24) | (size[1] << 16) | (size[2] << 8) | (size[3] & 0xff))
|
|
#elif defined(_HVECTOR_LEN_USE16)
|
|
#define _HVECTOR_INIT_SIZE(size) ((size >> 8) & 0xff), (size & 0xff)
|
|
#define _HVECTOR_INIT_SIZE_INIT(size) ((size[0] << 8) | (size[1] & 0xff))
|
|
#else
|
|
#define _HVECTOR_INIT_SIZE(size) (size & 0xff)
|
|
#define _HVECTOR_INIT_SIZE_INIT(size) (size[0] & 0xff)
|
|
#endif
|
|
|
|
// 用于初始化vector宏
|
|
#define _HVECTOR_INIT8(size) { kHVectorNeedInit | kHVectorFlag8, _HVECTOR_INIT_SIZE(size), _HVECTOR_INIT_SIZE(0) }
|
|
#define _HVECTOR_INIT16(size) { kHVectorNeedInit | kHVectorFlag16, _HVECTOR_INIT_SIZE(size), _HVECTOR_INIT_SIZE(0) }
|
|
#define _HVECTOR_INIT32(size) { kHVectorNeedInit | kHVectorFlag32, _HVECTOR_INIT_SIZE(size), _HVECTOR_INIT_SIZE(0) }
|
|
#define _HVECTOR_INIT(size, type) _HVECTOR_INIT##type(size)
|
|
|
|
/** ================================================================================ **/
|
|
|
|
|
|
// 定义vector, name为变量名, size为数据长度
|
|
#define HVECTOR_DEFINE(name, size) HVectorType name[_HVECTOR_CALC_LEN(size, 8)] = _HVECTOR_INIT(size, 8)
|
|
#define HVECTOR_DEFINE16(name, size) HVectorType name[_HVECTOR_CALC_LEN(size, 16)] = _HVECTOR_INIT(size, 16)
|
|
#define HVECTOR_DEFINE32(name, size) HVectorType name[_HVECTOR_CALC_LEN(size, 32)] = _HVECTOR_INIT(size, 32)
|
|
|
|
#define HVECTOR_EXTERN(name, size) extern HVectorType name[_HVECTOR_CALC_LEN(size, 8)]
|
|
#define HVECTOR_EXTERN16(name, size) extern HVectorType name[_HVECTOR_CALC_LEN(size, 16)]
|
|
#define HVECTOR_EXTERN32(name, size) extern HVectorType name[_HVECTOR_CALC_LEN(size, 32)]
|
|
|
|
|
|
// 添加数据, 成功返回1, 失败返回 0
|
|
uint8_t HVectorAddData(HVectorType *vector, HVectorDataType data);
|
|
// 添加字节数据, 超出仅复制到最大长度, 返回复制长度
|
|
HVectorLenType HVectorAddBytes(HVectorType *vector, const uint8_t *datas, HVectorLenType byteLen);
|
|
// 添加对应格式数据, 要求datas类型是同一对应位类型, 长度为字节长度, 超出仅复制到最大长度, 返回复制长度
|
|
HVectorLenType HVectorAddDatas(HVectorType *vector, const void *datas, HVectorLenType byteLen);
|
|
|
|
// 获取数据, 失败返回 HVECTOR_ERROR
|
|
HVectorDataType HVectorGetData(HVectorType *vector, HVectorLenType index);
|
|
// 超出位置返回NULL, 数据长度是根据字节长度
|
|
void *HVectorGetByteDataPtr(HVectorType *vector, HVectorLenType pos);
|
|
// 超出位置返回NULL, 数据长度是根据类型长度的, 非字节长度
|
|
void *HVectorGetDataPtr(HVectorType *vector, HVectorLenType pos);
|
|
|
|
// 获取数据总长度
|
|
HVectorLenType HVectorGetLen(HVectorType *vector);
|
|
|
|
// 获取数据字节总长度
|
|
HVectorLenType HVectorGetByteLen(HVectorType *vector);
|
|
|
|
// 获取数据使用长度
|
|
HVectorLenType HVectorGetUseLen(HVectorType *vector);
|
|
|
|
// 获取数据使用字节长度
|
|
HVectorLenType HVectorGetUseByteLen(HVectorType *vector);
|
|
|
|
// 清空数据
|
|
void HVectorClear(HVectorType *vector);
|
|
|
|
// 设置数据使用长度, 超过使用长度则不修改
|
|
void HVectorSetUseLen(HVectorType *vector, HVectorLenType len);
|
|
|
|
// 查找数据, 返回索引, 不存在返回 HVECTOR_ERROR
|
|
HVectorLenType HVectorFindData(HVectorType *vector, HVectorDataType data);
|
|
|
|
// 判断数据是否为空
|
|
uint8_t HVectorEmpty(HVectorType *vector);
|
|
|
|
// 移除数据
|
|
void HVectorRemoveData(HVectorType *vector, HVectorLenType index, HVectorLenType len);
|
|
|
|
#endif // _H_VECTOR_H
|