359 * @return 0 on success, non-zero value on failure |
359 * @return 0 on success, non-zero value on failure |
360 */ |
360 */ |
361 __attribute__((__nonnull__)) |
361 __attribute__((__nonnull__)) |
362 static inline int cxMapPut( |
362 static inline int cxMapPut( |
363 CxMap *map, |
363 CxMap *map, |
|
364 cxmutstr const &key, |
|
365 void *value |
|
366 ) { |
|
367 return map->cl->put(map, cx_hash_key_cxstr(key), value); |
|
368 } |
|
369 |
|
370 /** |
|
371 * Puts a key/value-pair into the map. |
|
372 * |
|
373 * @param map the map |
|
374 * @param key the key |
|
375 * @param value the value |
|
376 * @return 0 on success, non-zero value on failure |
|
377 */ |
|
378 __attribute__((__nonnull__)) |
|
379 static inline int cxMapPut( |
|
380 CxMap *map, |
364 char const *key, |
381 char const *key, |
365 void *value |
382 void *value |
366 ) { |
383 ) { |
367 return map->cl->put(map, cx_hash_key_str(key), value); |
384 return map->cl->put(map, cx_hash_key_str(key), value); |
368 } |
385 } |
391 */ |
408 */ |
392 __attribute__((__nonnull__, __warn_unused_result__)) |
409 __attribute__((__nonnull__, __warn_unused_result__)) |
393 static inline void *cxMapGet( |
410 static inline void *cxMapGet( |
394 CxMap const *map, |
411 CxMap const *map, |
395 cxstring const &key |
412 cxstring const &key |
|
413 ) { |
|
414 return map->cl->get(map, cx_hash_key_cxstr(key)); |
|
415 } |
|
416 |
|
417 /** |
|
418 * Retrieves a value by using a key. |
|
419 * |
|
420 * @param map the map |
|
421 * @param key the key |
|
422 * @return the value |
|
423 */ |
|
424 __attribute__((__nonnull__, __warn_unused_result__)) |
|
425 static inline void *cxMapGet( |
|
426 CxMap const *map, |
|
427 cxmutstr const &key |
396 ) { |
428 ) { |
397 return map->cl->get(map, cx_hash_key_cxstr(key)); |
429 return map->cl->get(map, cx_hash_key_cxstr(key)); |
398 } |
430 } |
399 |
431 |
400 /** |
432 /** |
471 * @see cxMapDetach() |
503 * @see cxMapDetach() |
472 */ |
504 */ |
473 __attribute__((__nonnull__)) |
505 __attribute__((__nonnull__)) |
474 static inline void cxMapRemove( |
506 static inline void cxMapRemove( |
475 CxMap *map, |
507 CxMap *map, |
|
508 cxmutstr const &key |
|
509 ) { |
|
510 (void) map->cl->remove(map, cx_hash_key_cxstr(key), true); |
|
511 } |
|
512 |
|
513 /** |
|
514 * Removes a key/value-pair from the map by using the key. |
|
515 * |
|
516 * Always invokes the destructor function, if any, on the removed element. |
|
517 * If this map is storing pointers and you just want to retrieve the pointer |
|
518 * without invoking the destructor, use cxMapRemoveAndGet(). |
|
519 * If you just want to detach the element from the map without invoking the |
|
520 * destructor or returning the element, use cxMapDetach(). |
|
521 * |
|
522 * @param map the map |
|
523 * @param key the key |
|
524 * @see cxMapRemoveAndGet() |
|
525 * @see cxMapDetach() |
|
526 */ |
|
527 __attribute__((__nonnull__)) |
|
528 static inline void cxMapRemove( |
|
529 CxMap *map, |
476 char const *key |
530 char const *key |
477 ) { |
531 ) { |
478 (void) map->cl->remove(map, cx_hash_key_str(key), true); |
532 (void) map->cl->remove(map, cx_hash_key_str(key), true); |
479 } |
533 } |
480 |
534 |
516 */ |
570 */ |
517 __attribute__((__nonnull__)) |
571 __attribute__((__nonnull__)) |
518 static inline void cxMapDetach( |
572 static inline void cxMapDetach( |
519 CxMap *map, |
573 CxMap *map, |
520 cxstring const &key |
574 cxstring const &key |
|
575 ) { |
|
576 (void) map->cl->remove(map, cx_hash_key_cxstr(key), false); |
|
577 } |
|
578 |
|
579 /** |
|
580 * Detaches a key/value-pair from the map by using the key |
|
581 * without invoking the destructor. |
|
582 * |
|
583 * In general, you should only use this function if the map does not own |
|
584 * the data and there is a valid reference to the data somewhere else |
|
585 * in the program. In all other cases it is preferable to use |
|
586 * cxMapRemove() or cxMapRemoveAndGet(). |
|
587 * |
|
588 * @param map the map |
|
589 * @param key the key |
|
590 * @see cxMapRemove() |
|
591 * @see cxMapRemoveAndGet() |
|
592 */ |
|
593 __attribute__((__nonnull__)) |
|
594 static inline void cxMapDetach( |
|
595 CxMap *map, |
|
596 cxmutstr const &key |
521 ) { |
597 ) { |
522 (void) map->cl->remove(map, cx_hash_key_cxstr(key), false); |
598 (void) map->cl->remove(map, cx_hash_key_cxstr(key), false); |
523 } |
599 } |
524 |
600 |
525 /** |
601 /** |
618 * @see cxMapDetach() |
694 * @see cxMapDetach() |
619 */ |
695 */ |
620 __attribute__((__nonnull__, __warn_unused_result__)) |
696 __attribute__((__nonnull__, __warn_unused_result__)) |
621 static inline void *cxMapRemoveAndGet( |
697 static inline void *cxMapRemoveAndGet( |
622 CxMap *map, |
698 CxMap *map, |
|
699 cxmutstr key |
|
700 ) { |
|
701 return map->cl->remove(map, cx_hash_key_cxstr(key), !map->store_pointer); |
|
702 } |
|
703 |
|
704 /** |
|
705 * Removes a key/value-pair from the map by using the key. |
|
706 * |
|
707 * This function can be used when the map is storing pointers, |
|
708 * in order to retrieve the pointer from the map without invoking |
|
709 * any destructor function. Sometimes you do not want the pointer |
|
710 * to be returned - in that case (instead of suppressing the "unused |
|
711 * result" warning) you can use cxMapDetach(). |
|
712 * |
|
713 * If this map is not storing pointers, this function behaves like |
|
714 * cxMapRemove() and returns \c NULL. |
|
715 * |
|
716 * @param map the map |
|
717 * @param key the key |
|
718 * @return the stored pointer or \c NULL if either the key is not present |
|
719 * in the map or the map is not storing pointers |
|
720 * @see cxMapStorePointers() |
|
721 * @see cxMapDetach() |
|
722 */ |
|
723 __attribute__((__nonnull__, __warn_unused_result__)) |
|
724 static inline void *cxMapRemoveAndGet( |
|
725 CxMap *map, |
623 char const *key |
726 char const *key |
624 ) { |
727 ) { |
625 return map->cl->remove(map, cx_hash_key_str(key), !map->store_pointer); |
728 return map->cl->remove(map, cx_hash_key_str(key), !map->store_pointer); |
626 } |
729 } |
627 |
730 |
654 */ |
757 */ |
655 __attribute__((__nonnull__)) |
758 __attribute__((__nonnull__)) |
656 static inline int cx_map_put_cxstr( |
759 static inline int cx_map_put_cxstr( |
657 CxMap *map, |
760 CxMap *map, |
658 cxstring key, |
761 cxstring key, |
|
762 void *value |
|
763 ) { |
|
764 return map->cl->put(map, cx_hash_key_cxstr(key), value); |
|
765 } |
|
766 |
|
767 /** |
|
768 * Puts a key/value-pair into the map. |
|
769 * |
|
770 * @param map the map |
|
771 * @param key the key |
|
772 * @param value the value |
|
773 * @return 0 on success, non-zero value on failure |
|
774 */ |
|
775 __attribute__((__nonnull__)) |
|
776 static inline int cx_map_put_mustr( |
|
777 CxMap *map, |
|
778 cxmutstr key, |
659 void *value |
779 void *value |
660 ) { |
780 ) { |
661 return map->cl->put(map, cx_hash_key_cxstr(key), value); |
781 return map->cl->put(map, cx_hash_key_cxstr(key), value); |
662 } |
782 } |
663 |
783 |
687 * @return 0 on success, non-zero value on failure |
807 * @return 0 on success, non-zero value on failure |
688 */ |
808 */ |
689 #define cxMapPut(map, key, value) _Generic((key), \ |
809 #define cxMapPut(map, key, value) _Generic((key), \ |
690 CxHashKey: cx_map_put, \ |
810 CxHashKey: cx_map_put, \ |
691 cxstring: cx_map_put_cxstr, \ |
811 cxstring: cx_map_put_cxstr, \ |
|
812 cxmutstr: cx_map_put_mustr, \ |
692 char*: cx_map_put_str) \ |
813 char*: cx_map_put_str) \ |
693 (map, key, value) |
814 (map, key, value) |
694 |
815 |
695 /** |
816 /** |
696 * Retrieves a value by using a key. |
817 * Retrieves a value by using a key. |
728 * @param map the map |
849 * @param map the map |
729 * @param key the key |
850 * @param key the key |
730 * @return the value |
851 * @return the value |
731 */ |
852 */ |
732 __attribute__((__nonnull__, __warn_unused_result__)) |
853 __attribute__((__nonnull__, __warn_unused_result__)) |
|
854 static inline void *cx_map_get_mustr( |
|
855 CxMap const *map, |
|
856 cxmutstr key |
|
857 ) { |
|
858 return map->cl->get(map, cx_hash_key_cxstr(key)); |
|
859 } |
|
860 |
|
861 /** |
|
862 * Retrieves a value by using a key. |
|
863 * |
|
864 * @param map the map |
|
865 * @param key the key |
|
866 * @return the value |
|
867 */ |
|
868 __attribute__((__nonnull__, __warn_unused_result__)) |
733 static inline void *cx_map_get_str( |
869 static inline void *cx_map_get_str( |
734 CxMap const *map, |
870 CxMap const *map, |
735 char const *key |
871 char const *key |
736 ) { |
872 ) { |
737 return map->cl->get(map, cx_hash_key_str(key)); |
873 return map->cl->get(map, cx_hash_key_str(key)); |
745 * @return the value |
881 * @return the value |
746 */ |
882 */ |
747 #define cxMapGet(map, key) _Generic((key), \ |
883 #define cxMapGet(map, key) _Generic((key), \ |
748 CxHashKey: cx_map_get, \ |
884 CxHashKey: cx_map_get, \ |
749 cxstring: cx_map_get_cxstr, \ |
885 cxstring: cx_map_get_cxstr, \ |
|
886 cxmutstr: cx_map_get_mustr, \ |
750 char*: cx_map_get_str) \ |
887 char*: cx_map_get_str) \ |
751 (map, key) |
888 (map, key) |
752 |
889 |
753 /** |
890 /** |
754 * Removes a key/value-pair from the map by using the key. |
891 * Removes a key/value-pair from the map by using the key. |
772 */ |
909 */ |
773 __attribute__((__nonnull__)) |
910 __attribute__((__nonnull__)) |
774 static inline void cx_map_remove_cxstr( |
911 static inline void cx_map_remove_cxstr( |
775 CxMap *map, |
912 CxMap *map, |
776 cxstring key |
913 cxstring key |
|
914 ) { |
|
915 (void) map->cl->remove(map, cx_hash_key_cxstr(key), true); |
|
916 } |
|
917 |
|
918 /** |
|
919 * Removes a key/value-pair from the map by using the key. |
|
920 * |
|
921 * @param map the map |
|
922 * @param key the key |
|
923 */ |
|
924 __attribute__((__nonnull__)) |
|
925 static inline void cx_map_remove_mustr( |
|
926 CxMap *map, |
|
927 cxmutstr key |
777 ) { |
928 ) { |
778 (void) map->cl->remove(map, cx_hash_key_cxstr(key), true); |
929 (void) map->cl->remove(map, cx_hash_key_cxstr(key), true); |
779 } |
930 } |
780 |
931 |
781 /** |
932 /** |
807 * @see cxMapDetach() |
958 * @see cxMapDetach() |
808 */ |
959 */ |
809 #define cxMapRemove(map, key) _Generic((key), \ |
960 #define cxMapRemove(map, key) _Generic((key), \ |
810 CxHashKey: cx_map_remove, \ |
961 CxHashKey: cx_map_remove, \ |
811 cxstring: cx_map_remove_cxstr, \ |
962 cxstring: cx_map_remove_cxstr, \ |
|
963 cxmutstr: cx_map_remove_mustr, \ |
812 char*: cx_map_remove_str) \ |
964 char*: cx_map_remove_str) \ |
813 (map, key) |
965 (map, key) |
814 |
966 |
815 /** |
967 /** |
816 * Detaches a key/value-pair from the map by using the key |
968 * Detaches a key/value-pair from the map by using the key |
836 */ |
988 */ |
837 __attribute__((__nonnull__)) |
989 __attribute__((__nonnull__)) |
838 static inline void cx_map_detach_cxstr( |
990 static inline void cx_map_detach_cxstr( |
839 CxMap *map, |
991 CxMap *map, |
840 cxstring key |
992 cxstring key |
|
993 ) { |
|
994 (void) map->cl->remove(map, cx_hash_key_cxstr(key), false); |
|
995 } |
|
996 |
|
997 /** |
|
998 * Detaches a key/value-pair from the map by using the key |
|
999 * without invoking the destructor. |
|
1000 * |
|
1001 * @param map the map |
|
1002 * @param key the key |
|
1003 */ |
|
1004 __attribute__((__nonnull__)) |
|
1005 static inline void cx_map_detach_mustr( |
|
1006 CxMap *map, |
|
1007 cxmutstr key |
841 ) { |
1008 ) { |
842 (void) map->cl->remove(map, cx_hash_key_cxstr(key), false); |
1009 (void) map->cl->remove(map, cx_hash_key_cxstr(key), false); |
843 } |
1010 } |
844 |
1011 |
845 /** |
1012 /** |
872 * @see cxMapRemoveAndGet() |
1039 * @see cxMapRemoveAndGet() |
873 */ |
1040 */ |
874 #define cxMapDetach(map, key) _Generic((key), \ |
1041 #define cxMapDetach(map, key) _Generic((key), \ |
875 CxHashKey: cx_map_detach, \ |
1042 CxHashKey: cx_map_detach, \ |
876 cxstring: cx_map_detach_cxstr, \ |
1043 cxstring: cx_map_detach_cxstr, \ |
|
1044 cxmutstr: cx_map_detach_mustr, \ |
877 char*: cx_map_detach_str) \ |
1045 char*: cx_map_detach_str) \ |
878 (map, key) |
1046 (map, key) |
879 |
1047 |
880 /** |
1048 /** |
881 * Removes a key/value-pair from the map by using the key. |
1049 * Removes a key/value-pair from the map by using the key. |
903 */ |
1071 */ |
904 __attribute__((__nonnull__, __warn_unused_result__)) |
1072 __attribute__((__nonnull__, __warn_unused_result__)) |
905 static inline void *cx_map_remove_and_get_cxstr( |
1073 static inline void *cx_map_remove_and_get_cxstr( |
906 CxMap *map, |
1074 CxMap *map, |
907 cxstring key |
1075 cxstring key |
|
1076 ) { |
|
1077 return map->cl->remove(map, cx_hash_key_cxstr(key), !map->store_pointer); |
|
1078 } |
|
1079 |
|
1080 /** |
|
1081 * Removes a key/value-pair from the map by using the key. |
|
1082 * |
|
1083 * @param map the map |
|
1084 * @param key the key |
|
1085 * @return the stored pointer or \c NULL if either the key is not present |
|
1086 * in the map or the map is not storing pointers |
|
1087 */ |
|
1088 __attribute__((__nonnull__, __warn_unused_result__)) |
|
1089 static inline void *cx_map_remove_and_get_mustr( |
|
1090 CxMap *map, |
|
1091 cxmutstr key |
908 ) { |
1092 ) { |
909 return map->cl->remove(map, cx_hash_key_cxstr(key), !map->store_pointer); |
1093 return map->cl->remove(map, cx_hash_key_cxstr(key), !map->store_pointer); |
910 } |
1094 } |
911 |
1095 |
912 /** |
1096 /** |
945 * @see cxMapDetach() |
1129 * @see cxMapDetach() |
946 */ |
1130 */ |
947 #define cxMapRemoveAndGet(map, key) _Generic((key), \ |
1131 #define cxMapRemoveAndGet(map, key) _Generic((key), \ |
948 CxHashKey: cx_map_remove_and_get, \ |
1132 CxHashKey: cx_map_remove_and_get, \ |
949 cxstring: cx_map_remove_and_get_cxstr, \ |
1133 cxstring: cx_map_remove_and_get_cxstr, \ |
|
1134 cxmutstr: cx_map_remove_and_get_mustr, \ |
950 char*: cx_map_remove_and_get_str) \ |
1135 char*: cx_map_remove_and_get_str) \ |
951 (map, key) |
1136 (map, key) |
952 |
1137 |
953 #endif // __cplusplus |
1138 #endif // __cplusplus |
954 |
1139 |