| 49 typedef struct cx_map_s CxMap; |
49 typedef struct cx_map_s CxMap; |
| 50 |
50 |
| 51 /** Type for a map entry. */ |
51 /** Type for a map entry. */ |
| 52 typedef struct cx_map_entry_s CxMapEntry; |
52 typedef struct cx_map_entry_s CxMapEntry; |
| 53 |
53 |
| |
54 /** Type for a map iterator. */ |
| |
55 typedef struct cx_map_iterator_s CxMapIterator; |
| |
56 |
| 54 /** Type for map class definitions. */ |
57 /** Type for map class definitions. */ |
| 55 typedef struct cx_map_class_s cx_map_class; |
58 typedef struct cx_map_class_s cx_map_class; |
| 56 |
59 |
| 57 /** Structure for the UCX map. */ |
60 /** Structure for the UCX map. */ |
| 58 struct cx_map_s { |
61 struct cx_map_s { |
| 78 CX_MAP_ITERATOR_KEYS, |
95 CX_MAP_ITERATOR_KEYS, |
| 79 /** |
96 /** |
| 80 * Iterates over values only. |
97 * Iterates over values only. |
| 81 */ |
98 */ |
| 82 CX_MAP_ITERATOR_VALUES |
99 CX_MAP_ITERATOR_VALUES |
| |
100 }; |
| |
101 |
| |
102 /** |
| |
103 * Internal iterator struct - use CxMapIterator. |
| |
104 */ |
| |
105 struct cx_map_iterator_s { |
| |
106 /** |
| |
107 * Inherited common data for all iterators. |
| |
108 */ |
| |
109 CX_ITERATOR_BASE; |
| |
110 |
| |
111 /** |
| |
112 * Handle for the source map. |
| |
113 */ |
| |
114 union { |
| |
115 /** |
| |
116 * Access for mutating iterators. |
| |
117 */ |
| |
118 CxMap *m; |
| |
119 /** |
| |
120 * Access for normal iterators. |
| |
121 */ |
| |
122 const CxMap *c; |
| |
123 } map; |
| |
124 |
| |
125 /** |
| |
126 * Handle for the current element. |
| |
127 * |
| |
128 * @attention Depends on the map implementation, do not assume a type (better: do not use!). |
| |
129 */ |
| |
130 void *elem; |
| |
131 |
| |
132 /** |
| |
133 * Reserved memory for a map entry. |
| |
134 * |
| |
135 * If a map implementation uses an incompatible layout, the iterator needs something |
| |
136 * to point to during iteration which @em is compatible. |
| |
137 */ |
| |
138 CxMapEntry entry; |
| |
139 |
| |
140 /** |
| |
141 * Field for storing the current slot number. |
| |
142 * |
| |
143 * (Used internally) |
| |
144 */ |
| |
145 size_t slot; |
| |
146 |
| |
147 /** |
| |
148 * Counts the elements successfully. |
| |
149 * It usually does not denote a stable index within the map as it would be for arrays. |
| |
150 */ |
| |
151 size_t index; |
| |
152 |
| |
153 /** |
| |
154 * The size of a value stored in this map. |
| |
155 */ |
| |
156 size_t elem_size; |
| |
157 |
| |
158 /** |
| |
159 * May contain the total number of elements, if known. |
| |
160 * Set to @c SIZE_MAX when the total number is unknown during iteration. |
| |
161 * |
| |
162 * @remark The UCX implementations of #CxMap always know the number of elements they store. |
| |
163 */ |
| |
164 size_t elem_count; |
| |
165 |
| |
166 /** |
| |
167 * The type of this iterator. |
| |
168 */ |
| |
169 enum cx_map_iterator_type type; |
| 83 }; |
170 }; |
| 84 |
171 |
| 85 /** |
172 /** |
| 86 * The class definition for arbitrary maps. |
173 * The class definition for arbitrary maps. |
| 87 */ |
174 */ |
| 193 } |
266 } |
| 194 |
267 |
| 195 /** |
268 /** |
| 196 * Creates a value iterator for a map. |
269 * Creates a value iterator for a map. |
| 197 * |
270 * |
| |
271 * When the map is storing pointers, those pointers are returned. |
| |
272 * Otherwise, the iterator iterates over pointers to the memory within the map where the |
| |
273 * respective elements are stored. |
| |
274 * |
| 198 * @note An iterator iterates over all elements successively. Therefore, the order |
275 * @note An iterator iterates over all elements successively. Therefore, the order |
| 199 * highly depends on the map implementation and may change arbitrarily when the contents change. |
276 * highly depends on the map implementation and may change arbitrarily when the contents change. |
| 200 * |
277 * |
| 201 * @param map the map to create the iterator for |
278 * @param map the map to create the iterator for |
| 202 * @return an iterator for the currently stored values |
279 * @return an iterator for the currently stored values |
| 203 */ |
280 */ |
| 204 cx_attr_nonnull |
281 cx_attr_nonnull |
| 205 cx_attr_nodiscard |
282 cx_attr_nodiscard |
| 206 static inline CxIterator cxMapIteratorValues(const CxMap *map) { |
283 static inline CxMapIterator cxMapIteratorValues(const CxMap *map) { |
| 207 return map->cl->iterator(map, CX_MAP_ITERATOR_VALUES); |
284 return map->cl->iterator(map, CX_MAP_ITERATOR_VALUES); |
| 208 } |
285 } |
| 209 |
286 |
| 210 /** |
287 /** |
| 211 * Creates a key iterator for a map. |
288 * Creates a key iterator for a map. |
| 212 * |
289 * |
| 213 * The elements of the iterator are keys of type CxHashKey. |
290 * The elements of the iterator are keys of type CxHashKey and the pointer returned |
| |
291 * during iterator shall be treated as @c const @c CxHashKey* . |
| 214 * |
292 * |
| 215 * @note An iterator iterates over all elements successively. Therefore, the order |
293 * @note An iterator iterates over all elements successively. Therefore, the order |
| 216 * highly depends on the map implementation and may change arbitrarily when the contents change. |
294 * highly depends on the map implementation and may change arbitrarily when the contents change. |
| 217 * |
295 * |
| 218 * @param map the map to create the iterator for |
296 * @param map the map to create the iterator for |
| 219 * @return an iterator for the currently stored keys |
297 * @return an iterator for the currently stored keys |
| 220 */ |
298 */ |
| 221 cx_attr_nonnull |
299 cx_attr_nonnull |
| 222 cx_attr_nodiscard |
300 cx_attr_nodiscard |
| 223 static inline CxIterator cxMapIteratorKeys(const CxMap *map) { |
301 static inline CxMapIterator cxMapIteratorKeys(const CxMap *map) { |
| 224 return map->cl->iterator(map, CX_MAP_ITERATOR_KEYS); |
302 return map->cl->iterator(map, CX_MAP_ITERATOR_KEYS); |
| 225 } |
303 } |
| 226 |
304 |
| 227 /** |
305 /** |
| 228 * Creates an iterator for a map. |
306 * Creates an iterator for a map. |
| 229 * |
307 * |
| 230 * The elements of the iterator are key/value pairs of type CxMapEntry. |
308 * The elements of the iterator are key/value pairs of type CxMapEntry and the pointer returned |
| |
309 * during iterator shall be treated as @c const @c CxMapEntry* . |
| 231 * |
310 * |
| 232 * @note An iterator iterates over all elements successively. Therefore, the order |
311 * @note An iterator iterates over all elements successively. Therefore, the order |
| 233 * highly depends on the map implementation and may change arbitrarily when the contents change. |
312 * highly depends on the map implementation and may change arbitrarily when the contents change. |
| 234 * |
313 * |
| 235 * @param map the map to create the iterator for |
314 * @param map the map to create the iterator for |
| 237 * @see cxMapIteratorKeys() |
316 * @see cxMapIteratorKeys() |
| 238 * @see cxMapIteratorValues() |
317 * @see cxMapIteratorValues() |
| 239 */ |
318 */ |
| 240 cx_attr_nonnull |
319 cx_attr_nonnull |
| 241 cx_attr_nodiscard |
320 cx_attr_nodiscard |
| 242 static inline CxIterator cxMapIterator(const CxMap *map) { |
321 static inline CxMapIterator cxMapIterator(const CxMap *map) { |
| 243 return map->cl->iterator(map, CX_MAP_ITERATOR_PAIRS); |
322 return map->cl->iterator(map, CX_MAP_ITERATOR_PAIRS); |
| 244 } |
323 } |
| 245 |
324 |
| 246 |
325 |
| 247 /** |
326 /** |
| 248 * Creates a mutating iterator over the values of a map. |
327 * Creates a mutating iterator over the values of a map. |
| |
328 * |
| |
329 * When the map is storing pointers, those pointers are returned. |
| |
330 * Otherwise, the iterator iterates over pointers to the memory within the map where the |
| |
331 * respective elements are stored. |
| 249 * |
332 * |
| 250 * @note An iterator iterates over all elements successively. Therefore, the order |
333 * @note An iterator iterates over all elements successively. Therefore, the order |
| 251 * highly depends on the map implementation and may change arbitrarily when the contents change. |
334 * highly depends on the map implementation and may change arbitrarily when the contents change. |
| 252 * |
335 * |
| 253 * @param map the map to create the iterator for |
336 * @param map the map to create the iterator for |
| 254 * @return an iterator for the currently stored values |
337 * @return an iterator for the currently stored values |
| 255 */ |
338 */ |
| 256 cx_attr_nonnull |
339 cx_attr_nonnull |
| 257 cx_attr_nodiscard |
340 cx_attr_nodiscard |
| 258 CxIterator cxMapMutIteratorValues(CxMap *map); |
341 CxMapIterator cxMapMutIteratorValues(CxMap *map); |
| 259 |
342 |
| 260 /** |
343 /** |
| 261 * Creates a mutating iterator over the keys of a map. |
344 * Creates a mutating iterator over the keys of a map. |
| 262 * |
345 * |
| 263 * The elements of the iterator are keys of type CxHashKey. |
346 * The elements of the iterator are keys of type CxHashKey and the pointer returned |
| |
347 * during iterator shall be treated as @c const @c CxHashKey* . |
| 264 * |
348 * |
| 265 * @note An iterator iterates over all elements successively. Therefore, the order |
349 * @note An iterator iterates over all elements successively. Therefore, the order |
| 266 * highly depends on the map implementation and may change arbitrarily when the contents change. |
350 * highly depends on the map implementation and may change arbitrarily when the contents change. |
| 267 * |
351 * |
| 268 * @param map the map to create the iterator for |
352 * @param map the map to create the iterator for |
| 269 * @return an iterator for the currently stored keys |
353 * @return an iterator for the currently stored keys |
| 270 */ |
354 */ |
| 271 cx_attr_nonnull |
355 cx_attr_nonnull |
| 272 cx_attr_nodiscard |
356 cx_attr_nodiscard |
| 273 CxIterator cxMapMutIteratorKeys(CxMap *map); |
357 CxMapIterator cxMapMutIteratorKeys(CxMap *map); |
| 274 |
358 |
| 275 /** |
359 /** |
| 276 * Creates a mutating iterator for a map. |
360 * Creates a mutating iterator for a map. |
| 277 * |
361 * |
| 278 * The elements of the iterator are key/value pairs of type CxMapEntry. |
362 * The elements of the iterator are key/value pairs of type CxMapEntry and the pointer returned |
| |
363 * during iterator shall be treated as @c const @c CxMapEntry* . |
| 279 * |
364 * |
| 280 * @note An iterator iterates over all elements successively. Therefore, the order |
365 * @note An iterator iterates over all elements successively. Therefore, the order |
| 281 * highly depends on the map implementation and may change arbitrarily when the contents change. |
366 * highly depends on the map implementation and may change arbitrarily when the contents change. |
| 282 * |
367 * |
| 283 * @param map the map to create the iterator for |
368 * @param map the map to create the iterator for |