31 #ifndef GWEN_DUMMY_EMPTY_ARG 34 # define GWEN_DUMMY_EMPTY_ARG 255 #define GWEN_LIST_ELEMENT(t) \ 256 GWEN_LIST1_ELEMENT *_list1_element; 264 #define GWEN_LIST_FUNCTION_LIB_DEFS_CONST(t, pr, decl) \ 265 typedef GWEN_LIST1 t##_LIST; \ 266 typedef int GWENHYWFAR_CB (*t##_LIST_SORT_FN)(const t *a, const t *b, int ascending); \ 267 typedef t* (t##_LIST_FOREACH)(t *element, void *user_data); \ 270 decl t* pr##_List_First(const t##_LIST *l); \ 271 decl t* pr##_List_Last(const t##_LIST *l); \ 272 decl t* pr##_List_Next(const t *element); \ 273 decl t* pr##_List_Previous(const t *element); \ 274 decl uint32_t pr##_List_GetCount(const t##_LIST *l); \ 275 decl int pr##_List_HasElement(const t##_LIST *l, const t *element); \ 276 decl t##_LIST_SORT_FN pr##_List_SetSortFn(t##_LIST *l, t##_LIST_SORT_FN fn); \ 277 decl void pr##_List_Sort(t##_LIST *l, int ascending); \ 278 decl t* pr##_List_ForEach(t##_LIST *l, t##_LIST_FOREACH fn, void *user_data); 281 #define GWEN_LIST_FUNCTION_LIB_DEFS_NOCONST(t, pr, decl) \ 282 typedef GWEN_LIST1_ELEMENT t##_LIST_ELEMENT; \ 284 decl void pr##_List_Clear(t##_LIST *l); \ 285 decl t##_LIST* pr##_List_new(); \ 286 decl void pr##_List_free(t##_LIST *l); \ 287 decl int pr##_List_AddList(t##_LIST *dst, t##_LIST *l); \ 288 decl int pr##_List_Add(t *element, t##_LIST *list); \ 289 decl int pr##_List_Insert(t *element, t##_LIST *list); \ 290 decl int pr##_List_Del(t *element); 293 #define GWEN_LIST_FUNCTION_DEFS_CONST(t, pr) \ 294 GWEN_LIST_FUNCTION_LIB_DEFS_CONST(t, pr, GWEN_DUMMY_EMPTY_ARG) 296 #define GWEN_LIST_FUNCTION_DEFS_NOCONST(t, pr) \ 297 GWEN_LIST_FUNCTION_LIB_DEFS_NOCONST(t, pr, GWEN_DUMMY_EMPTY_ARG) 348 #define GWEN_LIST_FUNCTION_LIB_DEFS(t, pr, decl) \ 349 GWEN_LIST_FUNCTION_LIB_DEFS_CONST(t, pr, decl) \ 350 GWEN_LIST_FUNCTION_LIB_DEFS_NOCONST(t, pr, decl) 357 #define GWEN_LIST_FUNCTION_DEFS(t, pr) \ 358 GWEN_LIST_FUNCTION_LIB_DEFS(t, pr, GWEN_DUMMY_EMPTY_ARG) 366 #define GWEN_LIST_FUNCTIONS(t, pr) \ 368 int pr##_List_Add(t *element, t##_LIST *l) { \ 369 return GWEN_List1_Add(l, element->_list1_element); \ 372 int pr##_List_AddList(t##_LIST *dst, t##_LIST *l) { \ 373 return GWEN_List1_AddList(dst, l); \ 376 int pr##_List_Insert(t *element, t##_LIST *l) { \ 377 return GWEN_List1_Insert(l, element->_list1_element); \ 380 int pr##_List_Del(t *element){ \ 381 return GWEN_List1_Del(element->_list1_element); \ 384 t* pr##_List_First(const t##_LIST *l) { \ 385 if (l) return (t*)GWEN_List1_GetFirst(l);\ 389 t* pr##_List_Last(const t##_LIST *l) { \ 390 if (l) return (t*) GWEN_List1_GetLast(l);\ 394 void pr##_List_Clear(t##_LIST *l) { \ 396 while( (el=(t*) GWEN_List1_GetFirst(l)) ) {\ 402 int pr##_List_HasElement(const t##_LIST *l, const t *element) { \ 404 el=(t*)GWEN_List1_GetFirst(l); \ 408 el=(const t*)GWEN_List1Element_GetNext(el->_list1_element); \ 413 t##_LIST* pr##_List_new(){\ 414 return (t##_LIST*)GWEN_List1_new(); \ 417 void pr##_List_free(t##_LIST *l) {\ 420 GWEN_List1_free(l); \ 424 t* pr##_List_Next(const t *element) { \ 425 return (t*)GWEN_List1Element_GetNext(element->_list1_element);\ 428 t* pr##_List_Previous(const t *element) { \ 429 return (t*)GWEN_List1Element_GetPrevious(element->_list1_element);\ 432 uint32_t pr##_List_GetCount(const t##_LIST *l){\ 433 return GWEN_List1_GetCount(l);\ 436 t##_LIST_SORT_FN pr##_List_SetSortFn(t##_LIST *l, t##_LIST_SORT_FN fn) { \ 437 return (t##_LIST_SORT_FN) GWEN_List1_SetSortFn(l, (GWEN_LIST1_SORT_FN) fn); \ 440 void pr##_List_Sort(t##_LIST *l, int ascending){\ 441 GWEN_List1_Sort(l, ascending);\ 444 t* pr##_List_ForEach(t##_LIST *l, t##_LIST_FOREACH fn, void *user_data){ \ 448 el=pr##_List_First(l); \ 451 elReturned=fn(el, user_data); \ 455 el=pr##_List_Next(el); \ 465 #define GWEN_LIST_INIT(t, element) \ 466 element->_list1_element=GWEN_List1Element_new(element); 474 #define GWEN_LIST_FINI(t, element) \ 475 if (element && element->_list1_element) { \ 476 GWEN_List1Element_free(element->_list1_element); \ 477 element->_list1_element=0; \ GWENHYWFAR_API int GWEN_List1_Add(GWEN_LIST1 *l, GWEN_LIST1_ELEMENT *el)
int GWENHYWFAR_CB(* GWEN_LIST1_SORT_FN)(const void *a, const void *b, int ascending)
GWENHYWFAR_API void * GWEN_List1_GetLast(const GWEN_LIST1 *l)
GWENHYWFAR_API void * GWEN_List1_GetFirst(const GWEN_LIST1 *l)
GWENHYWFAR_API int GWEN_List1_Del(GWEN_LIST1_ELEMENT *el)
struct GWEN_LIST1 GWEN_LIST1
GWENHYWFAR_API GWEN_LIST1 * GWEN_List1_new(void)
GWENHYWFAR_API void GWEN_List1Element_free(GWEN_LIST1_ELEMENT *el)
GWENHYWFAR_API GWEN_LIST1_ELEMENT * GWEN_List1Element_new(void *d)
GWENHYWFAR_API GWEN_LIST1_SORT_FN GWEN_List1_SetSortFn(GWEN_LIST1 *l, GWEN_LIST1_SORT_FN fn)
GWENHYWFAR_API int GWEN_List1_AddList(GWEN_LIST1 *dest, GWEN_LIST1 *l)
GWENHYWFAR_API void GWEN_List1_free(GWEN_LIST1 *l)
GWENHYWFAR_API void * GWEN_List1Element_GetPrevious(const GWEN_LIST1_ELEMENT *el)
struct GWEN_LIST1_ELEMENT GWEN_LIST1_ELEMENT
GWENHYWFAR_API void GWEN_List1_Sort(GWEN_LIST1 *l, int ascending)
GWENHYWFAR_API int GWEN_List1_Insert(GWEN_LIST1 *l, GWEN_LIST1_ELEMENT *el)
GWENHYWFAR_API void * GWEN_List1Element_GetNext(const GWEN_LIST1_ELEMENT *el)
GWENHYWFAR_API void * GWEN_List1Element_GetData(const GWEN_LIST1_ELEMENT *el)
GWENHYWFAR_API int GWEN_List1_GetCount(const GWEN_LIST1 *l)