CMake构建CH58x项目,脱离eclipse使用Clion或者Vscode编写代码。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

132 lines
5.8 KiB

#ifndef __ARRAY_H
#define __ARRAY_H
#ifdef ARRAY_ENABLE
#include "CH58x_common.h"
//#include "stdbool.h"
#include "stdlib.h"
#include "string.h"
#ifndef FreePtr
#define FreePtr(ptr) \
do \
{ \
if (ptr!=NULL) \
{ \
free(ptr); \
ptr = NULL; \
} \
} while (0)
#endif
#define Array_DefSize 256
typedef struct {
bool type; // true: 动态数组, false: 静态数组
uint8_t *Data;
uint8_t ElemBytes; // The number of bytes a piece of data occupies.
int Size;
int Cap;
} Array_t;
/*动态数组初始化*/
// void Array_Init(Array_t *array, int cap, uint8_t elm_bytes); //暂时不建议使用
void Array_InitStatic(Array_t *array, int cap, uint8_t elm_bytes, uint8_t *buff);
#define Array_Initialize(array, buf, buff) Array_InitStatic(array,cap,1,buff)
// 注意这个宏前面的if一定要加花括号
#define Array_Create(arrayName, cap) \
uint8_t arrayName##_buff[cap]={0}; \
Array_t arrayName; \
Array_InitStatic(&arrayName, cap, 1, arrayName##_buff)
/*动态数组销毁*/
void Array_Destroy(Array_t *array);
/*给动态数组添加一个数组*/
bool Array_AddArray(Array_t *array, const uint8_t *value, int size);
bool Array_AddArrayUint8(Array_t *array, uint8_t value, int index);
/*给动态数组指定位置插入一组数据*/
bool Array_Insert(Array_t *array, uint8_t *value, int size, int index);
/*给动态数组指定位置删除一组数据*/
bool Array_Remove(Array_t *array, int start, int end);
/*获取动态数组的元素个数*/
#define Array_GetSize(array) ((array)->Size)
/*获取动态数组可容纳的元素个数*/
#define Array_GetCap(array) ((array)->Cap)
/*获取动态数组中一个元素所占字节*/
#define Array_GetElemBytes(array) ((array)->ElemBytes)
/*获取动态数组总共占的字节数*/
#define Array_GetAllSize(array) ((array)->Size * (array)->ElemBytes)
/*获取动态数组总共能容纳的字节数*/
#define Array_GetAllCap(array) ((array)->Cap * (array)->ElemBytes)
/*获取动态数组指定位置的指针
* 用法:
* uint16_t *p = NULL;
* Array_PopPtr(&Arr, p);
* */
#define Array_GetPtr(arr, index) ((void *)((arr)->Data + (index) * (arr)->ElemBytes))
/*获取动态数组指定位置的结构体(该接口用于动态数组中存储的是64位数据或者结构体的情况)
* 用法:
* Test_t st = {0};//Test_t是一个结构体
* Array_PopPtr(&Arr, &st);
*/
#define Array_GetStruct(arr, index, ptr) memcpy(ptr, Array_GetPtr(arr, index), Array_GetElemBytes(arr))
/*给动态数组指push数据*/
#define Array_Push(array, data) \
do \
{ \
for (int arraypush__i = 0; arraypush__i < (array)->ElemBytes; arraypush__i++) \
{ \
uint8_t array__push__val = ((data) >> (arraypush__i * 8)) & 0xff; \
Array_AddArrayUint8(array, array__push__val, arraypush__i); \
} \
(array)->Size++; \
} while (0)
/*给动态数组push一个数组*/
#define Array_PushArray(array, value, size) Array_AddArray(array, (uint8_t *)(value), size)
/*给动态数组push一个结构体*/
#define Array_PushStruct(array, value) Array_PushArray(array, &(value), 1)
/*获取指定位置的数据*/
#define Array_GetVal(arr, index) \
({ \
uint32_t array__get__val = 0; \
uint8_t array_elm_bytes = (arr)->ElemBytes; \
int mindex = (index)*array_elm_bytes; \
for (uint8_t i = 0; i < array_elm_bytes; i++) \
{ \
array__get__val |= ((uint32_t)(arr)->Data[mindex + i]) << (i * 8); \
} \
(array__get__val); \
})
/*获取该数组的数据并存入并返回给buff指针,并返回数组元素个数*/
// #define Array_GetArrayPtr(array, buff) \
// ({ \
// int array__all__size = Array_GetAllSize(array); \
// (buff) = malloc(array__all__size); \
// memcpy((buff), (array)->Data, array__all__size); \
// ((array)->Size); \
// })
/*pop一个数据*/
#define Array_PopVal(array) \
({ \
uint32_t array__pop__val = Array_GetVal(array, 0); \
Array_Remove(array, 0, 1); \
(array__pop__val); \
})
/*pop一个指针*/
#define Array_PopPtr(arr, ptr) \
do \
{ \
uint8_t array__elm__bytes = (arr)->ElemBytes; \
memcpy(ptr, (arr)->Data, array__elm__bytes); \
Array_Remove(arr, 0, 1); \
} while (0)
/*pop一个结构体*/
#define Array_PopStruct Array_PopPtr
/*清空一个动态数组*/
#define Array_Clear(arr) (arr)->Size = 0
#endif // ARRAY_ENABLE
#endif