UNIXworkcode

1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2023 Mike Becker, Olaf Wintermann All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #include "cx/map.h" 30 #include <string.h> 31 32 // <editor-fold desc="empty map implementation"> 33 34 static void cx_empty_map_noop(__attribute__((__unused__)) CxMap *map) { 35 // this is a noop, but MUST be implemented 36 } 37 38 static void *cx_empty_map_get( 39 __attribute__((__unused__)) const CxMap *map, 40 __attribute__((__unused__)) CxHashKey key 41 ) { 42 return NULL; 43 } 44 45 static bool cx_empty_map_iter_valid(__attribute__((__unused__)) const void *iter) { 46 return false; 47 } 48 49 static CxIterator cx_empty_map_iterator( 50 const struct cx_map_s *map, 51 __attribute__((__unused__)) enum cx_map_iterator_type type 52 ) { 53 CxIterator iter = {0}; 54 iter.src_handle.c = map; 55 iter.base.valid = cx_empty_map_iter_valid; 56 return iter; 57 } 58 59 static struct cx_map_class_s cx_empty_map_class = { 60 cx_empty_map_noop, 61 cx_empty_map_noop, 62 NULL, 63 cx_empty_map_get, 64 NULL, 65 cx_empty_map_iterator 66 }; 67 68 CxMap cx_empty_map = { 69 { 70 NULL, 71 NULL, 72 0, 73 0, 74 NULL, 75 NULL, 76 NULL, 77 false 78 }, 79 &cx_empty_map_class 80 }; 81 82 CxMap *const cxEmptyMap = &cx_empty_map; 83 84 // </editor-fold> 85 86 CxIterator cxMapMutIteratorValues(CxMap *map) { 87 CxIterator it = map->cl->iterator(map, CX_MAP_ITERATOR_VALUES); 88 it.base.mutating = true; 89 return it; 90 } 91 92 CxIterator cxMapMutIteratorKeys(CxMap *map) { 93 CxIterator it = map->cl->iterator(map, CX_MAP_ITERATOR_KEYS); 94 it.base.mutating = true; 95 return it; 96 } 97 98 CxIterator cxMapMutIterator(CxMap *map) { 99 CxIterator it = map->cl->iterator(map, CX_MAP_ITERATOR_PAIRS); 100 it.base.mutating = true; 101 return it; 102 } 103