src/linked_list.c

changeset 495
2856c74e18ba
parent 494
6ce8cfa10a96
child 499
3dc9075df822
     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);

mercurial