src/linked_list.c

changeset 655
7340c4255f1f
parent 654
c9d008861178
child 661
0a71ac9547fd
     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;

mercurial