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__)) CxMap const *map, 40 __attribute__((__unused__)) CxHashKey key 41 ) { 42 return NULL; 43 } 44 45 static bool cx_empty_map_iter_valid(__attribute__((__unused__)) void const *iter) { 46 return false; 47 } 48 49 static CxIterator cx_empty_map_iterator( 50 struct cx_map_s const *map, 51 __attribute__((__unused__)) enum cx_map_iterator_type type 52 ) { 53 CxIterator iter = {0}; 54 iter.src_handle = 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 NULL, 70 NULL, 71 0, 72 0, 73 NULL, 74 NULL, 75 NULL, 76 false, 77 &cx_empty_map_class 78 }; 79 80 CxMap *const cxEmptyMap = &cx_empty_map; 81 82 // </editor-fold> 83 84 CxMutIterator cxMapMutIteratorValues(CxMap *map) { 85 CxIterator it = map->cl->iterator(map, CX_MAP_ITERATOR_VALUES); 86 it.base.mutating = true; 87 88 // we know the iterators share the same memory layout 89 CxMutIterator iter; 90 memcpy(&iter, &it, sizeof(CxMutIterator)); 91 return iter; 92 } 93 94 CxMutIterator cxMapMutIteratorKeys(CxMap *map) { 95 CxIterator it = map->cl->iterator(map, CX_MAP_ITERATOR_KEYS); 96 it.base.mutating = true; 97 98 // we know the iterators share the same memory layout 99 CxMutIterator iter; 100 memcpy(&iter, &it, sizeof(CxMutIterator)); 101 return iter; 102 } 103 104 CxMutIterator cxMapMutIterator(CxMap *map) { 105 CxIterator it = map->cl->iterator(map, CX_MAP_ITERATOR_PAIRS); 106 it.base.mutating = true; 107 108 // we know the iterators share the same memory layout 109 CxMutIterator iter; 110 memcpy(&iter, &it, sizeof(CxMutIterator)); 111 return iter; 112 } 113