src/map.c

changeset 709
1e8ba59e7911
parent 706
8c6edaccaef1
     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 +}

mercurial