src/linked_list.c

changeset 494
6ce8cfa10a96
parent 490
e66551b47466
child 495
2856c74e18ba
     1.1 --- a/src/linked_list.c	Sat Jan 22 10:29:48 2022 +0100
     1.2 +++ b/src/linked_list.c	Sat Jan 22 17:15:14 2022 +0100
     1.3 @@ -640,6 +640,48 @@
     1.4                                    true, list->cmpfunc);
     1.5  }
     1.6  
     1.7 +static bool cx_ll_iter_valid(CxIterator const *iter) {
     1.8 +    return iter->data != 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 +}
    1.16 +
    1.17 +static void *cx_ll_iter_current(CxIterator const *iter) {
    1.18 +    cx_linked_list_node *node = iter->data;
    1.19 +    return node->payload;
    1.20 +}
    1.21 +
    1.22 +static void *cx_pll_iter_current(CxIterator const *iter) {
    1.23 +    cx_linked_list_node *node = iter->data;
    1.24 +    return *(void **) node->payload;
    1.25 +}
    1.26 +
    1.27 +static CxIterator cx_ll_iterator(
    1.28 +        cx_list_s const *list,
    1.29 +        size_t index
    1.30 +) {
    1.31 +    CxIterator iter;
    1.32 +    iter.index = index;
    1.33 +    iter.data = cx_ll_node_at((cx_linked_list const *) list, index);
    1.34 +    iter.valid = cx_ll_iter_valid;
    1.35 +    iter.current = cx_ll_iter_current;
    1.36 +    iter.next = cx_ll_iter_next;
    1.37 +    return iter;
    1.38 +}
    1.39 +
    1.40 +static CxIterator cx_pll_iterator(
    1.41 +        cx_list_s const *list,
    1.42 +        size_t index
    1.43 +) {
    1.44 +    CxIterator iter = cx_ll_iterator(list, index);
    1.45 +    iter.current = cx_pll_iter_current;
    1.46 +    return iter;
    1.47 +}
    1.48 +
    1.49  static cx_list_class cx_linked_list_class = {
    1.50          cx_ll_add,
    1.51          cx_ll_insert,
    1.52 @@ -648,7 +690,8 @@
    1.53          cx_ll_find,
    1.54          cx_ll_sort,
    1.55          cx_ll_compare,
    1.56 -        cx_ll_reverse
    1.57 +        cx_ll_reverse,
    1.58 +        cx_ll_iterator,
    1.59  };
    1.60  
    1.61  static cx_list_class cx_pointer_linked_list_class = {
    1.62 @@ -659,7 +702,8 @@
    1.63          cx_pll_find,
    1.64          cx_pll_sort,
    1.65          cx_pll_compare,
    1.66 -        cx_ll_reverse
    1.67 +        cx_ll_reverse,
    1.68 +        cx_pll_iterator,
    1.69  };
    1.70  
    1.71  CxList cxLinkedListCreate(

mercurial