src/iterator.c

changeset 853
d4baf4dd55c3
parent 851
adb4e0737c33
child 854
fe0d69d72bcd
--- 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;
 }

mercurial