1.1 --- a/src/list.c Mon Mar 20 18:05:12 2023 +0100 1.2 +++ b/src/list.c Mon Mar 20 19:09:08 2023 +0100 1.3 @@ -191,7 +191,7 @@ 1.4 list->cl = &cx_pointer_list_class; 1.5 } 1.6 1.7 -bool cxListIsStoringPointers(CxList *list) { 1.8 +bool cxListIsStoringPointers(CxList const *list) { 1.9 return list->climpl != NULL; 1.10 } 1.11 1.12 @@ -203,11 +203,11 @@ 1.13 ) { 1.14 switch (list->content_destructor_type) { 1.15 case CX_DESTRUCTOR_SIMPLE: { 1.16 - list->simple_destructor(elem); 1.17 + cx_list_invoke_simple_destructor(list, elem); 1.18 break; 1.19 } 1.20 case CX_DESTRUCTOR_ADVANCED: { 1.21 - list->advanced_destructor.func(list->advanced_destructor.data, elem); 1.22 + cx_list_invoke_advanced_destructor(list, elem); 1.23 break; 1.24 } 1.25 case CX_DESTRUCTOR_NONE: 1.26 @@ -215,11 +215,32 @@ 1.27 } 1.28 } 1.29 1.30 +void cx_list_invoke_simple_destructor( 1.31 + CxList const *list, 1.32 + void *elem 1.33 +) { 1.34 + if (cxListIsStoringPointers(list)) { 1.35 + elem = *((void **) elem); 1.36 + } 1.37 + list->simple_destructor(elem); 1.38 +} 1.39 + 1.40 +void cx_list_invoke_advanced_destructor( 1.41 + CxList const *list, 1.42 + void *elem 1.43 +) { 1.44 + if (cxListIsStoringPointers(list)) { 1.45 + elem = *((void **) elem); 1.46 + } 1.47 + list->advanced_destructor.func(list->advanced_destructor.data, elem); 1.48 +} 1.49 + 1.50 void cxListDestroy(CxList *list) { 1.51 switch (list->content_destructor_type) { 1.52 case CX_DESTRUCTOR_SIMPLE: { 1.53 CxIterator iter = cxListIterator(list); 1.54 cx_foreach(void*, elem, iter) { 1.55 + // already correctly resolved pointer - immediately invoke dtor 1.56 list->simple_destructor(elem); 1.57 } 1.58 break; 1.59 @@ -227,6 +248,7 @@ 1.60 case CX_DESTRUCTOR_ADVANCED: { 1.61 CxIterator iter = cxListIterator(list); 1.62 cx_foreach(void*, elem, iter) { 1.63 + // already correctly resolved pointer - immediately invoke dtor 1.64 list->advanced_destructor.func(list->advanced_destructor.data, elem); 1.65 } 1.66 break;