# HG changeset patch # User Mike Becker # Date 1668807137 -3600 # Node ID af7d8a29fbc597d34da7f0b6b7bc9ecd7ee898b6 # Parent b52b66dcd44b6d8ea52730318001816c06770966 #219 array list: add iterator diff -r b52b66dcd44b -r af7d8a29fbc5 src/array_list.c --- a/src/array_list.c Thu Nov 17 18:55:14 2022 +0100 +++ b/src/array_list.c Fri Nov 18 22:32:17 2022 +0100 @@ -263,12 +263,39 @@ } +static bool cx_arl_iter_valid(struct cx_iterator_s const *iter) { + struct cx_list_s const *list = iter->src_handle; + return iter->index < list->size; +} + +static void *cx_arl_iter_current(struct cx_iterator_s const *iter) { + return iter->elem_handle; +} + +static void cx_arl_iter_next(struct cx_iterator_s *iter) { + if (iter->remove) { + iter->remove = false; + cx_arl_remove(iter->src_handle, iter->index); + } else { + iter->index++; + iter->elem_handle = cx_arl_at(iter->src_handle, iter->index); + } +} + static struct cx_iterator_s cx_arl_iterator( struct cx_list_s *list, size_t index ) { struct cx_iterator_s iter; + iter.index = index; + iter.src_handle = list; + iter.elem_handle = cx_arl_at(list, index); + iter.valid = cx_arl_iter_valid; + iter.current = cx_arl_iter_current; + iter.next = cx_arl_iter_next; + iter.remove = false; + return iter; } diff -r b52b66dcd44b -r af7d8a29fbc5 test/test_list.cpp --- a/test/test_list.cpp Thu Nov 17 18:55:14 2022 +0100 +++ b/test/test_list.cpp Fri Nov 18 22:32:17 2022 +0100 @@ -900,7 +900,6 @@ } TEST_F(ArrayList, Iterator) { - ASSERT_EQ(1,0); // TODO: remove when implemented verifyIterator(arrayListFromTestData()); }