1.1 --- a/src/map.c Sun May 21 14:56:10 2023 +0200 1.2 +++ b/src/map.c Sun May 21 15:07:31 2023 +0200 1.3 @@ -27,6 +27,7 @@ 1.4 */ 1.5 1.6 #include "cx/map.h" 1.7 +#include <string.h> 1.8 1.9 // <editor-fold desc="empty map implementation"> 1.10 1.11 @@ -45,32 +46,23 @@ 1.12 return false; 1.13 } 1.14 1.15 -static CxIterator cx_empty_map_iterator(struct cx_map_s const *map) { 1.16 +static CxIterator cx_empty_map_iterator( 1.17 + struct cx_map_s const *map, 1.18 + __attribute__((__unused__)) enum cx_map_iterator_type type 1.19 +) { 1.20 CxIterator iter = {0}; 1.21 iter.src_handle = map; 1.22 iter.base.valid = cx_empty_map_iter_valid; 1.23 return iter; 1.24 } 1.25 1.26 -static CxMutIterator cx_empty_map_miterator(struct cx_map_s *map) { 1.27 - CxMutIterator iter = {0}; 1.28 - iter.src_handle = map; 1.29 - iter.base.valid = cx_empty_map_iter_valid; 1.30 - return iter; 1.31 -} 1.32 - 1.33 static struct cx_map_class_s cx_empty_map_class = { 1.34 - cx_empty_map_noop, 1.35 - cx_empty_map_noop, 1.36 - NULL, 1.37 - cx_empty_map_get, 1.38 - NULL, 1.39 - cx_empty_map_iterator, 1.40 - cx_empty_map_iterator, 1.41 - cx_empty_map_iterator, 1.42 - cx_empty_map_miterator, 1.43 - cx_empty_map_miterator, 1.44 - cx_empty_map_miterator, 1.45 + cx_empty_map_noop, 1.46 + cx_empty_map_noop, 1.47 + NULL, 1.48 + cx_empty_map_get, 1.49 + NULL, 1.50 + cx_empty_map_iterator 1.51 }; 1.52 1.53 CxMap cx_empty_map = { 1.54 @@ -85,6 +77,36 @@ 1.55 &cx_empty_map_class 1.56 }; 1.57 1.58 -CxMap * const cxEmptyMap = &cx_empty_map; 1.59 +CxMap *const cxEmptyMap = &cx_empty_map; 1.60 1.61 // </editor-fold> 1.62 + 1.63 +CxMutIterator cxMapMutIteratorValues(CxMap *map) { 1.64 + CxIterator it = map->cl->iterator(map, CX_MAP_ITERATOR_VALUES); 1.65 + it.base.mutating = true; 1.66 + 1.67 + // we know the iterators share the same memory layout 1.68 + CxMutIterator iter; 1.69 + memcpy(&iter, &it, sizeof(CxMutIterator)); 1.70 + return iter; 1.71 +} 1.72 + 1.73 +CxMutIterator cxMapMutIteratorKeys(CxMap *map) { 1.74 + CxIterator it = map->cl->iterator(map, CX_MAP_ITERATOR_KEYS); 1.75 + it.base.mutating = true; 1.76 + 1.77 + // we know the iterators share the same memory layout 1.78 + CxMutIterator iter; 1.79 + memcpy(&iter, &it, sizeof(CxMutIterator)); 1.80 + return iter; 1.81 +} 1.82 + 1.83 +CxMutIterator cxMapMutIterator(CxMap *map) { 1.84 + CxIterator it = map->cl->iterator(map, CX_MAP_ITERATOR_PAIRS); 1.85 + it.base.mutating = true; 1.86 + 1.87 + // we know the iterators share the same memory layout 1.88 + CxMutIterator iter; 1.89 + memcpy(&iter, &it, sizeof(CxMutIterator)); 1.90 + return iter; 1.91 +}