src/cx/map.h

Sun, 23 Nov 2025 13:15:19 +0100

author
Mike Becker <universe@uap-core.de>
date
Sun, 23 Nov 2025 13:15:19 +0100
changeset 1508
dfc0ddd9571e
parent 1479
ac1baaed2fd7
permissions
-rw-r--r--

optimize sorted insertion by using the infimum instead of the supremum

The reason is that the supremum returns the equal element with the smallest index, and we want the largest.
Therefore, we use the infimum, which already gives us the largest index when there are equal elements, and increase the index by one. The infimum is also guaranteed to exist in that case.

549
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1 /*
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
3 *
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
4 * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
5 *
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
8 *
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
11 *
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
15 *
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
27 */
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
28 /**
1102
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
29 * @file map.h
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
30 * @brief Interface for map implementations.
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
31 * @author Mike Becker
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
32 * @author Olaf Wintermann
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
33 * @copyright 2-Clause BSD License
549
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
34 */
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
35
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
36 #ifndef UCX_MAP_H
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
37 #define UCX_MAP_H
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
38
681
502105523db7 fix common.h include problems - fixes #255
Mike Becker <universe@uap-core.de>
parents: 677
diff changeset
39 #include "common.h"
677
b09aae58bba4 refactoring of collections to make use of destructors in map implementations
Mike Becker <universe@uap-core.de>
parents: 669
diff changeset
40 #include "collection.h"
691
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
41 #include "string.h"
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents: 558
diff changeset
42 #include "hash_key.h"
549
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
43
1445
e8089a590b71 add implementations for map difference
Mike Becker <universe@uap-core.de>
parents: 1444
diff changeset
44 #ifndef UCX_LIST_H
e8089a590b71 add implementations for map difference
Mike Becker <universe@uap-core.de>
parents: 1444
diff changeset
45 // forward-declare CxList
e8089a590b71 add implementations for map difference
Mike Becker <universe@uap-core.de>
parents: 1444
diff changeset
46 typedef struct cx_list_s CxList;
e8089a590b71 add implementations for map difference
Mike Becker <universe@uap-core.de>
parents: 1444
diff changeset
47 #endif
e8089a590b71 add implementations for map difference
Mike Becker <universe@uap-core.de>
parents: 1444
diff changeset
48
549
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
49 #ifdef __cplusplus
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
50 extern "C" {
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
51 #endif
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
52
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
53 /** Type for the UCX map. */
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
54 typedef struct cx_map_s CxMap;
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
55
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
56 /** Type for a map entry. */
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
57 typedef struct cx_map_entry_s CxMapEntry;
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
58
1115
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
59 /** Type for a map iterator. */
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
60 typedef struct cx_map_iterator_s CxMapIterator;
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
61
549
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
62 /** Type for map class definitions. */
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
63 typedef struct cx_map_class_s cx_map_class;
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
64
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
65 /** Structure for the UCX map. */
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
66 struct cx_map_s {
854
fe0d69d72bcd fix members inherited by macro or include are not documented
Mike Becker <universe@uap-core.de>
parents: 853
diff changeset
67 /**
fe0d69d72bcd fix members inherited by macro or include are not documented
Mike Becker <universe@uap-core.de>
parents: 853
diff changeset
68 * Base attributes.
fe0d69d72bcd fix members inherited by macro or include are not documented
Mike Becker <universe@uap-core.de>
parents: 853
diff changeset
69 */
fe0d69d72bcd fix members inherited by macro or include are not documented
Mike Becker <universe@uap-core.de>
parents: 853
diff changeset
70 CX_COLLECTION_BASE;
549
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
71 /** The map class definition. */
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
72 cx_map_class *cl;
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
73 };
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
74
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
75 /**
1115
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
76 * A map entry.
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
77 */
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
78 struct cx_map_entry_s {
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
79 /**
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
80 * A pointer to the key.
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
81 */
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
82 const CxHashKey *key;
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
83 /**
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
84 * A pointer to the value.
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
85 */
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
86 void *value;
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
87 };
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
88
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
89 /**
709
1e8ba59e7911 simplify map class structure
Mike Becker <universe@uap-core.de>
parents: 706
diff changeset
90 * The type of iterator for a map.
1e8ba59e7911 simplify map class structure
Mike Becker <universe@uap-core.de>
parents: 706
diff changeset
91 */
1e8ba59e7911 simplify map class structure
Mike Becker <universe@uap-core.de>
parents: 706
diff changeset
92 enum cx_map_iterator_type {
1e8ba59e7911 simplify map class structure
Mike Becker <universe@uap-core.de>
parents: 706
diff changeset
93 /**
1e8ba59e7911 simplify map class structure
Mike Becker <universe@uap-core.de>
parents: 706
diff changeset
94 * Iterates over key/value pairs.
1e8ba59e7911 simplify map class structure
Mike Becker <universe@uap-core.de>
parents: 706
diff changeset
95 */
1e8ba59e7911 simplify map class structure
Mike Becker <universe@uap-core.de>
parents: 706
diff changeset
96 CX_MAP_ITERATOR_PAIRS,
1e8ba59e7911 simplify map class structure
Mike Becker <universe@uap-core.de>
parents: 706
diff changeset
97 /**
1e8ba59e7911 simplify map class structure
Mike Becker <universe@uap-core.de>
parents: 706
diff changeset
98 * Iterates over keys only.
1e8ba59e7911 simplify map class structure
Mike Becker <universe@uap-core.de>
parents: 706
diff changeset
99 */
1e8ba59e7911 simplify map class structure
Mike Becker <universe@uap-core.de>
parents: 706
diff changeset
100 CX_MAP_ITERATOR_KEYS,
1e8ba59e7911 simplify map class structure
Mike Becker <universe@uap-core.de>
parents: 706
diff changeset
101 /**
1e8ba59e7911 simplify map class structure
Mike Becker <universe@uap-core.de>
parents: 706
diff changeset
102 * Iterates over values only.
1e8ba59e7911 simplify map class structure
Mike Becker <universe@uap-core.de>
parents: 706
diff changeset
103 */
1e8ba59e7911 simplify map class structure
Mike Becker <universe@uap-core.de>
parents: 706
diff changeset
104 CX_MAP_ITERATOR_VALUES
1e8ba59e7911 simplify map class structure
Mike Becker <universe@uap-core.de>
parents: 706
diff changeset
105 };
1e8ba59e7911 simplify map class structure
Mike Becker <universe@uap-core.de>
parents: 706
diff changeset
106
1e8ba59e7911 simplify map class structure
Mike Becker <universe@uap-core.de>
parents: 706
diff changeset
107 /**
1115
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
108 * Internal iterator struct - use CxMapIterator.
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
109 */
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
110 struct cx_map_iterator_s {
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
111 /**
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
112 * Inherited common data for all iterators.
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
113 */
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
114 CX_ITERATOR_BASE;
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
115
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
116 /**
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
117 * Handle for the source map.
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
118 */
1429
6e0c3a8a914a remove the concept of "mutating iterators" - resolves #579
Mike Becker <universe@uap-core.de>
parents: 1426
diff changeset
119 CxMap *map;
1115
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
120
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
121 /**
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
122 * Handle for the current element.
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
123 *
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
124 * @attention Depends on the map implementation, do not assume a type (better: do not use!).
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
125 */
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
126 void *elem;
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
127
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
128 /**
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
129 * Reserved memory for a map entry.
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
130 *
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
131 * If a map implementation uses an incompatible layout, the iterator needs something
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
132 * to point to during iteration which @em is compatible.
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
133 */
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
134 CxMapEntry entry;
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
135
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
136 /**
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
137 * Field for storing the current slot number.
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
138 *
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
139 * (Used internally)
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
140 */
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
141 size_t slot;
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
142
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
143 /**
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
144 * Counts the elements successfully.
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
145 * It usually does not denote a stable index within the map as it would be for arrays.
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
146 */
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
147 size_t index;
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
148
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
149 /**
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
150 * The size of a value stored in this map.
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
151 */
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
152 size_t elem_size;
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
153
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
154 /**
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
155 * May contain the total number of elements, if known.
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
156 * Set to @c SIZE_MAX when the total number is unknown during iteration.
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
157 *
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
158 * @remark The UCX implementations of #CxMap always know the number of elements they store.
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
159 */
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
160 size_t elem_count;
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
161
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
162 /**
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
163 * The type of this iterator.
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
164 */
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
165 enum cx_map_iterator_type type;
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
166 };
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
167
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
168 /**
549
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
169 * The class definition for arbitrary maps.
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
170 */
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
171 struct cx_map_class_s {
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
172 /**
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
173 * Deallocates the entire memory.
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
174 */
993
b642eca4b956 make names of destroy and free functions consistent - fixes #484
Mike Becker <universe@uap-core.de>
parents: 992
diff changeset
175 void (*deallocate)(struct cx_map_s *map);
549
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
176
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
177 /**
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
178 * Removes all elements.
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
179 */
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
180 void (*clear)(struct cx_map_s *map);
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
181
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
182 /**
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
183 * Add or overwrite an element.
1341
dc88d2ece7e4 add cxMapEmplace()
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
184 * If the @p value is @c NULL, the implementation
dc88d2ece7e4 add cxMapEmplace()
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
185 * shall only allocate memory instead of adding an existing value to the map.
dc88d2ece7e4 add cxMapEmplace()
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
186 * Returns a pointer to the allocated memory or @c NULL if allocation fails.
549
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
187 */
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
188 void *(*put)(CxMap *map, CxHashKey key, void *value);
549
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
189
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
190 /**
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
191 * Returns an element.
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
192 */
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
193 void *(*get)(const CxMap *map, CxHashKey key);
549
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
194
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
195 /**
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
196 * Removes an element.
994
3603bdf4a78b remove map detach function - fixes #487
Mike Becker <universe@uap-core.de>
parents: 993
diff changeset
197 *
1102
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
198 * Implementations SHALL check if @p targetbuf is set and copy the elements
994
3603bdf4a78b remove map detach function - fixes #487
Mike Becker <universe@uap-core.de>
parents: 993
diff changeset
199 * to the buffer without invoking any destructor.
1102
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
200 * When @p targetbuf is not set, the destructors SHALL be invoked.
994
3603bdf4a78b remove map detach function - fixes #487
Mike Becker <universe@uap-core.de>
parents: 993
diff changeset
201 *
1102
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
202 * The function SHALL return zero when the @p key was found and
994
3603bdf4a78b remove map detach function - fixes #487
Mike Becker <universe@uap-core.de>
parents: 993
diff changeset
203 * non-zero, otherwise.
549
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
204 */
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
205 int (*remove)(CxMap *map, CxHashKey key, void *targetbuf);
549
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
206
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
207 /**
709
1e8ba59e7911 simplify map class structure
Mike Becker <universe@uap-core.de>
parents: 706
diff changeset
208 * Creates an iterator for this map.
549
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
209 */
1115
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
210 CxMapIterator (*iterator)(const CxMap *map, enum cx_map_iterator_type type);
549
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
211 };
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
212
714
34565d898f1f add missing docs for cxEmptyMap
Mike Becker <universe@uap-core.de>
parents: 710
diff changeset
213 /**
34565d898f1f add missing docs for cxEmptyMap
Mike Becker <universe@uap-core.de>
parents: 710
diff changeset
214 * A shared instance of an empty map.
34565d898f1f add missing docs for cxEmptyMap
Mike Becker <universe@uap-core.de>
parents: 710
diff changeset
215 *
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 984
diff changeset
216 * Writing to that map is not allowed.
1102
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
217 *
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1411
diff changeset
218 * You can use this as a placeholder for initializing CxMap pointers
1102
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
219 * for which you do not want to reserve memory right from the beginning.
714
34565d898f1f add missing docs for cxEmptyMap
Mike Becker <universe@uap-core.de>
parents: 710
diff changeset
220 */
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
221 CX_EXPORT extern CxMap *const cxEmptyMap;
706
8c6edaccaef1 add empty map implementation - fixes #259
Mike Becker <universe@uap-core.de>
parents: 694
diff changeset
222
658
56c62780582e make hashmap store objects instead of pointers by default - fixes #239
Mike Becker <universe@uap-core.de>
parents: 630
diff changeset
223 /**
549
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
224 * Deallocates the memory of the specified map.
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
225 *
1102
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
226 * Also calls the content destructor functions for each element, if specified.
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
227 *
993
b642eca4b956 make names of destroy and free functions consistent - fixes #484
Mike Becker <universe@uap-core.de>
parents: 992
diff changeset
228 * @param map the map to be freed
549
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
229 */
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
230 CX_EXPORT void cxMapFree(CxMap *map);
549
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
231
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
232
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
233 /**
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
234 * Clears a map by removing all elements.
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
235 *
1102
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
236 * Also calls the content destructor functions for each element, if specified.
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
237 *
549
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
238 * @param map the map to be cleared
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
239 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 984
diff changeset
240 cx_attr_nonnull
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
241 CX_EXPORT void cxMapClear(CxMap *map);
549
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
242
856
6bbbf219251d fix name of collection base member (to avoid base.base)
Mike Becker <universe@uap-core.de>
parents: 855
diff changeset
243 /**
6bbbf219251d fix name of collection base member (to avoid base.base)
Mike Becker <universe@uap-core.de>
parents: 855
diff changeset
244 * Returns the number of elements in this map.
6bbbf219251d fix name of collection base member (to avoid base.base)
Mike Becker <universe@uap-core.de>
parents: 855
diff changeset
245 *
6bbbf219251d fix name of collection base member (to avoid base.base)
Mike Becker <universe@uap-core.de>
parents: 855
diff changeset
246 * @param map the map
6bbbf219251d fix name of collection base member (to avoid base.base)
Mike Becker <universe@uap-core.de>
parents: 855
diff changeset
247 * @return the number of stored elements
6bbbf219251d fix name of collection base member (to avoid base.base)
Mike Becker <universe@uap-core.de>
parents: 855
diff changeset
248 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 984
diff changeset
249 cx_attr_nonnull
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
250 CX_EXPORT size_t cxMapSize(const CxMap *map);
856
6bbbf219251d fix name of collection base member (to avoid base.base)
Mike Becker <universe@uap-core.de>
parents: 855
diff changeset
251
549
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
252 /**
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
253 * Creates a value iterator for a map.
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
254 *
1115
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
255 * When the map is storing pointers, those pointers are returned.
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
256 * Otherwise, the iterator iterates over pointers to the memory within the map where the
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
257 * respective elements are stored.
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
258 *
1102
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
259 * @note An iterator iterates over all elements successively. Therefore, the order
549
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
260 * highly depends on the map implementation and may change arbitrarily when the contents change.
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
261 *
1344
8afaeb395b3c add support for NULL in map iterators
Mike Becker <universe@uap-core.de>
parents: 1341
diff changeset
262 * @param map the map to create the iterator for (can be @c NULL)
549
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
263 * @return an iterator for the currently stored values
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
264 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 984
diff changeset
265 cx_attr_nodiscard
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
266 CX_EXPORT CxMapIterator cxMapIteratorValues(const CxMap *map);
549
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
267
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
268 /**
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
269 * Creates a key iterator for a map.
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
270 *
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1411
diff changeset
271 * The elements of the iterator are keys of type CxHashKey, and the pointer returned
1115
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
272 * during iterator shall be treated as @c const @c CxHashKey* .
555
d79fbd028e26 fix documentation for map iterators
Mike Becker <universe@uap-core.de>
parents: 553
diff changeset
273 *
1102
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
274 * @note An iterator iterates over all elements successively. Therefore, the order
549
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
275 * highly depends on the map implementation and may change arbitrarily when the contents change.
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
276 *
1344
8afaeb395b3c add support for NULL in map iterators
Mike Becker <universe@uap-core.de>
parents: 1341
diff changeset
277 * @param map the map to create the iterator for (can be @c NULL)
549
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
278 * @return an iterator for the currently stored keys
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
279 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 984
diff changeset
280 cx_attr_nodiscard
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
281 CX_EXPORT CxMapIterator cxMapIteratorKeys(const CxMap *map);
549
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
282
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
283 /**
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
284 * Creates an iterator for a map.
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
285 *
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1411
diff changeset
286 * The elements of the iterator are key/value pairs of type CxMapEntry, and the pointer returned
1115
6db21dee4929 create specialized map iterators - fixes #550
Mike Becker <universe@uap-core.de>
parents: 1114
diff changeset
287 * during iterator shall be treated as @c const @c CxMapEntry* .
549
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
288 *
1102
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
289 * @note An iterator iterates over all elements successively. Therefore, the order
549
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
290 * highly depends on the map implementation and may change arbitrarily when the contents change.
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
291 *
1344
8afaeb395b3c add support for NULL in map iterators
Mike Becker <universe@uap-core.de>
parents: 1341
diff changeset
292 * @param map the map to create the iterator for (can be @c NULL)
555
d79fbd028e26 fix documentation for map iterators
Mike Becker <universe@uap-core.de>
parents: 553
diff changeset
293 * @return an iterator for the currently stored entries
549
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
294 * @see cxMapIteratorKeys()
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
295 * @see cxMapIteratorValues()
d7f0b5a9a985 #189 declare basic map functions
Mike Becker <universe@uap-core.de>
parents:
diff changeset
296 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 984
diff changeset
297 cx_attr_nodiscard
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
298 CX_EXPORT CxMapIterator cxMapIterator(const CxMap *map);
630
ac5e7f789048 separate iterators and mutating iterators
Mike Becker <universe@uap-core.de>
parents: 564
diff changeset
299
ac5e7f789048 separate iterators and mutating iterators
Mike Becker <universe@uap-core.de>
parents: 564
diff changeset
300 /**
1408
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
301 * Puts a key/value-pair into the map.
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
302 *
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
303 * A possible existing value will be overwritten.
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
304 * If destructor functions are specified, they are called for
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
305 * the overwritten element.
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
306 *
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
307 * If this map is storing pointers, the @p value pointer is written
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
308 * to the map. Otherwise, the memory is copied from @p value with
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
309 * memcpy().
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
310 *
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
311 * The @p key is always copied.
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
312 *
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
313 * @param map the map
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
314 * @param key the key
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
315 * @param value the value
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
316 * @retval zero success
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
317 * @retval non-zero value on memory allocation failure
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
318 * @see cxMapPut()
691
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
319 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 984
diff changeset
320 cx_attr_nonnull
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
321 CX_EXPORT int cx_map_put(CxMap *map, CxHashKey key, void *value);
691
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
322
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
323 /**
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
324 * Puts a key/value-pair into the map.
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
325 *
1102
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
326 * A possible existing value will be overwritten.
1114
ad5eeb256242 fix that overwriting a map element did not call any destructor function
Mike Becker <universe@uap-core.de>
parents: 1111
diff changeset
327 * If destructor functions are specified, they are called for
ad5eeb256242 fix that overwriting a map element did not call any destructor function
Mike Becker <universe@uap-core.de>
parents: 1111
diff changeset
328 * the overwritten element.
1102
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
329 *
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
330 * If this map is storing pointers, the @p value pointer is written
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
331 * to the map. Otherwise, the memory is copied from @p value with
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
332 * memcpy().
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
333 *
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
334 * The @p key is always copied.
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
335 *
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
336 * @param map (@c CxMap*) the map
1408
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
337 * @param key (any supported key type) the key
1102
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
338 * @param value (@c void*) the value
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
339 * @retval zero success
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
340 * @retval non-zero value on memory allocation failure
1408
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
341 * @see CX_HASH_KEY()
691
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
342 */
1408
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
343 #define cxMapPut(map, key, value) cx_map_put(map, CX_HASH_KEY(key), value)
691
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
344
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
345 /**
1408
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
346 * Allocates memory for a value in the map associated with the specified key.
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
347 *
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
348 * A possible existing value will be overwritten.
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
349 * If destructor functions are specified, they are called for
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
350 * the overwritten element.
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
351 *
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
352 * If the map is storing pointers, this function returns a @c void** pointer,
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
353 * meaning a pointer to that pointer.
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
354 *
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
355 * The @p key is always copied.
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
356 *
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
357 * @param map the map
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
358 * @param key the key
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
359 * @return the pointer to the allocated memory or @c NULL if allocation fails
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
360 * @retval zero success
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
361 * @retval non-zero value on memory allocation failure
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
362 * @see cxMapEmplace()
1341
dc88d2ece7e4 add cxMapEmplace()
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
363 */
dc88d2ece7e4 add cxMapEmplace()
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
364 cx_attr_nonnull
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
365 CX_EXPORT void *cx_map_emplace(CxMap *map, CxHashKey key);
1341
dc88d2ece7e4 add cxMapEmplace()
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
366
dc88d2ece7e4 add cxMapEmplace()
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
367 /**
dc88d2ece7e4 add cxMapEmplace()
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
368 * Allocates memory for a value in the map associated with the specified key.
dc88d2ece7e4 add cxMapEmplace()
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
369 *
dc88d2ece7e4 add cxMapEmplace()
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
370 * A possible existing value will be overwritten.
dc88d2ece7e4 add cxMapEmplace()
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
371 * If destructor functions are specified, they are called for
dc88d2ece7e4 add cxMapEmplace()
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
372 * the overwritten element.
dc88d2ece7e4 add cxMapEmplace()
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
373 *
dc88d2ece7e4 add cxMapEmplace()
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
374 * If the map is storing pointers, this function returns a @c void** pointer,
dc88d2ece7e4 add cxMapEmplace()
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
375 * meaning a pointer to that pointer.
dc88d2ece7e4 add cxMapEmplace()
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
376 *
dc88d2ece7e4 add cxMapEmplace()
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
377 * The @p key is always copied.
dc88d2ece7e4 add cxMapEmplace()
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
378 *
dc88d2ece7e4 add cxMapEmplace()
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
379 * @param map (@c CxMap*) the map
1408
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
380 * @param key (any supported key type) the key
1341
dc88d2ece7e4 add cxMapEmplace()
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
381 * @return the pointer to the allocated memory or @c NULL if allocation fails
dc88d2ece7e4 add cxMapEmplace()
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
382 * @retval zero success
dc88d2ece7e4 add cxMapEmplace()
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
383 * @retval non-zero value on memory allocation failure
1408
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
384 * @see CX_HASH_KEY()
1341
dc88d2ece7e4 add cxMapEmplace()
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
385 */
1408
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
386 #define cxMapEmplace(map, key) cx_map_emplace(map, CX_HASH_KEY(key))
1341
dc88d2ece7e4 add cxMapEmplace()
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
387
dc88d2ece7e4 add cxMapEmplace()
Mike Becker <universe@uap-core.de>
parents: 1180
diff changeset
388 /**
1408
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
389 * Retrieves a value by using a key.
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
390 *
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
391 * If this map is storing pointers, the stored pointer is returned.
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
392 * Otherwise, a pointer to the element within the map's memory
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
393 * is returned (which is valid as long as the element stays in the map).
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
394 *
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
395 * @param map the map
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
396 * @param key the key
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
397 * @return the value
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
398 * @see cxMapGet()
691
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
399 */
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
400 cx_attr_nonnull cx_attr_nodiscard
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
401 CX_EXPORT void *cx_map_get(const CxMap *map, CxHashKey key);
691
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
402
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
403 /**
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
404 * Retrieves a value by using a key.
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
405 *
1102
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
406 * If this map is storing pointers, the stored pointer is returned.
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
407 * Otherwise, a pointer to the element within the map's memory
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
408 * is returned (which is valid as long as the element stays in the map).
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
409 *
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
410 * @param map (@c CxMap*) the map
1408
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
411 * @param key (any supported key type) the key
1445
e8089a590b71 add implementations for map difference
Mike Becker <universe@uap-core.de>
parents: 1444
diff changeset
412 * @return (@c void*) the value or @c NULL when no value with that @p key exists
1408
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
413 * @see CX_HASH_KEY()
691
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
414 */
1408
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
415 #define cxMapGet(map, key) cx_map_get(map, CX_HASH_KEY(key))
691
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
416
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
417 /**
1445
e8089a590b71 add implementations for map difference
Mike Becker <universe@uap-core.de>
parents: 1444
diff changeset
418 * Checks if a map contains a specific key.
e8089a590b71 add implementations for map difference
Mike Becker <universe@uap-core.de>
parents: 1444
diff changeset
419 *
e8089a590b71 add implementations for map difference
Mike Becker <universe@uap-core.de>
parents: 1444
diff changeset
420 * @param map (@c CxMap*) the map
e8089a590b71 add implementations for map difference
Mike Becker <universe@uap-core.de>
parents: 1444
diff changeset
421 * @param key (any supported key type) the key
e8089a590b71 add implementations for map difference
Mike Becker <universe@uap-core.de>
parents: 1444
diff changeset
422 * @retval true if the key exists in the map
e8089a590b71 add implementations for map difference
Mike Becker <universe@uap-core.de>
parents: 1444
diff changeset
423 * @retval false if the key does not exist in the map
e8089a590b71 add implementations for map difference
Mike Becker <universe@uap-core.de>
parents: 1444
diff changeset
424 * @see CX_HASH_KEY()
e8089a590b71 add implementations for map difference
Mike Becker <universe@uap-core.de>
parents: 1444
diff changeset
425 */
e8089a590b71 add implementations for map difference
Mike Becker <universe@uap-core.de>
parents: 1444
diff changeset
426 #define cxMapContains(map, key) (cxMapGet(map, key) != NULL)
e8089a590b71 add implementations for map difference
Mike Becker <universe@uap-core.de>
parents: 1444
diff changeset
427
e8089a590b71 add implementations for map difference
Mike Becker <universe@uap-core.de>
parents: 1444
diff changeset
428 /**
691
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
429 * Removes a key/value-pair from the map by using the key.
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
430 *
1424
563033aa998c fixes tons of typos and grammar issues across the documentation - fixes #667
Mike Becker <universe@uap-core.de>
parents: 1411
diff changeset
431 * Invokes the destructor functions, if any, on the removed element if and only if the
1408
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
432 * @p targetbuf is @c NULL.
691
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
433 *
1408
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
434 * @param map the map
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
435 * @param key the key
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
436 * @param targetbuf the optional buffer where the removed element shall be copied to
1102
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
437 * @retval zero success
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
438 * @retval non-zero the key was not found
1408
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
439 *
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
440 * @see cxMapRemove()
691
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
441 * @see cxMapRemoveAndGet()
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
442 */
1408
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
443 cx_attr_nonnull_arg(1)
1426
3a89b31f0724 clean up header files and adds support for comparing arbitrary strings with string.h functions
Mike Becker <universe@uap-core.de>
parents: 1424
diff changeset
444 CX_EXPORT int cx_map_remove(CxMap *map, CxHashKey key, void *targetbuf);
691
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
445
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
446 /**
1408
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
447 * Removes a key/value-pair from the map by using the key.
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
448 *
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
449 * Always invokes the destructor functions, if any, on the removed element.
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
450 *
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
451 * @param map (@c CxMap*) the map
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
452 * @param key (any supported key type) the key
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
453 * @retval zero success
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
454 * @retval non-zero the key was not found
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
455 *
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
456 * @see cxMapRemoveAndGet()
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
457 * @see CX_HASH_KEY()
691
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
458 */
1408
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
459 #define cxMapRemove(map, key) cx_map_remove(map, CX_HASH_KEY(key), NULL)
691
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
460
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
461 /**
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
462 * Removes a key/value-pair from the map by using the key.
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
463 *
1102
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
464 * This function will copy the contents of the removed element
1114
ad5eeb256242 fix that overwriting a map element did not call any destructor function
Mike Becker <universe@uap-core.de>
parents: 1111
diff changeset
465 * to the target buffer, which must be guaranteed to be large enough
1102
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
466 * to hold the element (the map's element size).
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
467 * The destructor functions, if any, will @em not be called.
691
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
468 *
994
3603bdf4a78b remove map detach function - fixes #487
Mike Becker <universe@uap-core.de>
parents: 993
diff changeset
469 * If this map is storing pointers, the element is the pointer itself
3603bdf4a78b remove map detach function - fixes #487
Mike Becker <universe@uap-core.de>
parents: 993
diff changeset
470 * and not the object it points to.
691
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
471 *
1102
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
472 * @param map (@c CxMap*) the map
1408
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
473 * @param key (any supported key type) the key
1102
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
474 * @param targetbuf (@c void*) the buffer where the element shall be copied to
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
475 * @retval zero success
db5e355e5349 refine docs for map.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 994
diff changeset
476 * @retval non-zero the key was not found
1111
78eeeb950883 remove API for changing the store_pointer property after list creation
Mike Becker <universe@uap-core.de>
parents: 1109
diff changeset
477 *
994
3603bdf4a78b remove map detach function - fixes #487
Mike Becker <universe@uap-core.de>
parents: 993
diff changeset
478 * @see cxMapRemove()
1408
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
479 * @see CX_HASH_KEY()
691
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
480 */
1408
aaa440cd4125 change map.h to use new CX_HASH_KEY macro
Mike Becker <universe@uap-core.de>
parents: 1344
diff changeset
481 #define cxMapRemoveAndGet(map, key, targetbuf) cx_map_remove(map, CX_HASH_KEY(key), targetbuf)
691
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
482
1437
dde4903c0fd7 untested draft of cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
483
dde4903c0fd7 untested draft of cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
484 /**
dde4903c0fd7 untested draft of cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
485 * Performs a deep clone of one map into another.
dde4903c0fd7 untested draft of cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
486 *
dde4903c0fd7 untested draft of cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
487 * If the destination map already contains entries, the cloned entries
dde4903c0fd7 untested draft of cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
488 * are added to that map, possibly overwriting existing elements when
dde4903c0fd7 untested draft of cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
489 * the keys already exist.
dde4903c0fd7 untested draft of cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
490 *
dde4903c0fd7 untested draft of cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
491 * When elements in the destination map need to be replaced, any destructor
dde4903c0fd7 untested draft of cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
492 * function is called on the replaced elements before replacing them.
dde4903c0fd7 untested draft of cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
493 *
dde4903c0fd7 untested draft of cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
494 * @attention If the cloned elements need to be destroyed by a destructor
dde4903c0fd7 untested draft of cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
495 * function, you must make sure that the destination map also uses this
dde4903c0fd7 untested draft of cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
496 * destructor function.
dde4903c0fd7 untested draft of cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
497 *
dde4903c0fd7 untested draft of cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
498 * @param dst the destination map
dde4903c0fd7 untested draft of cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
499 * @param src the source map
dde4903c0fd7 untested draft of cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
500 * @param clone_func the clone function for the values
dde4903c0fd7 untested draft of cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
501 * @param clone_allocator the allocator that is passed to the clone function
dde4903c0fd7 untested draft of cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
502 * @param data optional additional data that is passed to the clone function
1444
dd9dcbb39c2f make clone functions return int instead of size_t
Mike Becker <universe@uap-core.de>
parents: 1437
diff changeset
503 * @retval zero when all elements were successfully cloned
dd9dcbb39c2f make clone functions return int instead of size_t
Mike Becker <universe@uap-core.de>
parents: 1437
diff changeset
504 * @retval non-zero when an allocation error occurred
1437
dde4903c0fd7 untested draft of cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
505 */
dde4903c0fd7 untested draft of cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
506 cx_attr_nonnull_arg(1, 2, 3)
1444
dd9dcbb39c2f make clone functions return int instead of size_t
Mike Becker <universe@uap-core.de>
parents: 1437
diff changeset
507 CX_EXPORT int cxMapClone(CxMap *dst, const CxMap *src,
1437
dde4903c0fd7 untested draft of cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
508 cx_clone_func clone_func, const CxAllocator *clone_allocator, void *data);
dde4903c0fd7 untested draft of cxMapClone() - relates to #743
Mike Becker <universe@uap-core.de>
parents: 1429
diff changeset
509
1445
e8089a590b71 add implementations for map difference
Mike Becker <universe@uap-core.de>
parents: 1444
diff changeset
510
1447
aaf85b3e9601 add documentation for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1445
diff changeset
511 /**
aaf85b3e9601 add documentation for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1445
diff changeset
512 * Clones entries of a map if their key is not present in another map.
aaf85b3e9601 add documentation for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1445
diff changeset
513 *
aaf85b3e9601 add documentation for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1445
diff changeset
514 * @param dst the destination map
aaf85b3e9601 add documentation for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1445
diff changeset
515 * @param minuend the map to subtract the entries from
aaf85b3e9601 add documentation for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1445
diff changeset
516 * @param subtrahend the map containing the elements to be subtracted
aaf85b3e9601 add documentation for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1445
diff changeset
517 * @param clone_func the clone function for the values
aaf85b3e9601 add documentation for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1445
diff changeset
518 * @param clone_allocator the allocator that is passed to the clone function
aaf85b3e9601 add documentation for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1445
diff changeset
519 * @param data optional additional data that is passed to the clone function
aaf85b3e9601 add documentation for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1445
diff changeset
520 * @retval zero when the elements were successfully cloned
aaf85b3e9601 add documentation for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1445
diff changeset
521 * @retval non-zero when an allocation error occurred
aaf85b3e9601 add documentation for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1445
diff changeset
522 */
1445
e8089a590b71 add implementations for map difference
Mike Becker <universe@uap-core.de>
parents: 1444
diff changeset
523 cx_attr_nonnull_arg(1, 2, 3, 4)
e8089a590b71 add implementations for map difference
Mike Becker <universe@uap-core.de>
parents: 1444
diff changeset
524 CX_EXPORT int cxMapDifference(CxMap *dst, const CxMap *minuend, const CxMap *subtrahend,
e8089a590b71 add implementations for map difference
Mike Becker <universe@uap-core.de>
parents: 1444
diff changeset
525 cx_clone_func clone_func, const CxAllocator *clone_allocator, void *data);
e8089a590b71 add implementations for map difference
Mike Becker <universe@uap-core.de>
parents: 1444
diff changeset
526
1447
aaf85b3e9601 add documentation for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1445
diff changeset
527 /**
aaf85b3e9601 add documentation for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1445
diff changeset
528 * Clones entries of a map if their key is not present in a list.
aaf85b3e9601 add documentation for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1445
diff changeset
529 *
aaf85b3e9601 add documentation for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1445
diff changeset
530 * Note that the list must contain keys of type @c CxKey
1448
0f0fe7311b76 add tests for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1447
diff changeset
531 * (or pointers to such keys) and must use @c cx_hash_key_cmp
0f0fe7311b76 add tests for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1447
diff changeset
532 * as the compare function.
1447
aaf85b3e9601 add documentation for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1445
diff changeset
533 * Generic key types cannot be processed in this case.
aaf85b3e9601 add documentation for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1445
diff changeset
534 *
aaf85b3e9601 add documentation for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1445
diff changeset
535 * @param dst the destination map
aaf85b3e9601 add documentation for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1445
diff changeset
536 * @param src the source map
aaf85b3e9601 add documentation for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1445
diff changeset
537 * @param keys the list of @c CxKey items
aaf85b3e9601 add documentation for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1445
diff changeset
538 * @param clone_func the clone function for the values
aaf85b3e9601 add documentation for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1445
diff changeset
539 * @param clone_allocator the allocator that is passed to the clone function
aaf85b3e9601 add documentation for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1445
diff changeset
540 * @param data optional additional data that is passed to the clone function
aaf85b3e9601 add documentation for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1445
diff changeset
541 * @retval zero when the elements were successfully cloned
aaf85b3e9601 add documentation for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1445
diff changeset
542 * @retval non-zero when an allocation error occurred
aaf85b3e9601 add documentation for cxMapDifference() and cxMapListDifference()
Mike Becker <universe@uap-core.de>
parents: 1445
diff changeset
543 */
1445
e8089a590b71 add implementations for map difference
Mike Becker <universe@uap-core.de>
parents: 1444
diff changeset
544 cx_attr_nonnull_arg(1, 2, 3, 4)
e8089a590b71 add implementations for map difference
Mike Becker <universe@uap-core.de>
parents: 1444
diff changeset
545 CX_EXPORT int cxMapListDifference(CxMap *dst, const CxMap *src, const CxList *keys,
e8089a590b71 add implementations for map difference
Mike Becker <universe@uap-core.de>
parents: 1444
diff changeset
546 cx_clone_func clone_func, const CxAllocator *clone_allocator, void *data);
e8089a590b71 add implementations for map difference
Mike Becker <universe@uap-core.de>
parents: 1444
diff changeset
547
1465
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
548
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
549 /**
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
550 * Clones entries of a map only if their key is present in another map.
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
551 *
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
552 * @param dst the destination map
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
553 * @param src the map to clone the entries from
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
554 * @param other the map to check for existence of the keys
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
555 * @param clone_func the clone function for the values
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
556 * @param clone_allocator the allocator that is passed to the clone function
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
557 * @param data optional additional data that is passed to the clone function
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
558 * @retval zero when the elements were successfully cloned
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
559 * @retval non-zero when an allocation error occurred
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
560 */
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
561 cx_attr_nonnull_arg(1, 2, 3, 4)
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
562 CX_EXPORT int cxMapIntersection(CxMap *dst, const CxMap *src, const CxMap *other,
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
563 cx_clone_func clone_func, const CxAllocator *clone_allocator, void *data);
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
564
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
565 /**
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
566 * Clones entries of a map only if their key is present in a list.
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
567 *
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
568 * Note that the list must contain keys of type @c CxKey
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
569 * (or pointers to such keys) and must use @c cx_hash_key_cmp
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
570 * as the compare function.
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
571 * Generic key types cannot be processed in this case.
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
572 *
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
573 * @param dst the destination map
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
574 * @param src the source map
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
575 * @param keys the list of @c CxKey items
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
576 * @param clone_func the clone function for the values
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
577 * @param clone_allocator the allocator that is passed to the clone function
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
578 * @param data optional additional data that is passed to the clone function
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
579 * @retval zero when the elements were successfully cloned
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
580 * @retval non-zero when an allocation error occurred
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
581 */
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
582 cx_attr_nonnull_arg(1, 2, 3, 4)
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
583 CX_EXPORT int cxMapListIntersection(CxMap *dst, const CxMap *src, const CxList *keys,
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
584 cx_clone_func clone_func, const CxAllocator *clone_allocator, void *data);
dc886f1a6155 specify the intersection functions
Mike Becker <universe@uap-core.de>
parents: 1448
diff changeset
585
1474
84de0ba791af implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents: 1465
diff changeset
586 /**
84de0ba791af implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents: 1465
diff changeset
587 * Clones entries into a map if their key does not exist yet.
84de0ba791af implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents: 1465
diff changeset
588 *
84de0ba791af implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents: 1465
diff changeset
589 * If you want to calculate the union of two maps into a fresh new map,
84de0ba791af implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents: 1465
diff changeset
590 * you can proceed as follows:
84de0ba791af implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents: 1465
diff changeset
591 * 1. Clone the first map into a fresh, empty map.
84de0ba791af implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents: 1465
diff changeset
592 * 2. Use this function to clone the second map into the result from step 1.
84de0ba791af implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents: 1465
diff changeset
593 *
84de0ba791af implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents: 1465
diff changeset
594 * @param dst the destination map
84de0ba791af implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents: 1465
diff changeset
595 * @param src the map to clone the entries from
84de0ba791af implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents: 1465
diff changeset
596 * @param clone_func the clone function for the values
84de0ba791af implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents: 1465
diff changeset
597 * @param clone_allocator the allocator that is passed to the clone function
84de0ba791af implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents: 1465
diff changeset
598 * @param data optional additional data that is passed to the clone function
84de0ba791af implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents: 1465
diff changeset
599 * @retval zero when the elements were successfully cloned
84de0ba791af implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents: 1465
diff changeset
600 * @retval non-zero when an allocation error occurred
84de0ba791af implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents: 1465
diff changeset
601 */
84de0ba791af implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents: 1465
diff changeset
602 cx_attr_nonnull_arg(1, 2, 3)
84de0ba791af implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents: 1465
diff changeset
603 CX_EXPORT int cxMapUnion(CxMap *dst, const CxMap *src,
84de0ba791af implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents: 1465
diff changeset
604 cx_clone_func clone_func, const CxAllocator *clone_allocator, void *data);
84de0ba791af implement cxMapUnion() - resolves #756
Mike Becker <universe@uap-core.de>
parents: 1465
diff changeset
605
1479
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
606 /**
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
607 * Performs a shallow clone of one map into another.
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
608 *
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
609 * This function uses the default allocator, if needed, and performs
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
610 * shallow clones with @c memcpy().
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
611 *
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
612 * If the destination map already contains entries, the cloned entries
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
613 * are added to that map, possibly overwriting existing elements when
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
614 * the keys already exist.
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
615 *
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
616 * When elements in the destination map need to be replaced, any destructor
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
617 * function is called on the replaced elements before replacing them.
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
618 *
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
619 * @attention If the cloned elements need to be destroyed by a destructor
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
620 * function, you must make sure that the destination map also uses this
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
621 * destructor function.
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
622 *
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
623 * @param dst the destination map
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
624 * @param src the source map
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
625 * @retval zero when all elements were successfully cloned
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
626 * @retval non-zero when an allocation error occurred
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
627 * @see cxMapClone()
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
628 */
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
629 cx_attr_nonnull
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
630 CX_EXPORT int cxMapCloneSimple(CxMap *dst, const CxMap *src);
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
631
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
632 /**
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
633 * Clones entries of a map if their key is not present in another map.
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
634 *
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
635 * This function uses the default allocator, if needed, and performs
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
636 * shallow clones with @c memcpy().
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
637 *
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
638 * @param dst the destination map
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
639 * @param minuend the map to subtract the entries from
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
640 * @param subtrahend the map containing the elements to be subtracted
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
641 * @retval zero when the elements were successfully cloned
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
642 * @retval non-zero when an allocation error occurred
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
643 */
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
644 cx_attr_nonnull
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
645 CX_EXPORT int cxMapDifferenceSimple(CxMap *dst, const CxMap *minuend, const CxMap *subtrahend);
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
646
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
647 /**
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
648 * Clones entries of a map if their key is not present in a list.
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
649 *
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
650 * This function uses the default allocator, if needed, and performs
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
651 * shallow clones with @c memcpy().
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
652 *
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
653 * Note that the list must contain keys of type @c CxKey
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
654 * (or pointers to such keys) and must use @c cx_hash_key_cmp
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
655 * as the compare function.
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
656 * Generic key types cannot be processed in this case.
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
657 *
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
658 * @param dst the destination map
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
659 * @param src the source map
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
660 * @param keys the list of @c CxKey items
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
661 * @retval zero when the elements were successfully cloned
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
662 * @retval non-zero when an allocation error occurred
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
663 * @see cxMapListDifference()
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
664 */
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
665 cx_attr_nonnull
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
666 CX_EXPORT int cxMapListDifferenceSimple(CxMap *dst, const CxMap *src, const CxList *keys);
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
667
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
668
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
669 /**
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
670 * Clones entries of a map only if their key is present in another map.
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
671 *
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
672 * This function uses the default allocator, if needed, and performs
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
673 * shallow clones with @c memcpy().
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
674 *
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
675 * @param dst the destination map
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
676 * @param src the map to clone the entries from
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
677 * @param other the map to check for existence of the keys
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
678 * @retval zero when the elements were successfully cloned
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
679 * @retval non-zero when an allocation error occurred
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
680 */
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
681 cx_attr_nonnull
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
682 CX_EXPORT int cxMapIntersectionSimple(CxMap *dst, const CxMap *src, const CxMap *other);
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
683
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
684 /**
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
685 * Clones entries of a map only if their key is present in a list.
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
686 *
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
687 * This function uses the default allocator, if needed, and performs
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
688 * shallow clones with @c memcpy().
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
689 *
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
690 * Note that the list must contain keys of type @c CxKey
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
691 * (or pointers to such keys) and must use @c cx_hash_key_cmp
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
692 * as the compare function.
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
693 * Generic key types cannot be processed in this case.
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
694 *
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
695 * @param dst the destination map
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
696 * @param src the source map
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
697 * @param keys the list of @c CxKey items
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
698 * @retval zero when the elements were successfully cloned
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
699 * @retval non-zero when an allocation error occurred
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
700 */
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
701 cx_attr_nonnull
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
702 CX_EXPORT int cxMapListIntersectionSimple(CxMap *dst, const CxMap *src, const CxList *keys);
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
703
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
704 /**
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
705 * Clones entries into a map if their key does not exist yet.
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
706 *
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
707 * This function uses the default allocator, if needed, and performs
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
708 * shallow clones with @c memcpy().
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
709 *
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
710 * If you want to calculate the union of two maps into a fresh new map,
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
711 * you can proceed as follows:
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
712 * 1. Clone the first map into a fresh, empty map.
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
713 * 2. Use this function to clone the second map into the result from step 1.
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
714 *
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
715 * @param dst the destination map
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
716 * @param src the map to clone the entries from
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
717 * @retval zero when the elements were successfully cloned
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
718 * @retval non-zero when an allocation error occurred
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
719 */
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
720 cx_attr_nonnull
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
721 CX_EXPORT int cxMapUnionSimple(CxMap *dst, const CxMap *src);
ac1baaed2fd7 implement simple versions of the clone functions
Mike Becker <universe@uap-core.de>
parents: 1474
diff changeset
722
1411
838796848e12 fixes regression: missing closing brace in map.h in c++ builds
Mike Becker <universe@uap-core.de>
parents: 1408
diff changeset
723 #ifdef __cplusplus
838796848e12 fixes regression: missing closing brace in map.h in c++ builds
Mike Becker <universe@uap-core.de>
parents: 1408
diff changeset
724 } // extern "C"
838796848e12 fixes regression: missing closing brace in map.h in c++ builds
Mike Becker <universe@uap-core.de>
parents: 1408
diff changeset
725 #endif
838796848e12 fixes regression: missing closing brace in map.h in c++ builds
Mike Becker <universe@uap-core.de>
parents: 1408
diff changeset
726
691
65baf7f45ac8 bring a generic interface to CxMap
Mike Becker <universe@uap-core.de>
parents: 689
diff changeset
727 #endif // UCX_MAP_H

mercurial