add cxmutstr to the map generics

Fri, 21 Apr 2023 20:17:09 +0200

author
Mike Becker <universe@uap-core.de>
date
Fri, 21 Apr 2023 20:17:09 +0200
changeset 692
6ac92936cd44
parent 691
65baf7f45ac8
child 693
494d9b20b99e

add cxmutstr to the map generics

src/cx/map.h file | annotate | diff | comparison | revisions
tests/test_map_generics.c file | annotate | diff | comparison | revisions
--- a/src/cx/map.h	Fri Apr 21 19:50:43 2023 +0200
+++ b/src/cx/map.h	Fri Apr 21 20:17:09 2023 +0200
@@ -361,6 +361,23 @@
 __attribute__((__nonnull__))
 static inline int cxMapPut(
         CxMap *map,
+        cxmutstr const &key,
+        void *value
+) {
+    return map->cl->put(map, cx_hash_key_cxstr(key), value);
+}
+
+/**
+ * Puts a key/value-pair into the map.
+ *
+ * @param map the map
+ * @param key the key
+ * @param value the value
+ * @return 0 on success, non-zero value on failure
+ */
+__attribute__((__nonnull__))
+static inline int cxMapPut(
+        CxMap *map,
         char const *key,
         void *value
 ) {
@@ -407,6 +424,21 @@
 __attribute__((__nonnull__, __warn_unused_result__))
 static inline void *cxMapGet(
         CxMap const *map,
+        cxmutstr const &key
+) {
+    return map->cl->get(map, cx_hash_key_cxstr(key));
+}
+
+/**
+ * Retrieves a value by using a key.
+ *
+ * @param map the map
+ * @param key the key
+ * @return the value
+ */
+__attribute__((__nonnull__, __warn_unused_result__))
+static inline void *cxMapGet(
+        CxMap const *map,
         char const *key
 ) {
     return map->cl->get(map, cx_hash_key_str(key));
@@ -473,6 +505,28 @@
 __attribute__((__nonnull__))
 static inline void cxMapRemove(
         CxMap *map,
+        cxmutstr const &key
+) {
+    (void) map->cl->remove(map, cx_hash_key_cxstr(key), true);
+}
+
+/**
+ * Removes a key/value-pair from the map by using the key.
+ *
+ * Always invokes the destructor function, if any, on the removed element.
+ * If this map is storing pointers and you just want to retrieve the pointer
+ * without invoking the destructor, use cxMapRemoveAndGet().
+ * If you just want to detach the element from the map without invoking the
+ * destructor or returning the element, use cxMapDetach().
+ *
+ * @param map the map
+ * @param key the key
+ * @see cxMapRemoveAndGet()
+ * @see cxMapDetach()
+ */
+__attribute__((__nonnull__))
+static inline void cxMapRemove(
+        CxMap *map,
         char const *key
 ) {
     (void) map->cl->remove(map, cx_hash_key_str(key), true);
@@ -539,6 +593,28 @@
 __attribute__((__nonnull__))
 static inline void cxMapDetach(
         CxMap *map,
+        cxmutstr const &key
+) {
+    (void) map->cl->remove(map, cx_hash_key_cxstr(key), false);
+}
+
+/**
+ * Detaches a key/value-pair from the map by using the key
+ * without invoking the destructor.
+ *
+ * In general, you should only use this function if the map does not own
+ * the data and there is a valid reference to the data somewhere else
+ * in the program. In all other cases it is preferable to use
+ * cxMapRemove() or cxMapRemoveAndGet().
+ *
+ * @param map the map
+ * @param key the key
+ * @see cxMapRemove()
+ * @see cxMapRemoveAndGet()
+ */
+__attribute__((__nonnull__))
+static inline void cxMapDetach(
+        CxMap *map,
         char const *key
 ) {
     (void) map->cl->remove(map, cx_hash_key_str(key), false);
@@ -620,6 +696,33 @@
 __attribute__((__nonnull__, __warn_unused_result__))
 static inline void *cxMapRemoveAndGet(
         CxMap *map,
+        cxmutstr key
+) {
+    return map->cl->remove(map, cx_hash_key_cxstr(key), !map->store_pointer);
+}
+
+/**
+ * Removes a key/value-pair from the map by using the key.
+ *
+ * This function can be used when the map is storing pointers,
+ * in order to retrieve the pointer from the map without invoking
+ * any destructor function. Sometimes you do not want the pointer
+ * to be returned - in that case (instead of suppressing the "unused
+ * result" warning) you can use cxMapDetach().
+ *
+ * If this map is not storing pointers, this function behaves like
+ * cxMapRemove() and returns \c NULL.
+ *
+ * @param map the map
+ * @param key the key
+ * @return the stored pointer or \c NULL if either the key is not present
+ * in the map or the map is not storing pointers
+ * @see cxMapStorePointers()
+ * @see cxMapDetach()
+ */
+__attribute__((__nonnull__, __warn_unused_result__))
+static inline void *cxMapRemoveAndGet(
+        CxMap *map,
         char const *key
 ) {
     return map->cl->remove(map, cx_hash_key_str(key), !map->store_pointer);
@@ -670,6 +773,23 @@
  * @return 0 on success, non-zero value on failure
  */
 __attribute__((__nonnull__))
+static inline int cx_map_put_mustr(
+        CxMap *map,
+        cxmutstr key,
+        void *value
+) {
+    return map->cl->put(map, cx_hash_key_cxstr(key), value);
+}
+
+/**
+ * Puts a key/value-pair into the map.
+ *
+ * @param map the map
+ * @param key the key
+ * @param value the value
+ * @return 0 on success, non-zero value on failure
+ */
+__attribute__((__nonnull__))
 static inline int cx_map_put_str(
         CxMap *map,
         char const *key,
@@ -689,6 +809,7 @@
 #define cxMapPut(map, key, value) _Generic((key), \
     CxHashKey: cx_map_put,                        \
     cxstring: cx_map_put_cxstr,                   \
+    cxmutstr: cx_map_put_mustr,                   \
     char*: cx_map_put_str)                        \
     (map, key, value)
 
@@ -730,6 +851,21 @@
  * @return the value
  */
 __attribute__((__nonnull__, __warn_unused_result__))
+static inline void *cx_map_get_mustr(
+        CxMap const *map,
+        cxmutstr key
+) {
+    return map->cl->get(map, cx_hash_key_cxstr(key));
+}
+
+/**
+ * Retrieves a value by using a key.
+ *
+ * @param map the map
+ * @param key the key
+ * @return the value
+ */
+__attribute__((__nonnull__, __warn_unused_result__))
 static inline void *cx_map_get_str(
         CxMap const *map,
         char const *key
@@ -747,6 +883,7 @@
 #define cxMapGet(map, key) _Generic((key), \
     CxHashKey: cx_map_get,                 \
     cxstring: cx_map_get_cxstr,            \
+    cxmutstr: cx_map_get_mustr,            \
     char*: cx_map_get_str)                 \
     (map, key)
 
@@ -785,6 +922,20 @@
  * @param key the key
  */
 __attribute__((__nonnull__))
+static inline void cx_map_remove_mustr(
+        CxMap *map,
+        cxmutstr key
+) {
+    (void) map->cl->remove(map, cx_hash_key_cxstr(key), true);
+}
+
+/**
+ * Removes a key/value-pair from the map by using the key.
+ *
+ * @param map the map
+ * @param key the key
+ */
+__attribute__((__nonnull__))
 static inline void cx_map_remove_str(
         CxMap *map,
         char const *key
@@ -809,6 +960,7 @@
 #define cxMapRemove(map, key) _Generic((key), \
     CxHashKey: cx_map_remove,                 \
     cxstring: cx_map_remove_cxstr,            \
+    cxmutstr: cx_map_remove_mustr,            \
     char*: cx_map_remove_str)                 \
     (map, key)
 
@@ -850,6 +1002,21 @@
  * @param key the key
  */
 __attribute__((__nonnull__))
+static inline void cx_map_detach_mustr(
+        CxMap *map,
+        cxmutstr key
+) {
+    (void) map->cl->remove(map, cx_hash_key_cxstr(key), false);
+}
+
+/**
+ * Detaches a key/value-pair from the map by using the key
+ * without invoking the destructor.
+ *
+ * @param map the map
+ * @param key the key
+ */
+__attribute__((__nonnull__))
 static inline void cx_map_detach_str(
         CxMap *map,
         char const *key
@@ -874,6 +1041,7 @@
 #define cxMapDetach(map, key) _Generic((key), \
     CxHashKey: cx_map_detach,                 \
     cxstring: cx_map_detach_cxstr,            \
+    cxmutstr: cx_map_detach_mustr,            \
     char*: cx_map_detach_str)                 \
     (map, key)
 
@@ -918,6 +1086,22 @@
  * in the map or the map is not storing pointers
  */
 __attribute__((__nonnull__, __warn_unused_result__))
+static inline void *cx_map_remove_and_get_mustr(
+        CxMap *map,
+        cxmutstr key
+) {
+    return map->cl->remove(map, cx_hash_key_cxstr(key), !map->store_pointer);
+}
+
+/**
+ * Removes a key/value-pair from the map by using the key.
+ *
+ * @param map the map
+ * @param key the key
+ * @return the stored pointer or \c NULL if either the key is not present
+ * in the map or the map is not storing pointers
+ */
+__attribute__((__nonnull__, __warn_unused_result__))
 static inline void *cx_map_remove_and_get_str(
         CxMap *map,
         char const *key
@@ -947,6 +1131,7 @@
 #define cxMapRemoveAndGet(map, key) _Generic((key), \
     CxHashKey: cx_map_remove_and_get,               \
     cxstring: cx_map_remove_and_get_cxstr,          \
+    cxmutstr: cx_map_remove_and_get_mustr,          \
     char*: cx_map_remove_and_get_str)               \
     (map, key)
 
--- a/tests/test_map_generics.c	Fri Apr 21 19:50:43 2023 +0200
+++ b/tests/test_map_generics.c	Fri Apr 21 20:17:09 2023 +0200
@@ -33,7 +33,7 @@
     CxMap *map = cxHashMapCreate(allocator, sizeof(cxstring), 0);
 
     cxMapPut(map, "test", "test");
-    cxMapPut(map, CX_STR("foo"), "bar");
+    cxMapPut(map, cx_mutstr("foo"), "bar");
     cxMapPut(map, cx_str("hallo"), "welt");
 
     return map;

mercurial