diff -r 16e2a3391e88 -r d4baf4dd55c3 src/iterator.c --- a/src/iterator.c Thu May 23 18:21:36 2024 +0200 +++ b/src/iterator.c Thu May 23 19:29:14 2024 +0200 @@ -41,30 +41,27 @@ } static void cx_iter_next_fast(void *it) { - struct cx_iterator_base_s *itbase = it; - if (itbase->remove) { - struct cx_mut_iterator_s *iter = it; - itbase->remove = false; + struct cx_iterator_s *iter = it; + if (iter->remove) { + iter->remove = false; iter->elem_count--; // only move the last element when we are not currently aiming // at the last element already if (iter->index < iter->elem_count) { - void *last = ((char *) iter->src_handle) + void *last = ((char *) iter->src_handle.m) + iter->elem_count * iter->elem_size; memcpy(iter->elem_handle, last, iter->elem_size); } } else { - struct cx_iterator_s *iter = it; iter->index++; iter->elem_handle = ((char *) iter->elem_handle) + iter->elem_size; } } static void cx_iter_next_slow(void *it) { - struct cx_iterator_base_s *itbase = it; - if (itbase->remove) { - struct cx_mut_iterator_s *iter = it; - itbase->remove = false; + struct cx_iterator_s *iter = it; + if (iter->remove) { + iter->remove = false; iter->elem_count--; // number of elements to move @@ -77,30 +74,29 @@ ); } } else { - struct cx_iterator_s *iter = it; iter->index++; iter->elem_handle = ((char *) iter->elem_handle) + iter->elem_size; } } -CxMutIterator cxMutIterator( +CxIterator cxMutIterator( void *array, size_t elem_size, size_t elem_count, bool remove_keeps_order ) { - CxMutIterator iter; + CxIterator iter; iter.index = 0; - iter.src_handle = array; + iter.src_handle.m = array; iter.elem_handle = array; iter.elem_size = elem_size; iter.elem_count = array == NULL ? 0 : elem_count; - iter.base.valid = cx_iter_valid; - iter.base.current = cx_iter_current; - iter.base.next = remove_keeps_order ? cx_iter_next_slow : cx_iter_next_fast; - iter.base.remove = false; - iter.base.mutating = true; + iter.valid = cx_iter_valid; + iter.current = cx_iter_current; + iter.next = remove_keeps_order ? cx_iter_next_slow : cx_iter_next_fast; + iter.remove = false; + iter.mutating = true; return iter; } @@ -110,11 +106,7 @@ size_t elem_size, size_t elem_count ) { - CxMutIterator iter = cxMutIterator((void*)array, elem_size, elem_count, false); - iter.base.mutating = false; - - // we know the iterators share the same memory layout - CxIterator ret; - memcpy(&ret, &iter, sizeof(CxIterator)); - return ret; + CxIterator iter = cxMutIterator((void*)array, elem_size, elem_count, false); + iter.mutating = false; + return iter; }