diff -r d4baf4dd55c3 -r fe0d69d72bcd src/array_list.c --- a/src/array_list.c Thu May 23 19:29:14 2024 +0200 +++ b/src/array_list.c Thu May 23 20:29:28 2024 +0200 @@ -191,21 +191,21 @@ char *ptr = arl->data; - if (list->simple_destructor) { - for (size_t i = 0; i < list->size; i++) { + if (list->base.simple_destructor) { + for (size_t i = 0; i < list->base.size; i++) { cx_invoke_simple_destructor(list, ptr); - ptr += list->item_size; + ptr += list->base.item_size; } } - if (list->advanced_destructor) { - for (size_t i = 0; i < list->size; i++) { + if (list->base.advanced_destructor) { + for (size_t i = 0; i < list->base.size; i++) { cx_invoke_advanced_destructor(list, ptr); - ptr += list->item_size; + ptr += list->base.item_size; } } - cxFree(list->allocator, arl->data); - cxFree(list->allocator, list); + cxFree(list->base.allocator, arl->data); + cxFree(list->base.allocator, list); } static size_t cx_arl_insert_array( @@ -215,25 +215,25 @@ size_t n ) { // out of bounds and special case check - if (index > list->size || n == 0) return 0; + if (index > list->base.size || n == 0) return 0; // get a correctly typed pointer to the list cx_array_list *arl = (cx_array_list *) list; // do we need to move some elements? - if (index < list->size) { + if (index < list->base.size) { char const *first_to_move = (char const *) arl->data; - first_to_move += index * list->item_size; - size_t elems_to_move = list->size - index; + first_to_move += index * list->base.item_size; + size_t elems_to_move = list->base.size - index; size_t start_of_moved = index + n; if (CX_ARRAY_SUCCESS != cx_array_copy( &arl->data, - &list->size, + &list->base.size, &arl->capacity, start_of_moved, first_to_move, - list->item_size, + list->base.item_size, elems_to_move, &arl->reallocator )) { @@ -249,11 +249,11 @@ // place the new elements if (CX_ARRAY_SUCCESS == cx_array_copy( &arl->data, - &list->size, + &list->base.size, &arl->capacity, index, array, - list->item_size, + list->base.item_size, n, &arl->reallocator )) { @@ -278,7 +278,7 @@ int prepend ) { struct cx_list_s *list = iter->src_handle.m; - if (iter->index < list->size) { + if (iter->index < list->base.size) { int result = cx_arl_insert_element( list, iter->index + 1 - prepend, @@ -286,12 +286,12 @@ ); if (result == 0 && prepend != 0) { iter->index++; - iter->elem_handle = ((char *) iter->elem_handle) + list->item_size; + iter->elem_handle = ((char *) iter->elem_handle) + list->base.item_size; } return result; } else { - int result = cx_arl_insert_element(list, list->size, elem); - iter->index = list->size; + int result = cx_arl_insert_element(list, list->base.size, elem); + iter->index = list->base.size; return result; } } @@ -303,28 +303,28 @@ cx_array_list *arl = (cx_array_list *) list; // out-of-bounds check - if (index >= list->size) { + if (index >= list->base.size) { return 1; } // content destruction - cx_invoke_destructor(list, ((char *) arl->data) + index * list->item_size); + cx_invoke_destructor(list, ((char *) arl->data) + index * list->base.item_size); // short-circuit removal of last element - if (index == list->size - 1) { - list->size--; + if (index == list->base.size - 1) { + list->base.size--; return 0; } // just move the elements starting at index to the left int result = cx_array_copy( &arl->data, - &list->size, + &list->base.size, &arl->capacity, index, - ((char *) arl->data) + (index + 1) * list->item_size, - list->item_size, - list->size - index - 1, + ((char *) arl->data) + (index + 1) * list->base.item_size, + list->base.item_size, + list->base.size - index - 1, &arl->reallocator ); @@ -332,32 +332,32 @@ assert(result == 0); // decrease the size - list->size--; + list->base.size--; return 0; } static void cx_arl_clear(struct cx_list_s *list) { - if (list->size == 0) return; + if (list->base.size == 0) return; cx_array_list *arl = (cx_array_list *) list; char *ptr = arl->data; - if (list->simple_destructor) { - for (size_t i = 0; i < list->size; i++) { + if (list->base.simple_destructor) { + for (size_t i = 0; i < list->base.size; i++) { cx_invoke_simple_destructor(list, ptr); - ptr += list->item_size; + ptr += list->base.item_size; } } - if (list->advanced_destructor) { - for (size_t i = 0; i < list->size; i++) { + if (list->base.advanced_destructor) { + for (size_t i = 0; i < list->base.size; i++) { cx_invoke_advanced_destructor(list, ptr); - ptr += list->item_size; + ptr += list->base.item_size; } } - memset(arl->data, 0, list->size * list->item_size); - list->size = 0; + memset(arl->data, 0, list->base.size * list->base.item_size); + list->base.size = 0; } static int cx_arl_swap( @@ -365,9 +365,9 @@ size_t i, size_t j ) { - if (i >= list->size || j >= list->size) return 1; + if (i >= list->base.size || j >= list->base.size) return 1; cx_array_list *arl = (cx_array_list *) list; - cx_array_swap(arl->data, list->item_size, i, j); + cx_array_swap(arl->data, list->base.item_size, i, j); return 0; } @@ -375,10 +375,10 @@ struct cx_list_s const *list, size_t index ) { - if (index < list->size) { + if (index < list->base.size) { cx_array_list const *arl = (cx_array_list const *) list; char *space = arl->data; - return space + index * list->item_size; + return space + index * list->base.item_size; } else { return NULL; } @@ -389,12 +389,12 @@ void const *elem, bool remove ) { - assert(list->cmpfunc != NULL); - assert(list->size < SIZE_MAX / 2); + assert(list->base.cmpfunc != NULL); + assert(list->base.size < SIZE_MAX / 2); char *cur = ((cx_array_list const *) list)->data; - for (ssize_t i = 0; i < (ssize_t) list->size; i++) { - if (0 == list->cmpfunc(elem, cur)) { + for (ssize_t i = 0; i < (ssize_t) list->base.size; i++) { + if (0 == list->base.cmpfunc(elem, cur)) { if (remove) { if (0 == cx_arl_remove(list, i)) { return i; @@ -405,18 +405,18 @@ return i; } } - cur += list->item_size; + cur += list->base.item_size; } return -1; } static void cx_arl_sort(struct cx_list_s *list) { - assert(list->cmpfunc != NULL); + assert(list->base.cmpfunc != NULL); qsort(((cx_array_list *) list)->data, - list->size, - list->item_size, - list->cmpfunc + list->base.size, + list->base.item_size, + list->base.cmpfunc ); } @@ -424,37 +424,37 @@ struct cx_list_s const *list, struct cx_list_s const *other ) { - assert(list->cmpfunc != NULL); - if (list->size == other->size) { + assert(list->base.cmpfunc != NULL); + if (list->base.size == other->base.size) { char const *left = ((cx_array_list const *) list)->data; char const *right = ((cx_array_list const *) other)->data; - for (size_t i = 0; i < list->size; i++) { - int d = list->cmpfunc(left, right); + for (size_t i = 0; i < list->base.size; i++) { + int d = list->base.cmpfunc(left, right); if (d != 0) { return d; } - left += list->item_size; - right += other->item_size; + left += list->base.item_size; + right += other->base.item_size; } return 0; } else { - return list->size < other->size ? -1 : 1; + return list->base.size < other->base.size ? -1 : 1; } } static void cx_arl_reverse(struct cx_list_s *list) { - if (list->size < 2) return; + if (list->base.size < 2) return; void *data = ((cx_array_list const *) list)->data; - size_t half = list->size / 2; + size_t half = list->base.size / 2; for (size_t i = 0; i < half; i++) { - cx_array_swap(data, list->item_size, i, list->size - 1 - i); + cx_array_swap(data, list->base.item_size, i, list->base.size - 1 - i); } } static bool cx_arl_iter_valid(void const *it) { struct cx_iterator_s const *iter = it; struct cx_list_s const *list = iter->src_handle.c; - return iter->index < list->size; + return iter->index < list->base.size; } static void *cx_arl_iter_current(void const *it) { @@ -464,28 +464,28 @@ static void cx_arl_iter_next(void *it) { struct cx_iterator_s *iter = it; - if (iter->remove) { - iter->remove = false; + if (iter->base.remove) { + iter->base.remove = false; cx_arl_remove(iter->src_handle.m, iter->index); } else { iter->index++; iter->elem_handle = ((char *) iter->elem_handle) - + ((struct cx_list_s const *) iter->src_handle.c)->item_size; + + ((struct cx_list_s const *) iter->src_handle.c)->base.item_size; } } static void cx_arl_iter_prev(void *it) { struct cx_iterator_s *iter = it; cx_array_list const* list = iter->src_handle.c; - if (iter->remove) { - iter->remove = false; + if (iter->base.remove) { + iter->base.remove = false; cx_arl_remove(iter->src_handle.m, iter->index); } iter->index--; - if (iter->index < list->base.size) { + if (iter->index < list->base.base.size) { iter->elem_handle = ((char *) list->data) - + iter->index * list->base.item_size; + + iter->index * list->base.base.item_size; } } @@ -500,13 +500,13 @@ iter.index = index; iter.src_handle.c = list; iter.elem_handle = cx_arl_at(list, index); - iter.elem_size = list->item_size; - iter.elem_count = list->size; - iter.valid = cx_arl_iter_valid; - iter.current = cx_arl_iter_current; - iter.next = backwards ? cx_arl_iter_prev : cx_arl_iter_next; - iter.remove = false; - iter.mutating = false; + iter.elem_size = list->base.item_size; + iter.elem_count = list->base.size; + iter.base.valid = cx_arl_iter_valid; + iter.base.current = cx_arl_iter_current; + iter.base.next = backwards ? cx_arl_iter_prev : cx_arl_iter_next; + iter.base.remove = false; + iter.base.mutating = false; return iter; } @@ -541,15 +541,15 @@ if (list == NULL) return NULL; list->base.cl = &cx_array_list_class; - list->base.allocator = allocator; + list->base.base.allocator = allocator; list->capacity = initial_capacity; if (item_size > 0) { - list->base.item_size = item_size; - list->base.cmpfunc = comparator; + list->base.base.item_size = item_size; + list->base.base.cmpfunc = comparator; } else { item_size = sizeof(void *); - list->base.cmpfunc = comparator == NULL ? cx_cmp_ptr : comparator; + list->base.base.cmpfunc = comparator == NULL ? cx_cmp_ptr : comparator; cxListStorePointers((CxList *) list); }