src/cx/map.h

Mon, 18 Dec 2023 14:14:47 +0100

author
Mike Becker <universe@uap-core.de>
date
Mon, 18 Dec 2023 14:14:47 +0100
changeset 759
475335643af4
parent 714
34565d898f1f
permissions
-rw-r--r--

increase version number to 3.1

remove per-file version information
from Doxygen output

universe@549 1 /*
universe@549 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
universe@549 3 *
universe@549 4 * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
universe@549 5 *
universe@549 6 * Redistribution and use in source and binary forms, with or without
universe@549 7 * modification, are permitted provided that the following conditions are met:
universe@549 8 *
universe@549 9 * 1. Redistributions of source code must retain the above copyright
universe@549 10 * notice, this list of conditions and the following disclaimer.
universe@549 11 *
universe@549 12 * 2. Redistributions in binary form must reproduce the above copyright
universe@549 13 * notice, this list of conditions and the following disclaimer in the
universe@549 14 * documentation and/or other materials provided with the distribution.
universe@549 15 *
universe@549 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
universe@549 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
universe@549 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
universe@549 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
universe@549 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
universe@549 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
universe@549 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
universe@549 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
universe@549 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
universe@549 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
universe@549 26 * POSSIBILITY OF SUCH DAMAGE.
universe@549 27 */
universe@549 28 /**
universe@549 29 * \file map.h
universe@549 30 * \brief Interface for map implementations.
universe@549 31 * \author Mike Becker
universe@549 32 * \author Olaf Wintermann
universe@549 33 * \copyright 2-Clause BSD License
universe@549 34 */
universe@549 35
universe@549 36 #ifndef UCX_MAP_H
universe@549 37 #define UCX_MAP_H
universe@549 38
universe@681 39 #include "common.h"
universe@677 40 #include "collection.h"
universe@691 41 #include "string.h"
universe@563 42 #include "hash_key.h"
universe@549 43
universe@549 44 #ifdef __cplusplus
universe@549 45 extern "C" {
universe@549 46 #endif
universe@549 47
universe@549 48 /** Type for the UCX map. */
universe@549 49 typedef struct cx_map_s CxMap;
universe@549 50
universe@549 51 /** Type for a map entry. */
universe@549 52 typedef struct cx_map_entry_s CxMapEntry;
universe@549 53
universe@549 54 /** Type for map class definitions. */
universe@549 55 typedef struct cx_map_class_s cx_map_class;
universe@549 56
universe@549 57 /** Structure for the UCX map. */
universe@549 58 struct cx_map_s {
universe@685 59 CX_COLLECTION_MEMBERS
universe@549 60 /** The map class definition. */
universe@549 61 cx_map_class *cl;
universe@549 62 };
universe@549 63
universe@549 64 /**
universe@709 65 * The type of iterator for a map.
universe@709 66 */
universe@709 67 enum cx_map_iterator_type {
universe@709 68 /**
universe@709 69 * Iterates over key/value pairs.
universe@709 70 */
universe@709 71 CX_MAP_ITERATOR_PAIRS,
universe@709 72 /**
universe@709 73 * Iterates over keys only.
universe@709 74 */
universe@709 75 CX_MAP_ITERATOR_KEYS,
universe@709 76 /**
universe@709 77 * Iterates over values only.
universe@709 78 */
universe@709 79 CX_MAP_ITERATOR_VALUES
universe@709 80 };
universe@709 81
universe@709 82 /**
universe@549 83 * The class definition for arbitrary maps.
universe@549 84 */
universe@549 85 struct cx_map_class_s {
universe@549 86 /**
universe@549 87 * Deallocates the entire memory.
universe@549 88 */
universe@549 89 __attribute__((__nonnull__))
universe@549 90 void (*destructor)(struct cx_map_s *map);
universe@549 91
universe@549 92 /**
universe@549 93 * Removes all elements.
universe@549 94 */
universe@549 95 __attribute__((__nonnull__))
universe@549 96 void (*clear)(struct cx_map_s *map);
universe@549 97
universe@549 98 /**
universe@549 99 * Add or overwrite an element.
universe@549 100 */
universe@549 101 __attribute__((__nonnull__))
universe@549 102 int (*put)(
universe@549 103 CxMap *map,
universe@563 104 CxHashKey key,
universe@550 105 void *value
universe@549 106 );
universe@549 107
universe@549 108 /**
universe@549 109 * Returns an element.
universe@549 110 */
universe@549 111 __attribute__((__nonnull__, __warn_unused_result__))
universe@549 112 void *(*get)(
universe@549 113 CxMap const *map,
universe@563 114 CxHashKey key
universe@549 115 );
universe@549 116
universe@549 117 /**
universe@549 118 * Removes an element.
universe@549 119 */
universe@659 120 __attribute__((__nonnull__))
universe@549 121 void *(*remove)(
universe@550 122 CxMap *map,
universe@686 123 CxHashKey key,
universe@686 124 bool destroy
universe@549 125 );
universe@549 126
universe@549 127 /**
universe@709 128 * Creates an iterator for this map.
universe@549 129 */
universe@549 130 __attribute__((__nonnull__, __warn_unused_result__))
universe@709 131 CxIterator (*iterator)(CxMap const *map, enum cx_map_iterator_type type);
universe@549 132 };
universe@549 133
universe@549 134 /**
universe@549 135 * A map entry.
universe@549 136 */
universe@549 137 struct cx_map_entry_s {
universe@549 138 /**
universe@551 139 * A pointer to the key.
universe@549 140 */
universe@563 141 CxHashKey const *key;
universe@549 142 /**
universe@551 143 * A pointer to the value.
universe@549 144 */
universe@551 145 void *value;
universe@549 146 };
universe@549 147
universe@714 148 /**
universe@714 149 * A shared instance of an empty map.
universe@714 150 *
universe@714 151 * Writing to that map is undefined.
universe@714 152 */
universe@706 153 extern CxMap *const cxEmptyMap;
universe@706 154
universe@658 155 /**
universe@658 156 * Advises the map to store copies of the objects (default mode of operation).
universe@658 157 *
universe@658 158 * Retrieving objects from this map will yield pointers to the copies stored
universe@658 159 * within this list.
universe@658 160 *
universe@658 161 * @param map the map
universe@658 162 * @see cxMapStorePointers()
universe@658 163 */
universe@658 164 __attribute__((__nonnull__))
universe@658 165 static inline void cxMapStoreObjects(CxMap *map) {
universe@685 166 map->store_pointer = false;
universe@658 167 }
universe@658 168
universe@658 169 /**
universe@658 170 * Advises the map to only store pointers to the objects.
universe@658 171 *
universe@658 172 * Retrieving objects from this list will yield the original pointers stored.
universe@658 173 *
universe@658 174 * @note This function forcibly sets the element size to the size of a pointer.
universe@658 175 * Invoking this function on a non-empty map that already stores copies of
universe@658 176 * objects is undefined.
universe@658 177 *
universe@658 178 * @param map the map
universe@658 179 * @see cxMapStoreObjects()
universe@658 180 */
universe@658 181 __attribute__((__nonnull__))
universe@658 182 static inline void cxMapStorePointers(CxMap *map) {
universe@685 183 map->store_pointer = true;
universe@677 184 map->item_size = sizeof(void *);
universe@658 185 }
universe@658 186
universe@549 187
universe@549 188 /**
universe@549 189 * Deallocates the memory of the specified map.
universe@549 190 *
universe@549 191 * @param map the map to be destroyed
universe@549 192 */
universe@549 193 __attribute__((__nonnull__))
universe@549 194 static inline void cxMapDestroy(CxMap *map) {
universe@549 195 map->cl->destructor(map);
universe@549 196 }
universe@549 197
universe@549 198
universe@549 199 /**
universe@549 200 * Clears a map by removing all elements.
universe@549 201 *
universe@549 202 * @param map the map to be cleared
universe@549 203 */
universe@549 204 __attribute__((__nonnull__))
universe@549 205 static inline void cxMapClear(CxMap *map) {
universe@549 206 map->cl->clear(map);
universe@549 207 }
universe@549 208
universe@549 209
universe@549 210 // TODO: set-like map operations (union, intersect, difference)
universe@549 211
universe@549 212 /**
universe@549 213 * Creates a value iterator for a map.
universe@549 214 *
universe@549 215 * \note An iterator iterates over all elements successively. Therefore the order
universe@549 216 * highly depends on the map implementation and may change arbitrarily when the contents change.
universe@549 217 *
universe@549 218 * @param map the map to create the iterator for
universe@549 219 * @return an iterator for the currently stored values
universe@549 220 */
universe@549 221 __attribute__((__nonnull__, __warn_unused_result__))
universe@710 222 static inline CxIterator cxMapIteratorValues(CxMap const *map) {
universe@709 223 return map->cl->iterator(map, CX_MAP_ITERATOR_VALUES);
universe@549 224 }
universe@549 225
universe@549 226 /**
universe@549 227 * Creates a key iterator for a map.
universe@549 228 *
universe@564 229 * The elements of the iterator are keys of type CxHashKey.
universe@555 230 *
universe@549 231 * \note An iterator iterates over all elements successively. Therefore the order
universe@549 232 * highly depends on the map implementation and may change arbitrarily when the contents change.
universe@549 233 *
universe@549 234 * @param map the map to create the iterator for
universe@549 235 * @return an iterator for the currently stored keys
universe@549 236 */
universe@549 237 __attribute__((__nonnull__, __warn_unused_result__))
universe@710 238 static inline CxIterator cxMapIteratorKeys(CxMap const *map) {
universe@709 239 return map->cl->iterator(map, CX_MAP_ITERATOR_KEYS);
universe@549 240 }
universe@549 241
universe@549 242 /**
universe@549 243 * Creates an iterator for a map.
universe@549 244 *
universe@555 245 * The elements of the iterator are key/value pairs of type CxMapEntry.
universe@549 246 *
universe@549 247 * \note An iterator iterates over all elements successively. Therefore the order
universe@549 248 * highly depends on the map implementation and may change arbitrarily when the contents change.
universe@549 249 *
universe@549 250 * @param map the map to create the iterator for
universe@555 251 * @return an iterator for the currently stored entries
universe@549 252 * @see cxMapIteratorKeys()
universe@549 253 * @see cxMapIteratorValues()
universe@549 254 */
universe@549 255 __attribute__((__nonnull__, __warn_unused_result__))
universe@710 256 static inline CxIterator cxMapIterator(CxMap const *map) {
universe@709 257 return map->cl->iterator(map, CX_MAP_ITERATOR_PAIRS);
universe@549 258 }
universe@549 259
universe@630 260
universe@630 261 /**
universe@630 262 * Creates a mutating iterator over the values of a map.
universe@630 263 *
universe@630 264 * \note An iterator iterates over all elements successively. Therefore the order
universe@630 265 * highly depends on the map implementation and may change arbitrarily when the contents change.
universe@630 266 *
universe@630 267 * @param map the map to create the iterator for
universe@630 268 * @return an iterator for the currently stored values
universe@630 269 */
universe@630 270 __attribute__((__nonnull__, __warn_unused_result__))
universe@709 271 CxMutIterator cxMapMutIteratorValues(CxMap *map);
universe@630 272
universe@630 273 /**
universe@630 274 * Creates a mutating iterator over the keys of a map.
universe@630 275 *
universe@630 276 * The elements of the iterator are keys of type CxHashKey.
universe@630 277 *
universe@630 278 * \note An iterator iterates over all elements successively. Therefore the order
universe@630 279 * highly depends on the map implementation and may change arbitrarily when the contents change.
universe@630 280 *
universe@630 281 * @param map the map to create the iterator for
universe@630 282 * @return an iterator for the currently stored keys
universe@630 283 */
universe@630 284 __attribute__((__nonnull__, __warn_unused_result__))
universe@709 285 CxMutIterator cxMapMutIteratorKeys(CxMap *map);
universe@630 286
universe@630 287 /**
universe@630 288 * Creates a mutating iterator for a map.
universe@630 289 *
universe@630 290 * The elements of the iterator are key/value pairs of type CxMapEntry.
universe@630 291 *
universe@630 292 * \note An iterator iterates over all elements successively. Therefore the order
universe@630 293 * highly depends on the map implementation and may change arbitrarily when the contents change.
universe@630 294 *
universe@630 295 * @param map the map to create the iterator for
universe@630 296 * @return an iterator for the currently stored entries
universe@630 297 * @see cxMapMutIteratorKeys()
universe@630 298 * @see cxMapMutIteratorValues()
universe@630 299 */
universe@630 300 __attribute__((__nonnull__, __warn_unused_result__))
universe@709 301 CxMutIterator cxMapMutIterator(CxMap *map);
universe@630 302
universe@691 303 #ifdef __cplusplus
universe@691 304 } // end the extern "C" block here, because we want to start overloading
universe@691 305
universe@691 306 /**
universe@691 307 * Puts a key/value-pair into the map.
universe@691 308 *
universe@691 309 * @param map the map
universe@691 310 * @param key the key
universe@691 311 * @param value the value
universe@691 312 * @return 0 on success, non-zero value on failure
universe@691 313 */
universe@691 314 __attribute__((__nonnull__))
universe@691 315 static inline int cxMapPut(
universe@691 316 CxMap *map,
universe@691 317 CxHashKey const &key,
universe@691 318 void *value
universe@691 319 ) {
universe@691 320 return map->cl->put(map, key, value);
universe@549 321 }
universe@549 322
universe@691 323
universe@691 324 /**
universe@691 325 * Puts a key/value-pair into the map.
universe@691 326 *
universe@691 327 * @param map the map
universe@691 328 * @param key the key
universe@691 329 * @param value the value
universe@691 330 * @return 0 on success, non-zero value on failure
universe@691 331 */
universe@691 332 __attribute__((__nonnull__))
universe@691 333 static inline int cxMapPut(
universe@691 334 CxMap *map,
universe@691 335 cxstring const &key,
universe@691 336 void *value
universe@691 337 ) {
universe@691 338 return map->cl->put(map, cx_hash_key_cxstr(key), value);
universe@691 339 }
universe@691 340
universe@691 341 /**
universe@691 342 * Puts a key/value-pair into the map.
universe@691 343 *
universe@691 344 * @param map the map
universe@691 345 * @param key the key
universe@691 346 * @param value the value
universe@691 347 * @return 0 on success, non-zero value on failure
universe@691 348 */
universe@691 349 __attribute__((__nonnull__))
universe@691 350 static inline int cxMapPut(
universe@691 351 CxMap *map,
universe@692 352 cxmutstr const &key,
universe@692 353 void *value
universe@692 354 ) {
universe@692 355 return map->cl->put(map, cx_hash_key_cxstr(key), value);
universe@692 356 }
universe@692 357
universe@692 358 /**
universe@692 359 * Puts a key/value-pair into the map.
universe@692 360 *
universe@692 361 * @param map the map
universe@692 362 * @param key the key
universe@692 363 * @param value the value
universe@692 364 * @return 0 on success, non-zero value on failure
universe@692 365 */
universe@692 366 __attribute__((__nonnull__))
universe@692 367 static inline int cxMapPut(
universe@692 368 CxMap *map,
universe@691 369 char const *key,
universe@691 370 void *value
universe@691 371 ) {
universe@691 372 return map->cl->put(map, cx_hash_key_str(key), value);
universe@691 373 }
universe@691 374
universe@691 375 /**
universe@691 376 * Retrieves a value by using a key.
universe@691 377 *
universe@691 378 * @param map the map
universe@691 379 * @param key the key
universe@691 380 * @return the value
universe@691 381 */
universe@691 382 __attribute__((__nonnull__, __warn_unused_result__))
universe@691 383 static inline void *cxMapGet(
universe@691 384 CxMap const *map,
universe@691 385 CxHashKey const &key
universe@691 386 ) {
universe@691 387 return map->cl->get(map, key);
universe@691 388 }
universe@691 389
universe@691 390 /**
universe@691 391 * Retrieves a value by using a key.
universe@691 392 *
universe@691 393 * @param map the map
universe@691 394 * @param key the key
universe@691 395 * @return the value
universe@691 396 */
universe@691 397 __attribute__((__nonnull__, __warn_unused_result__))
universe@691 398 static inline void *cxMapGet(
universe@691 399 CxMap const *map,
universe@691 400 cxstring const &key
universe@691 401 ) {
universe@691 402 return map->cl->get(map, cx_hash_key_cxstr(key));
universe@691 403 }
universe@691 404
universe@691 405 /**
universe@691 406 * Retrieves a value by using a key.
universe@691 407 *
universe@691 408 * @param map the map
universe@691 409 * @param key the key
universe@691 410 * @return the value
universe@691 411 */
universe@691 412 __attribute__((__nonnull__, __warn_unused_result__))
universe@691 413 static inline void *cxMapGet(
universe@691 414 CxMap const *map,
universe@692 415 cxmutstr const &key
universe@692 416 ) {
universe@692 417 return map->cl->get(map, cx_hash_key_cxstr(key));
universe@692 418 }
universe@692 419
universe@692 420 /**
universe@692 421 * Retrieves a value by using a key.
universe@692 422 *
universe@692 423 * @param map the map
universe@692 424 * @param key the key
universe@692 425 * @return the value
universe@692 426 */
universe@692 427 __attribute__((__nonnull__, __warn_unused_result__))
universe@692 428 static inline void *cxMapGet(
universe@692 429 CxMap const *map,
universe@691 430 char const *key
universe@691 431 ) {
universe@691 432 return map->cl->get(map, cx_hash_key_str(key));
universe@691 433 }
universe@691 434
universe@691 435 /**
universe@691 436 * Removes a key/value-pair from the map by using the key.
universe@691 437 *
universe@691 438 * Always invokes the destructor function, if any, on the removed element.
universe@691 439 * If this map is storing pointers and you just want to retrieve the pointer
universe@691 440 * without invoking the destructor, use cxMapRemoveAndGet().
universe@691 441 * If you just want to detach the element from the map without invoking the
universe@691 442 * destructor or returning the element, use cxMapDetach().
universe@691 443 *
universe@691 444 * @param map the map
universe@691 445 * @param key the key
universe@691 446 * @see cxMapRemoveAndGet()
universe@691 447 * @see cxMapDetach()
universe@691 448 */
universe@691 449 __attribute__((__nonnull__))
universe@691 450 static inline void cxMapRemove(
universe@691 451 CxMap *map,
universe@691 452 CxHashKey const &key
universe@691 453 ) {
universe@691 454 (void) map->cl->remove(map, key, true);
universe@691 455 }
universe@691 456
universe@691 457 /**
universe@691 458 * Removes a key/value-pair from the map by using the key.
universe@691 459 *
universe@691 460 * Always invokes the destructor function, if any, on the removed element.
universe@691 461 * If this map is storing pointers and you just want to retrieve the pointer
universe@691 462 * without invoking the destructor, use cxMapRemoveAndGet().
universe@691 463 * If you just want to detach the element from the map without invoking the
universe@691 464 * destructor or returning the element, use cxMapDetach().
universe@691 465 *
universe@691 466 * @param map the map
universe@691 467 * @param key the key
universe@691 468 * @see cxMapRemoveAndGet()
universe@691 469 * @see cxMapDetach()
universe@691 470 */
universe@691 471 __attribute__((__nonnull__))
universe@691 472 static inline void cxMapRemove(
universe@691 473 CxMap *map,
universe@691 474 cxstring const &key
universe@691 475 ) {
universe@691 476 (void) map->cl->remove(map, cx_hash_key_cxstr(key), true);
universe@691 477 }
universe@691 478
universe@691 479 /**
universe@691 480 * Removes a key/value-pair from the map by using the key.
universe@691 481 *
universe@691 482 * Always invokes the destructor function, if any, on the removed element.
universe@691 483 * If this map is storing pointers and you just want to retrieve the pointer
universe@691 484 * without invoking the destructor, use cxMapRemoveAndGet().
universe@691 485 * If you just want to detach the element from the map without invoking the
universe@691 486 * destructor or returning the element, use cxMapDetach().
universe@691 487 *
universe@691 488 * @param map the map
universe@691 489 * @param key the key
universe@691 490 * @see cxMapRemoveAndGet()
universe@691 491 * @see cxMapDetach()
universe@691 492 */
universe@691 493 __attribute__((__nonnull__))
universe@691 494 static inline void cxMapRemove(
universe@691 495 CxMap *map,
universe@692 496 cxmutstr const &key
universe@692 497 ) {
universe@692 498 (void) map->cl->remove(map, cx_hash_key_cxstr(key), true);
universe@692 499 }
universe@692 500
universe@692 501 /**
universe@692 502 * Removes a key/value-pair from the map by using the key.
universe@692 503 *
universe@692 504 * Always invokes the destructor function, if any, on the removed element.
universe@692 505 * If this map is storing pointers and you just want to retrieve the pointer
universe@692 506 * without invoking the destructor, use cxMapRemoveAndGet().
universe@692 507 * If you just want to detach the element from the map without invoking the
universe@692 508 * destructor or returning the element, use cxMapDetach().
universe@692 509 *
universe@692 510 * @param map the map
universe@692 511 * @param key the key
universe@692 512 * @see cxMapRemoveAndGet()
universe@692 513 * @see cxMapDetach()
universe@692 514 */
universe@692 515 __attribute__((__nonnull__))
universe@692 516 static inline void cxMapRemove(
universe@692 517 CxMap *map,
universe@691 518 char const *key
universe@691 519 ) {
universe@691 520 (void) map->cl->remove(map, cx_hash_key_str(key), true);
universe@691 521 }
universe@691 522
universe@691 523 /**
universe@691 524 * Detaches a key/value-pair from the map by using the key
universe@691 525 * without invoking the destructor.
universe@691 526 *
universe@691 527 * In general, you should only use this function if the map does not own
universe@691 528 * the data and there is a valid reference to the data somewhere else
universe@691 529 * in the program. In all other cases it is preferable to use
universe@691 530 * cxMapRemove() or cxMapRemoveAndGet().
universe@691 531 *
universe@691 532 * @param map the map
universe@691 533 * @param key the key
universe@691 534 * @see cxMapRemove()
universe@691 535 * @see cxMapRemoveAndGet()
universe@691 536 */
universe@691 537 __attribute__((__nonnull__))
universe@691 538 static inline void cxMapDetach(
universe@691 539 CxMap *map,
universe@691 540 CxHashKey const &key
universe@691 541 ) {
universe@691 542 (void) map->cl->remove(map, key, false);
universe@691 543 }
universe@691 544
universe@691 545 /**
universe@691 546 * Detaches a key/value-pair from the map by using the key
universe@691 547 * without invoking the destructor.
universe@691 548 *
universe@691 549 * In general, you should only use this function if the map does not own
universe@691 550 * the data and there is a valid reference to the data somewhere else
universe@691 551 * in the program. In all other cases it is preferable to use
universe@691 552 * cxMapRemove() or cxMapRemoveAndGet().
universe@691 553 *
universe@691 554 * @param map the map
universe@691 555 * @param key the key
universe@691 556 * @see cxMapRemove()
universe@691 557 * @see cxMapRemoveAndGet()
universe@691 558 */
universe@691 559 __attribute__((__nonnull__))
universe@691 560 static inline void cxMapDetach(
universe@691 561 CxMap *map,
universe@691 562 cxstring const &key
universe@691 563 ) {
universe@691 564 (void) map->cl->remove(map, cx_hash_key_cxstr(key), false);
universe@691 565 }
universe@691 566
universe@691 567 /**
universe@691 568 * Detaches a key/value-pair from the map by using the key
universe@691 569 * without invoking the destructor.
universe@691 570 *
universe@691 571 * In general, you should only use this function if the map does not own
universe@691 572 * the data and there is a valid reference to the data somewhere else
universe@691 573 * in the program. In all other cases it is preferable to use
universe@691 574 * cxMapRemove() or cxMapRemoveAndGet().
universe@691 575 *
universe@691 576 * @param map the map
universe@691 577 * @param key the key
universe@691 578 * @see cxMapRemove()
universe@691 579 * @see cxMapRemoveAndGet()
universe@691 580 */
universe@691 581 __attribute__((__nonnull__))
universe@691 582 static inline void cxMapDetach(
universe@691 583 CxMap *map,
universe@692 584 cxmutstr const &key
universe@692 585 ) {
universe@692 586 (void) map->cl->remove(map, cx_hash_key_cxstr(key), false);
universe@692 587 }
universe@692 588
universe@692 589 /**
universe@692 590 * Detaches a key/value-pair from the map by using the key
universe@692 591 * without invoking the destructor.
universe@692 592 *
universe@692 593 * In general, you should only use this function if the map does not own
universe@692 594 * the data and there is a valid reference to the data somewhere else
universe@692 595 * in the program. In all other cases it is preferable to use
universe@692 596 * cxMapRemove() or cxMapRemoveAndGet().
universe@692 597 *
universe@692 598 * @param map the map
universe@692 599 * @param key the key
universe@692 600 * @see cxMapRemove()
universe@692 601 * @see cxMapRemoveAndGet()
universe@692 602 */
universe@692 603 __attribute__((__nonnull__))
universe@692 604 static inline void cxMapDetach(
universe@692 605 CxMap *map,
universe@691 606 char const *key
universe@691 607 ) {
universe@691 608 (void) map->cl->remove(map, cx_hash_key_str(key), false);
universe@691 609 }
universe@691 610
universe@691 611 /**
universe@691 612 * Removes a key/value-pair from the map by using the key.
universe@691 613 *
universe@691 614 * This function can be used when the map is storing pointers,
universe@691 615 * in order to retrieve the pointer from the map without invoking
universe@691 616 * any destructor function. Sometimes you do not want the pointer
universe@691 617 * to be returned - in that case (instead of suppressing the "unused
universe@691 618 * result" warning) you can use cxMapDetach().
universe@691 619 *
universe@691 620 * If this map is not storing pointers, this function behaves like
universe@691 621 * cxMapRemove() and returns \c NULL.
universe@691 622 *
universe@691 623 * @param map the map
universe@691 624 * @param key the key
universe@691 625 * @return the stored pointer or \c NULL if either the key is not present
universe@691 626 * in the map or the map is not storing pointers
universe@691 627 * @see cxMapStorePointers()
universe@691 628 * @see cxMapDetach()
universe@691 629 */
universe@691 630 __attribute__((__nonnull__, __warn_unused_result__))
universe@691 631 static inline void *cxMapRemoveAndGet(
universe@691 632 CxMap *map,
universe@691 633 CxHashKey key
universe@691 634 ) {
universe@691 635 return map->cl->remove(map, key, !map->store_pointer);
universe@691 636 }
universe@691 637
universe@691 638 /**
universe@691 639 * Removes a key/value-pair from the map by using the key.
universe@691 640 *
universe@691 641 * This function can be used when the map is storing pointers,
universe@691 642 * in order to retrieve the pointer from the map without invoking
universe@691 643 * any destructor function. Sometimes you do not want the pointer
universe@691 644 * to be returned - in that case (instead of suppressing the "unused
universe@691 645 * result" warning) you can use cxMapDetach().
universe@691 646 *
universe@691 647 * If this map is not storing pointers, this function behaves like
universe@691 648 * cxMapRemove() and returns \c NULL.
universe@691 649 *
universe@691 650 * @param map the map
universe@691 651 * @param key the key
universe@691 652 * @return the stored pointer or \c NULL if either the key is not present
universe@691 653 * in the map or the map is not storing pointers
universe@691 654 * @see cxMapStorePointers()
universe@691 655 * @see cxMapDetach()
universe@691 656 */
universe@691 657 __attribute__((__nonnull__, __warn_unused_result__))
universe@691 658 static inline void *cxMapRemoveAndGet(
universe@691 659 CxMap *map,
universe@691 660 cxstring key
universe@691 661 ) {
universe@691 662 return map->cl->remove(map, cx_hash_key_cxstr(key), !map->store_pointer);
universe@691 663 }
universe@691 664
universe@691 665 /**
universe@691 666 * Removes a key/value-pair from the map by using the key.
universe@691 667 *
universe@691 668 * This function can be used when the map is storing pointers,
universe@691 669 * in order to retrieve the pointer from the map without invoking
universe@691 670 * any destructor function. Sometimes you do not want the pointer
universe@691 671 * to be returned - in that case (instead of suppressing the "unused
universe@691 672 * result" warning) you can use cxMapDetach().
universe@691 673 *
universe@691 674 * If this map is not storing pointers, this function behaves like
universe@691 675 * cxMapRemove() and returns \c NULL.
universe@691 676 *
universe@691 677 * @param map the map
universe@691 678 * @param key the key
universe@691 679 * @return the stored pointer or \c NULL if either the key is not present
universe@691 680 * in the map or the map is not storing pointers
universe@691 681 * @see cxMapStorePointers()
universe@691 682 * @see cxMapDetach()
universe@691 683 */
universe@691 684 __attribute__((__nonnull__, __warn_unused_result__))
universe@691 685 static inline void *cxMapRemoveAndGet(
universe@691 686 CxMap *map,
universe@692 687 cxmutstr key
universe@692 688 ) {
universe@692 689 return map->cl->remove(map, cx_hash_key_cxstr(key), !map->store_pointer);
universe@692 690 }
universe@692 691
universe@692 692 /**
universe@692 693 * Removes a key/value-pair from the map by using the key.
universe@692 694 *
universe@692 695 * This function can be used when the map is storing pointers,
universe@692 696 * in order to retrieve the pointer from the map without invoking
universe@692 697 * any destructor function. Sometimes you do not want the pointer
universe@692 698 * to be returned - in that case (instead of suppressing the "unused
universe@692 699 * result" warning) you can use cxMapDetach().
universe@692 700 *
universe@692 701 * If this map is not storing pointers, this function behaves like
universe@692 702 * cxMapRemove() and returns \c NULL.
universe@692 703 *
universe@692 704 * @param map the map
universe@692 705 * @param key the key
universe@692 706 * @return the stored pointer or \c NULL if either the key is not present
universe@692 707 * in the map or the map is not storing pointers
universe@692 708 * @see cxMapStorePointers()
universe@692 709 * @see cxMapDetach()
universe@692 710 */
universe@692 711 __attribute__((__nonnull__, __warn_unused_result__))
universe@692 712 static inline void *cxMapRemoveAndGet(
universe@692 713 CxMap *map,
universe@691 714 char const *key
universe@691 715 ) {
universe@691 716 return map->cl->remove(map, cx_hash_key_str(key), !map->store_pointer);
universe@691 717 }
universe@691 718
universe@691 719 #else // __cplusplus
universe@691 720
universe@691 721 /**
universe@691 722 * Puts a key/value-pair into the map.
universe@691 723 *
universe@691 724 * @param map the map
universe@691 725 * @param key the key
universe@691 726 * @param value the value
universe@691 727 * @return 0 on success, non-zero value on failure
universe@691 728 */
universe@691 729 __attribute__((__nonnull__))
universe@691 730 static inline int cx_map_put(
universe@691 731 CxMap *map,
universe@691 732 CxHashKey key,
universe@691 733 void *value
universe@691 734 ) {
universe@691 735 return map->cl->put(map, key, value);
universe@691 736 }
universe@691 737
universe@691 738 /**
universe@691 739 * Puts a key/value-pair into the map.
universe@691 740 *
universe@691 741 * @param map the map
universe@691 742 * @param key the key
universe@691 743 * @param value the value
universe@691 744 * @return 0 on success, non-zero value on failure
universe@691 745 */
universe@691 746 __attribute__((__nonnull__))
universe@691 747 static inline int cx_map_put_cxstr(
universe@691 748 CxMap *map,
universe@691 749 cxstring key,
universe@691 750 void *value
universe@691 751 ) {
universe@691 752 return map->cl->put(map, cx_hash_key_cxstr(key), value);
universe@691 753 }
universe@691 754
universe@691 755 /**
universe@691 756 * Puts a key/value-pair into the map.
universe@691 757 *
universe@691 758 * @param map the map
universe@691 759 * @param key the key
universe@691 760 * @param value the value
universe@691 761 * @return 0 on success, non-zero value on failure
universe@691 762 */
universe@691 763 __attribute__((__nonnull__))
universe@692 764 static inline int cx_map_put_mustr(
universe@692 765 CxMap *map,
universe@692 766 cxmutstr key,
universe@692 767 void *value
universe@692 768 ) {
universe@692 769 return map->cl->put(map, cx_hash_key_cxstr(key), value);
universe@692 770 }
universe@692 771
universe@692 772 /**
universe@692 773 * Puts a key/value-pair into the map.
universe@692 774 *
universe@692 775 * @param map the map
universe@692 776 * @param key the key
universe@692 777 * @param value the value
universe@692 778 * @return 0 on success, non-zero value on failure
universe@692 779 */
universe@692 780 __attribute__((__nonnull__))
universe@691 781 static inline int cx_map_put_str(
universe@691 782 CxMap *map,
universe@691 783 char const *key,
universe@691 784 void *value
universe@691 785 ) {
universe@691 786 return map->cl->put(map, cx_hash_key_str(key), value);
universe@691 787 }
universe@691 788
universe@691 789 /**
universe@691 790 * Puts a key/value-pair into the map.
universe@691 791 *
universe@691 792 * @param map the map
universe@691 793 * @param key the key
universe@691 794 * @param value the value
universe@691 795 * @return 0 on success, non-zero value on failure
universe@691 796 */
universe@691 797 #define cxMapPut(map, key, value) _Generic((key), \
universe@691 798 CxHashKey: cx_map_put, \
universe@691 799 cxstring: cx_map_put_cxstr, \
universe@692 800 cxmutstr: cx_map_put_mustr, \
universe@694 801 char*: cx_map_put_str, \
universe@694 802 char const*: cx_map_put_str) \
universe@691 803 (map, key, value)
universe@691 804
universe@691 805 /**
universe@691 806 * Retrieves a value by using a key.
universe@691 807 *
universe@691 808 * @param map the map
universe@691 809 * @param key the key
universe@691 810 * @return the value
universe@691 811 */
universe@691 812 __attribute__((__nonnull__, __warn_unused_result__))
universe@691 813 static inline void *cx_map_get(
universe@691 814 CxMap const *map,
universe@691 815 CxHashKey key
universe@691 816 ) {
universe@691 817 return map->cl->get(map, key);
universe@691 818 }
universe@691 819
universe@691 820 /**
universe@691 821 * Retrieves a value by using a key.
universe@691 822 *
universe@691 823 * @param map the map
universe@691 824 * @param key the key
universe@691 825 * @return the value
universe@691 826 */
universe@691 827 __attribute__((__nonnull__, __warn_unused_result__))
universe@691 828 static inline void *cx_map_get_cxstr(
universe@691 829 CxMap const *map,
universe@691 830 cxstring key
universe@691 831 ) {
universe@691 832 return map->cl->get(map, cx_hash_key_cxstr(key));
universe@691 833 }
universe@691 834
universe@691 835 /**
universe@691 836 * Retrieves a value by using a key.
universe@691 837 *
universe@691 838 * @param map the map
universe@691 839 * @param key the key
universe@691 840 * @return the value
universe@691 841 */
universe@691 842 __attribute__((__nonnull__, __warn_unused_result__))
universe@692 843 static inline void *cx_map_get_mustr(
universe@692 844 CxMap const *map,
universe@692 845 cxmutstr key
universe@692 846 ) {
universe@692 847 return map->cl->get(map, cx_hash_key_cxstr(key));
universe@692 848 }
universe@692 849
universe@692 850 /**
universe@692 851 * Retrieves a value by using a key.
universe@692 852 *
universe@692 853 * @param map the map
universe@692 854 * @param key the key
universe@692 855 * @return the value
universe@692 856 */
universe@692 857 __attribute__((__nonnull__, __warn_unused_result__))
universe@691 858 static inline void *cx_map_get_str(
universe@691 859 CxMap const *map,
universe@691 860 char const *key
universe@691 861 ) {
universe@691 862 return map->cl->get(map, cx_hash_key_str(key));
universe@691 863 }
universe@691 864
universe@691 865 /**
universe@691 866 * Retrieves a value by using a key.
universe@691 867 *
universe@691 868 * @param map the map
universe@691 869 * @param key the key
universe@691 870 * @return the value
universe@691 871 */
universe@691 872 #define cxMapGet(map, key) _Generic((key), \
universe@691 873 CxHashKey: cx_map_get, \
universe@691 874 cxstring: cx_map_get_cxstr, \
universe@692 875 cxmutstr: cx_map_get_mustr, \
universe@694 876 char*: cx_map_get_str, \
universe@694 877 char const*: cx_map_get_str) \
universe@691 878 (map, key)
universe@691 879
universe@691 880 /**
universe@691 881 * Removes a key/value-pair from the map by using the key.
universe@691 882 *
universe@691 883 * @param map the map
universe@691 884 * @param key the key
universe@691 885 */
universe@691 886 __attribute__((__nonnull__))
universe@691 887 static inline void cx_map_remove(
universe@691 888 CxMap *map,
universe@691 889 CxHashKey key
universe@691 890 ) {
universe@691 891 (void) map->cl->remove(map, key, true);
universe@691 892 }
universe@691 893
universe@691 894 /**
universe@691 895 * Removes a key/value-pair from the map by using the key.
universe@691 896 *
universe@691 897 * @param map the map
universe@691 898 * @param key the key
universe@691 899 */
universe@691 900 __attribute__((__nonnull__))
universe@691 901 static inline void cx_map_remove_cxstr(
universe@691 902 CxMap *map,
universe@691 903 cxstring key
universe@691 904 ) {
universe@691 905 (void) map->cl->remove(map, cx_hash_key_cxstr(key), true);
universe@691 906 }
universe@691 907
universe@691 908 /**
universe@691 909 * Removes a key/value-pair from the map by using the key.
universe@691 910 *
universe@691 911 * @param map the map
universe@691 912 * @param key the key
universe@691 913 */
universe@691 914 __attribute__((__nonnull__))
universe@692 915 static inline void cx_map_remove_mustr(
universe@692 916 CxMap *map,
universe@692 917 cxmutstr key
universe@692 918 ) {
universe@692 919 (void) map->cl->remove(map, cx_hash_key_cxstr(key), true);
universe@692 920 }
universe@692 921
universe@692 922 /**
universe@692 923 * Removes a key/value-pair from the map by using the key.
universe@692 924 *
universe@692 925 * @param map the map
universe@692 926 * @param key the key
universe@692 927 */
universe@692 928 __attribute__((__nonnull__))
universe@691 929 static inline void cx_map_remove_str(
universe@691 930 CxMap *map,
universe@691 931 char const *key
universe@691 932 ) {
universe@691 933 (void) map->cl->remove(map, cx_hash_key_str(key), true);
universe@691 934 }
universe@691 935
universe@691 936 /**
universe@691 937 * Removes a key/value-pair from the map by using the key.
universe@691 938 *
universe@691 939 * Always invokes the destructor function, if any, on the removed element.
universe@691 940 * If this map is storing pointers and you just want to retrieve the pointer
universe@691 941 * without invoking the destructor, use cxMapRemoveAndGet().
universe@691 942 * If you just want to detach the element from the map without invoking the
universe@691 943 * destructor or returning the element, use cxMapDetach().
universe@691 944 *
universe@691 945 * @param map the map
universe@691 946 * @param key the key
universe@691 947 * @see cxMapRemoveAndGet()
universe@691 948 * @see cxMapDetach()
universe@691 949 */
universe@691 950 #define cxMapRemove(map, key) _Generic((key), \
universe@691 951 CxHashKey: cx_map_remove, \
universe@691 952 cxstring: cx_map_remove_cxstr, \
universe@692 953 cxmutstr: cx_map_remove_mustr, \
universe@694 954 char*: cx_map_remove_str, \
universe@694 955 char const*: cx_map_remove_str) \
universe@691 956 (map, key)
universe@691 957
universe@691 958 /**
universe@691 959 * Detaches a key/value-pair from the map by using the key
universe@691 960 * without invoking the destructor.
universe@691 961 *
universe@691 962 * @param map the map
universe@691 963 * @param key the key
universe@691 964 */
universe@691 965 __attribute__((__nonnull__))
universe@691 966 static inline void cx_map_detach(
universe@691 967 CxMap *map,
universe@691 968 CxHashKey key
universe@691 969 ) {
universe@691 970 (void) map->cl->remove(map, key, false);
universe@691 971 }
universe@691 972
universe@691 973 /**
universe@691 974 * Detaches a key/value-pair from the map by using the key
universe@691 975 * without invoking the destructor.
universe@691 976 *
universe@691 977 * @param map the map
universe@691 978 * @param key the key
universe@691 979 */
universe@691 980 __attribute__((__nonnull__))
universe@691 981 static inline void cx_map_detach_cxstr(
universe@691 982 CxMap *map,
universe@691 983 cxstring key
universe@691 984 ) {
universe@691 985 (void) map->cl->remove(map, cx_hash_key_cxstr(key), false);
universe@691 986 }
universe@691 987
universe@691 988 /**
universe@691 989 * Detaches a key/value-pair from the map by using the key
universe@691 990 * without invoking the destructor.
universe@691 991 *
universe@691 992 * @param map the map
universe@691 993 * @param key the key
universe@691 994 */
universe@691 995 __attribute__((__nonnull__))
universe@692 996 static inline void cx_map_detach_mustr(
universe@692 997 CxMap *map,
universe@692 998 cxmutstr key
universe@692 999 ) {
universe@692 1000 (void) map->cl->remove(map, cx_hash_key_cxstr(key), false);
universe@692 1001 }
universe@692 1002
universe@692 1003 /**
universe@692 1004 * Detaches a key/value-pair from the map by using the key
universe@692 1005 * without invoking the destructor.
universe@692 1006 *
universe@692 1007 * @param map the map
universe@692 1008 * @param key the key
universe@692 1009 */
universe@692 1010 __attribute__((__nonnull__))
universe@691 1011 static inline void cx_map_detach_str(
universe@691 1012 CxMap *map,
universe@691 1013 char const *key
universe@691 1014 ) {
universe@691 1015 (void) map->cl->remove(map, cx_hash_key_str(key), false);
universe@691 1016 }
universe@691 1017
universe@691 1018 /**
universe@691 1019 * Detaches a key/value-pair from the map by using the key
universe@691 1020 * without invoking the destructor.
universe@691 1021 *
universe@691 1022 * In general, you should only use this function if the map does not own
universe@691 1023 * the data and there is a valid reference to the data somewhere else
universe@691 1024 * in the program. In all other cases it is preferable to use
universe@691 1025 * cxMapRemove() or cxMapRemoveAndGet().
universe@691 1026 *
universe@691 1027 * @param map the map
universe@691 1028 * @param key the key
universe@691 1029 * @see cxMapRemove()
universe@691 1030 * @see cxMapRemoveAndGet()
universe@691 1031 */
universe@691 1032 #define cxMapDetach(map, key) _Generic((key), \
universe@691 1033 CxHashKey: cx_map_detach, \
universe@691 1034 cxstring: cx_map_detach_cxstr, \
universe@692 1035 cxmutstr: cx_map_detach_mustr, \
universe@694 1036 char*: cx_map_detach_str, \
universe@694 1037 char const*: cx_map_detach_str) \
universe@691 1038 (map, key)
universe@691 1039
universe@691 1040 /**
universe@691 1041 * Removes a key/value-pair from the map by using the key.
universe@691 1042 *
universe@691 1043 * @param map the map
universe@691 1044 * @param key the key
universe@691 1045 * @return the stored pointer or \c NULL if either the key is not present
universe@691 1046 * in the map or the map is not storing pointers
universe@691 1047 */
universe@691 1048 __attribute__((__nonnull__, __warn_unused_result__))
universe@691 1049 static inline void *cx_map_remove_and_get(
universe@691 1050 CxMap *map,
universe@691 1051 CxHashKey key
universe@691 1052 ) {
universe@691 1053 return map->cl->remove(map, key, !map->store_pointer);
universe@691 1054 }
universe@691 1055
universe@691 1056 /**
universe@691 1057 * Removes a key/value-pair from the map by using the key.
universe@691 1058 *
universe@691 1059 * @param map the map
universe@691 1060 * @param key the key
universe@691 1061 * @return the stored pointer or \c NULL if either the key is not present
universe@691 1062 * in the map or the map is not storing pointers
universe@691 1063 */
universe@691 1064 __attribute__((__nonnull__, __warn_unused_result__))
universe@691 1065 static inline void *cx_map_remove_and_get_cxstr(
universe@691 1066 CxMap *map,
universe@691 1067 cxstring key
universe@691 1068 ) {
universe@691 1069 return map->cl->remove(map, cx_hash_key_cxstr(key), !map->store_pointer);
universe@691 1070 }
universe@691 1071
universe@691 1072 /**
universe@691 1073 * Removes a key/value-pair from the map by using the key.
universe@691 1074 *
universe@691 1075 * @param map the map
universe@691 1076 * @param key the key
universe@691 1077 * @return the stored pointer or \c NULL if either the key is not present
universe@691 1078 * in the map or the map is not storing pointers
universe@691 1079 */
universe@691 1080 __attribute__((__nonnull__, __warn_unused_result__))
universe@692 1081 static inline void *cx_map_remove_and_get_mustr(
universe@692 1082 CxMap *map,
universe@692 1083 cxmutstr key
universe@692 1084 ) {
universe@692 1085 return map->cl->remove(map, cx_hash_key_cxstr(key), !map->store_pointer);
universe@692 1086 }
universe@692 1087
universe@692 1088 /**
universe@692 1089 * Removes a key/value-pair from the map by using the key.
universe@692 1090 *
universe@692 1091 * @param map the map
universe@692 1092 * @param key the key
universe@692 1093 * @return the stored pointer or \c NULL if either the key is not present
universe@692 1094 * in the map or the map is not storing pointers
universe@692 1095 */
universe@692 1096 __attribute__((__nonnull__, __warn_unused_result__))
universe@691 1097 static inline void *cx_map_remove_and_get_str(
universe@691 1098 CxMap *map,
universe@691 1099 char const *key
universe@691 1100 ) {
universe@691 1101 return map->cl->remove(map, cx_hash_key_str(key), !map->store_pointer);
universe@691 1102 }
universe@691 1103
universe@691 1104 /**
universe@691 1105 * Removes a key/value-pair from the map by using the key.
universe@691 1106 *
universe@691 1107 * This function can be used when the map is storing pointers,
universe@691 1108 * in order to retrieve the pointer from the map without invoking
universe@691 1109 * any destructor function. Sometimes you do not want the pointer
universe@691 1110 * to be returned - in that case (instead of suppressing the "unused
universe@691 1111 * result" warning) you can use cxMapDetach().
universe@691 1112 *
universe@691 1113 * If this map is not storing pointers, this function behaves like
universe@691 1114 * cxMapRemove() and returns \c NULL.
universe@691 1115 *
universe@691 1116 * @param map the map
universe@691 1117 * @param key the key
universe@691 1118 * @return the stored pointer or \c NULL if either the key is not present
universe@691 1119 * in the map or the map is not storing pointers
universe@691 1120 * @see cxMapStorePointers()
universe@691 1121 * @see cxMapDetach()
universe@691 1122 */
universe@691 1123 #define cxMapRemoveAndGet(map, key) _Generic((key), \
universe@691 1124 CxHashKey: cx_map_remove_and_get, \
universe@691 1125 cxstring: cx_map_remove_and_get_cxstr, \
universe@692 1126 cxmutstr: cx_map_remove_and_get_mustr, \
universe@694 1127 char*: cx_map_remove_and_get_str, \
universe@694 1128 char const*: cx_map_remove_and_get_str) \
universe@691 1129 (map, key)
universe@691 1130
universe@691 1131 #endif // __cplusplus
universe@691 1132
universe@691 1133 #endif // UCX_MAP_H

mercurial