diff -r 1caed6c9ba68 -r 1e8ba59e7911 src/map.c --- 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 // @@ -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; // + +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; +}