diff -r 6ce8cfa10a96 -r 2856c74e18ba src/linked_list.c --- a/src/linked_list.c Sat Jan 22 17:15:14 2022 +0100 +++ b/src/linked_list.c Sat Jan 22 18:49:06 2022 +0100 @@ -641,40 +641,53 @@ } static bool cx_ll_iter_valid(CxIterator const *iter) { - return iter->data != NULL; + return iter->elem_handle != NULL; } static void cx_ll_iter_next(CxIterator *iter) { - iter->index++; - cx_linked_list_node *node = iter->data; - iter->data = node->next; + if (iter->remove) { + iter->remove = false; + cx_linked_list *ll = iter->src_handle; + cx_linked_list_node *node = iter->elem_handle; + iter->elem_handle = node->next; + cx_linked_list_remove((void **) &ll->begin, (void **) &ll->end, + CX_LL_LOC_PREV, CX_LL_LOC_NEXT, node); + ll->base.size--; + cxFree(ll->base.allocator, node); + } else { + iter->index++; + cx_linked_list_node *node = iter->elem_handle; + iter->elem_handle = node->next; + } } static void *cx_ll_iter_current(CxIterator const *iter) { - cx_linked_list_node *node = iter->data; + cx_linked_list_node *node = iter->elem_handle; return node->payload; } static void *cx_pll_iter_current(CxIterator const *iter) { - cx_linked_list_node *node = iter->data; + cx_linked_list_node *node = iter->elem_handle; return *(void **) node->payload; } static CxIterator cx_ll_iterator( - cx_list_s const *list, + cx_list_s *list, size_t index ) { CxIterator iter; iter.index = index; - iter.data = cx_ll_node_at((cx_linked_list const *) list, index); + iter.src_handle = list; + iter.elem_handle = cx_ll_node_at((cx_linked_list const *) list, index); iter.valid = cx_ll_iter_valid; iter.current = cx_ll_iter_current; iter.next = cx_ll_iter_next; + iter.remove = false; return iter; } static CxIterator cx_pll_iterator( - cx_list_s const *list, + cx_list_s *list, size_t index ) { CxIterator iter = cx_ll_iterator(list, index);