Files
checker_m4/source/soft/list.h
2023-06-25 15:30:36 +08:00

91 lines
2.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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