1.1 --- a/src/linked_list.c Wed Feb 08 20:26:26 2023 +0100 1.2 +++ b/src/linked_list.c Wed Feb 15 16:48:11 2023 +0100 1.3 @@ -764,6 +764,27 @@ 1.4 } 1.5 } 1.6 1.7 +static void cx_ll_iter_prev(void *it) { 1.8 + struct cx_iterator_base_s *itbase = it; 1.9 + if (itbase->remove) { 1.10 + itbase->remove = false; 1.11 + struct cx_mut_iterator_s *iter = it; 1.12 + cx_linked_list *ll = iter->src_handle; 1.13 + cx_linked_list_node *node = iter->elem_handle; 1.14 + iter->elem_handle = node->prev; 1.15 + iter->index--; 1.16 + cx_linked_list_remove((void **) &ll->begin, (void **) &ll->end, 1.17 + CX_LL_LOC_PREV, CX_LL_LOC_NEXT, node); 1.18 + ll->base.size--; 1.19 + cxFree(ll->base.allocator, node); 1.20 + } else { 1.21 + struct cx_iterator_s *iter = it; 1.22 + iter->index--; 1.23 + cx_linked_list_node *node = iter->elem_handle; 1.24 + iter->elem_handle = node->prev; 1.25 + } 1.26 +} 1.27 + 1.28 static void *cx_ll_iter_current(void const *it) { 1.29 struct cx_iterator_s const *iter = it; 1.30 cx_linked_list_node *node = iter->elem_handle; 1.31 @@ -782,7 +803,8 @@ 1.32 1.33 static CxIterator cx_ll_iterator( 1.34 struct cx_list_s const *list, 1.35 - size_t index 1.36 + size_t index, 1.37 + bool backwards 1.38 ) { 1.39 CxIterator iter; 1.40 iter.index = index; 1.41 @@ -790,7 +812,7 @@ 1.42 iter.elem_handle = cx_ll_node_at((cx_linked_list const *) list, index); 1.43 iter.base.valid = cx_ll_iter_valid; 1.44 iter.base.current = cx_ll_iter_current; 1.45 - iter.base.next = cx_ll_iter_next; 1.46 + iter.base.next = backwards ? cx_ll_iter_prev : cx_ll_iter_next; 1.47 iter.base.flag_removal = cx_ll_iter_flag_rm; 1.48 iter.base.mutating = false; 1.49 iter.base.remove = false;