src/list.c

changeset 666
b5dd654deb3b
parent 664
af5bf4603a5d
child 677
b09aae58bba4
     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;

mercurial