1.1 --- a/src/linked_list.c Sat Jan 22 17:15:14 2022 +0100 1.2 +++ b/src/linked_list.c Sat Jan 22 18:49:06 2022 +0100 1.3 @@ -641,40 +641,53 @@ 1.4 } 1.5 1.6 static bool cx_ll_iter_valid(CxIterator const *iter) { 1.7 - return iter->data != NULL; 1.8 + return iter->elem_handle != NULL; 1.9 } 1.10 1.11 static void cx_ll_iter_next(CxIterator *iter) { 1.12 - iter->index++; 1.13 - cx_linked_list_node *node = iter->data; 1.14 - iter->data = node->next; 1.15 + if (iter->remove) { 1.16 + iter->remove = false; 1.17 + cx_linked_list *ll = iter->src_handle; 1.18 + cx_linked_list_node *node = iter->elem_handle; 1.19 + iter->elem_handle = node->next; 1.20 + cx_linked_list_remove((void **) &ll->begin, (void **) &ll->end, 1.21 + CX_LL_LOC_PREV, CX_LL_LOC_NEXT, node); 1.22 + ll->base.size--; 1.23 + cxFree(ll->base.allocator, node); 1.24 + } else { 1.25 + iter->index++; 1.26 + cx_linked_list_node *node = iter->elem_handle; 1.27 + iter->elem_handle = node->next; 1.28 + } 1.29 } 1.30 1.31 static void *cx_ll_iter_current(CxIterator const *iter) { 1.32 - cx_linked_list_node *node = iter->data; 1.33 + cx_linked_list_node *node = iter->elem_handle; 1.34 return node->payload; 1.35 } 1.36 1.37 static void *cx_pll_iter_current(CxIterator const *iter) { 1.38 - cx_linked_list_node *node = iter->data; 1.39 + cx_linked_list_node *node = iter->elem_handle; 1.40 return *(void **) node->payload; 1.41 } 1.42 1.43 static CxIterator cx_ll_iterator( 1.44 - cx_list_s const *list, 1.45 + cx_list_s *list, 1.46 size_t index 1.47 ) { 1.48 CxIterator iter; 1.49 iter.index = index; 1.50 - iter.data = cx_ll_node_at((cx_linked_list const *) list, index); 1.51 + iter.src_handle = list; 1.52 + iter.elem_handle = cx_ll_node_at((cx_linked_list const *) list, index); 1.53 iter.valid = cx_ll_iter_valid; 1.54 iter.current = cx_ll_iter_current; 1.55 iter.next = cx_ll_iter_next; 1.56 + iter.remove = false; 1.57 return iter; 1.58 } 1.59 1.60 static CxIterator cx_pll_iterator( 1.61 - cx_list_s const *list, 1.62 + cx_list_s *list, 1.63 size_t index 1.64 ) { 1.65 CxIterator iter = cx_ll_iterator(list, index);