ucx/iterator.c

changeset 31
287484519844
parent 22
112b85020dc9
--- a/ucx/iterator.c	Fri Dec 12 10:42:53 2025 +0100
+++ b/ucx/iterator.c	Fri Dec 19 17:22:03 2025 +0100
@@ -29,6 +29,7 @@
 #include "cx/iterator.h"
 
 #include <string.h>
+#include <assert.h>
 
 static bool cx_iter_valid(const void *it) {
     const struct cx_iterator_s *iter = it;
@@ -45,51 +46,14 @@
     return *(void**)iter->elem_handle;
 }
 
-static void cx_iter_next_fast(void *it) {
+static void cx_iter_next(void *it) {
     struct cx_iterator_s *iter = it;
-    if (iter->base.remove) {
-        iter->base.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)
-                         + iter->elem_count * iter->elem_size;
-            memcpy(iter->elem_handle, last, iter->elem_size);
-        }
-    } else {
-        iter->index++;
-        iter->elem_handle = ((char *) iter->elem_handle) + iter->elem_size;
-    }
+    assert(!iter->base.remove);
+    iter->index++;
+    iter->elem_handle = ((char *) iter->elem_handle) + iter->elem_size;
 }
 
-static void cx_iter_next_slow(void *it) {
-    struct cx_iterator_s *iter = it;
-    if (iter->base.remove) {
-        iter->base.remove = false;
-        iter->elem_count--;
-
-        // number of elements to move
-        size_t remaining = iter->elem_count - iter->index;
-        if (remaining > 0) {
-            memmove(
-                    iter->elem_handle,
-                    ((char *) iter->elem_handle) + iter->elem_size,
-                    remaining * iter->elem_size
-            );
-        }
-    } else {
-        iter->index++;
-        iter->elem_handle = ((char *) iter->elem_handle) + iter->elem_size;
-    }
-}
-
-CxIterator cxIterator(
-        const void *array,
-        size_t elem_size,
-        size_t elem_count,
-        bool remove_keeps_order
-) {
+CxIterator cxIterator(const void *array, size_t elem_size, size_t elem_count) {
     CxIterator iter;
 
     iter.index = 0;
@@ -99,19 +63,18 @@
     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.next = cx_iter_next;
+    iter.base.valid_impl = NULL;
+    iter.base.current_impl = NULL;
+    iter.base.next_impl = NULL;
     iter.base.remove = false;
     iter.base.allow_remove = true;
 
     return iter;
 }
 
-CxIterator cxIteratorPtr(
-        const void *array,
-        size_t elem_count,
-        bool remove_keeps_order
-) {
-    CxIterator iter = cxIterator(array, sizeof(void*), elem_count, remove_keeps_order);
+CxIterator cxIteratorPtr(const void *array, size_t elem_count) {
+    CxIterator iter = cxIterator(array, sizeof(void*), elem_count);
     iter.base.current = cx_iter_current_ptr;
     return iter;
 }

mercurial