diff -r d0680a23d850 -r b09aae58bba4 src/list.c --- a/src/list.c Fri Apr 07 11:30:28 2023 +0200 +++ b/src/list.c Sun Apr 09 19:03:58 2023 +0200 @@ -32,7 +32,7 @@ // -static _Thread_local CxListComparator cx_pl_cmpfunc_impl; +static _Thread_local cx_compare_func cx_pl_cmpfunc_impl; static int cx_pl_cmpfunc( void const *l, @@ -179,6 +179,7 @@ }; void cxListStoreObjects(CxList *list) { + list->store_pointer = false; if (list->climpl != NULL) { list->cl = list->climpl; list->climpl = NULL; @@ -186,75 +187,28 @@ } void cxListStorePointers(CxList *list) { - list->itemsize = sizeof(void *); + list->item_size = sizeof(void *); + list->store_pointer = true; list->climpl = list->cl; list->cl = &cx_pointer_list_class; } -bool cxListIsStoringPointers(CxList const *list) { - return list->climpl != NULL; -} - // -void cx_list_invoke_destructor( - CxList const *list, - void *elem -) { - switch (list->content_destructor_type) { - case CX_DESTRUCTOR_SIMPLE: { - cx_list_invoke_simple_destructor(list, elem); - break; +void cxListDestroy(CxList *list) { + if (list->simple_destructor) { + CxIterator iter = cxListIterator(list); + cx_foreach(void*, elem, iter) { + // already correctly resolved pointer - immediately invoke dtor + list->simple_destructor(elem); } - case CX_DESTRUCTOR_ADVANCED: { - cx_list_invoke_advanced_destructor(list, elem); - break; - } - case CX_DESTRUCTOR_NONE: - break; // nothing - } -} - -void cx_list_invoke_simple_destructor( - CxList const *list, - void *elem -) { - if (cxListIsStoringPointers(list)) { - elem = *((void **) elem); } - list->simple_destructor(elem); -} - -void cx_list_invoke_advanced_destructor( - CxList const *list, - void *elem -) { - if (cxListIsStoringPointers(list)) { - elem = *((void **) elem); - } - list->advanced_destructor.func(list->advanced_destructor.data, elem); -} - -void cxListDestroy(CxList *list) { - switch (list->content_destructor_type) { - case CX_DESTRUCTOR_SIMPLE: { - CxIterator iter = cxListIterator(list); - cx_foreach(void*, elem, iter) { - // already correctly resolved pointer - immediately invoke dtor - list->simple_destructor(elem); - } - break; + if (list->advanced_destructor) { + CxIterator iter = cxListIterator(list); + cx_foreach(void*, elem, iter) { + // already correctly resolved pointer - immediately invoke dtor + list->advanced_destructor(list->destructor_data, elem); } - case CX_DESTRUCTOR_ADVANCED: { - CxIterator iter = cxListIterator(list); - cx_foreach(void*, elem, iter) { - // already correctly resolved pointer - immediately invoke dtor - list->advanced_destructor.func(list->advanced_destructor.data, elem); - } - break; - } - case CX_DESTRUCTOR_NONE: - break; // nothing } list->cl->destructor(list);