diff -r e3469b497eff -r 6ce8cfa10a96 src/linked_list.c --- a/src/linked_list.c Sat Jan 22 10:29:48 2022 +0100 +++ b/src/linked_list.c Sat Jan 22 17:15:14 2022 +0100 @@ -640,6 +640,48 @@ true, list->cmpfunc); } +static bool cx_ll_iter_valid(CxIterator const *iter) { + return iter->data != NULL; +} + +static void cx_ll_iter_next(CxIterator *iter) { + iter->index++; + cx_linked_list_node *node = iter->data; + iter->data = node->next; +} + +static void *cx_ll_iter_current(CxIterator const *iter) { + cx_linked_list_node *node = iter->data; + return node->payload; +} + +static void *cx_pll_iter_current(CxIterator const *iter) { + cx_linked_list_node *node = iter->data; + return *(void **) node->payload; +} + +static CxIterator cx_ll_iterator( + cx_list_s const *list, + size_t index +) { + CxIterator iter; + iter.index = index; + iter.data = cx_ll_node_at((cx_linked_list const *) list, index); + iter.valid = cx_ll_iter_valid; + iter.current = cx_ll_iter_current; + iter.next = cx_ll_iter_next; + return iter; +} + +static CxIterator cx_pll_iterator( + cx_list_s const *list, + size_t index +) { + CxIterator iter = cx_ll_iterator(list, index); + iter.current = cx_pll_iter_current; + return iter; +} + static cx_list_class cx_linked_list_class = { cx_ll_add, cx_ll_insert, @@ -648,7 +690,8 @@ cx_ll_find, cx_ll_sort, cx_ll_compare, - cx_ll_reverse + cx_ll_reverse, + cx_ll_iterator, }; static cx_list_class cx_pointer_linked_list_class = { @@ -659,7 +702,8 @@ cx_pll_find, cx_pll_sort, cx_pll_compare, - cx_ll_reverse + cx_ll_reverse, + cx_pll_iterator, }; CxList cxLinkedListCreate(