#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);}
// 要保证a，b的类型相同
#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

