src/map.c

changeset 709
1e8ba59e7911
parent 706
8c6edaccaef1
child 853
d4baf4dd55c3
--- a/src/map.c	Sun May 21 14:56:10 2023 +0200
+++ b/src/map.c	Sun May 21 15:07:31 2023 +0200
@@ -27,6 +27,7 @@
  */
 
 #include "cx/map.h"
+#include <string.h>
 
 // <editor-fold desc="empty map implementation">
 
@@ -45,32 +46,23 @@
     return false;
 }
 
-static CxIterator cx_empty_map_iterator(struct cx_map_s const *map) {
+static CxIterator cx_empty_map_iterator(
+        struct cx_map_s const *map,
+        __attribute__((__unused__)) enum cx_map_iterator_type type
+) {
     CxIterator iter = {0};
     iter.src_handle = map;
     iter.base.valid = cx_empty_map_iter_valid;
     return iter;
 }
 
-static CxMutIterator cx_empty_map_miterator(struct cx_map_s *map) {
-    CxMutIterator iter = {0};
-    iter.src_handle = map;
-    iter.base.valid = cx_empty_map_iter_valid;
-    return iter;
-}
-
 static struct cx_map_class_s cx_empty_map_class = {
-    cx_empty_map_noop,
-    cx_empty_map_noop,
-    NULL,
-    cx_empty_map_get,
-    NULL,
-    cx_empty_map_iterator,
-    cx_empty_map_iterator,
-    cx_empty_map_iterator,
-    cx_empty_map_miterator,
-    cx_empty_map_miterator,
-    cx_empty_map_miterator,
+        cx_empty_map_noop,
+        cx_empty_map_noop,
+        NULL,
+        cx_empty_map_get,
+        NULL,
+        cx_empty_map_iterator
 };
 
 CxMap cx_empty_map = {
@@ -85,6 +77,36 @@
         &cx_empty_map_class
 };
 
-CxMap * const cxEmptyMap = &cx_empty_map;
+CxMap *const cxEmptyMap = &cx_empty_map;
 
 // </editor-fold>
+
+CxMutIterator cxMapMutIteratorValues(CxMap *map) {
+    CxIterator it = map->cl->iterator(map, CX_MAP_ITERATOR_VALUES);
+    it.base.mutating = true;
+
+    // we know the iterators share the same memory layout
+    CxMutIterator iter;
+    memcpy(&iter, &it, sizeof(CxMutIterator));
+    return iter;
+}
+
+CxMutIterator cxMapMutIteratorKeys(CxMap *map) {
+    CxIterator it = map->cl->iterator(map, CX_MAP_ITERATOR_KEYS);
+    it.base.mutating = true;
+
+    // we know the iterators share the same memory layout
+    CxMutIterator iter;
+    memcpy(&iter, &it, sizeof(CxMutIterator));
+    return iter;
+}
+
+CxMutIterator cxMapMutIterator(CxMap *map) {
+    CxIterator it = map->cl->iterator(map, CX_MAP_ITERATOR_PAIRS);
+    it.base.mutating = true;
+
+    // we know the iterators share the same memory layout
+    CxMutIterator iter;
+    memcpy(&iter, &it, sizeof(CxMutIterator));
+    return iter;
+}

mercurial