864 struct cx_iterator_s const *iter = it; |
864 struct cx_iterator_s const *iter = it; |
865 cx_linked_list_node *node = iter->elem_handle; |
865 cx_linked_list_node *node = iter->elem_handle; |
866 return node->payload; |
866 return node->payload; |
867 } |
867 } |
868 |
868 |
869 static bool cx_ll_iter_flag_rm(void *it) { |
|
870 struct cx_iterator_base_s *iter = it; |
|
871 if (iter->mutating) { |
|
872 iter->remove = true; |
|
873 return true; |
|
874 } else { |
|
875 return false; |
|
876 } |
|
877 } |
|
878 |
|
879 static CxIterator cx_ll_iterator( |
869 static CxIterator cx_ll_iterator( |
880 struct cx_list_s const *list, |
870 struct cx_list_s const *list, |
881 size_t index, |
871 size_t index, |
882 bool backwards |
872 bool backwards |
883 ) { |
873 ) { |
886 iter.src_handle = list; |
876 iter.src_handle = list; |
887 iter.elem_handle = cx_ll_node_at((cx_linked_list const *) list, index); |
877 iter.elem_handle = cx_ll_node_at((cx_linked_list const *) list, index); |
888 iter.base.valid = cx_ll_iter_valid; |
878 iter.base.valid = cx_ll_iter_valid; |
889 iter.base.current = cx_ll_iter_current; |
879 iter.base.current = cx_ll_iter_current; |
890 iter.base.next = backwards ? cx_ll_iter_prev : cx_ll_iter_next; |
880 iter.base.next = backwards ? cx_ll_iter_prev : cx_ll_iter_next; |
891 iter.base.flag_removal = cx_ll_iter_flag_rm; |
|
892 iter.base.mutating = false; |
881 iter.base.mutating = false; |
893 iter.base.remove = false; |
882 iter.base.remove = false; |
894 return iter; |
883 return iter; |
895 } |
884 } |
896 |
885 |