Files
checker_m4/source/soft/list.h

91 lines
2.7 KiB
C
Raw Normal View History

2023-06-25 15:30:36 +08:00
#ifndef list_h__
#define list_h__
#include "stdint.h"
#include "stdlib.h"
struct _list_def;
typedef struct _list_def list_def;
typedef int (*sub_fun_def)(void *a,void *b);
typedef int (*del_fun_def)(void *p);
// 生成打印字符串指针列表获取后会使用free释放
typedef char *(*str_fun_def)(void *p);
#define INT_SUB _list_int_sub
#define INT_DEL 0
#define INT_STR _list_int_str
#define STR_SUB _list_str_sub
#define STR_DEL _list_str_del
#define STR_STR _list_str_str
/*r{ 基本操作函数 }c*/
list_def *list_creat(int block_size,sub_fun_def sub,del_fun_def del,str_fun_def str);
void *list_get(list_def *l,int index);
void list_remove(list_def *l,int index);
void *list_take(list_def *l,int index);/*temp_ptr*/
void list_clear(list_def *l);
int list_length(list_def *l);
int list_block_size4(list_def *l);
void list_sort(list_def *l);
int list_contains(list_def *l,void *d);
void list_swap(list_def *l,int index_a,int index_b);
char *list_string(list_def *l);
void list_shift(list_def *l);
/*r{ 宏函数 }c*/
#define list_creat_int() list_creat(sizeof(int),INT_SUB,INT_DEL,INT_STR)
#define list_creat_str() list_creat(sizeof(char *),STR_SUB,STR_DEL,STR_STR)
#define list_delete(l) _list_delete(&(l))
#define list_insert(l,data,index) _list_insert(&(l),data,index)
#define list_append(l,data) list_insert(l,data,-1)
#define list_insert_int(l,int_,index) list_insert(l,(uint32_t []){int_},index)
#define list_append_int(l,int_) list_insert_int(l,int_,-1)
#define list_append_str(l,str) list_insert_str(l,str,-1)
#define list_get_int(l,index) (*(int *)list_get(l,index))
#define list_get_str(sl,index) (*(char **)list_get(sl,index))
#define list_take_str(sl,index) (*(char **)list_take(sl,index))
#define list_take_int(l,index) (*(int *)list_take(l,index))
#define list_insert_str(l,str,index)\
{\
char *c=malloc(strlen(str)+1);\
param_check(c);\
memcpy(c,str,strlen(str)+1);\
list_insert(l,(uint32_t []){(uint32_t)(c)},index);}
// 要保证ab的类型相同
#define list_append_from(a,b) \
for(int i=0;i<list_length(b);i++) {list_append(a,list_get(b,i));}
#define list_appends(a,d,num) \
for(int i=0;i<num;i++) {list_append(a,&d[i]);}
// 转化为列表的临时指针
#define list_temp(l) tappend(l,_list_delete_later)
/*r{ 用户不应直接调用的函数 }c*/
list_def *_list_insert(list_def **l,void *data,int index);
void _list_delete(list_def **l);
void _list_delete_later(list_def *l);
int _list_int_sub(void *a,void *b);
char *_list_int_str(void *a);
int _list_str_sub(void *a,void *b);
int _list_str_del(void *d);
char *_list_str_str(void *a);
void _list_sort(list_def *l,sub_fun_def sub);
#endif