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(