]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
strv: introduce string_strv_hashmap_remove()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 27 Jan 2025 23:50:14 +0000 (08:50 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 28 Jan 2025 19:36:24 +0000 (04:36 +0900)
src/basic/strv.c
src/basic/strv.h
src/test/test-hashmap-plain.c

index d817140cc98e2ed68576562af15d814e2144223e..1eea73fa7b7a746bf07ab7351ae1f2ffa89c75d8 100644 (file)
@@ -1063,6 +1063,23 @@ int fputstrv(FILE *f, char * const *l, const char *separator, bool *space) {
         return 0;
 }
 
+void string_strv_hashmap_remove(Hashmap *h, const char *key, const char *value) {
+        assert(key);
+
+        if (value) {
+                char **l = hashmap_get(h, key);
+                if (!l)
+                        return;
+
+                strv_remove(l, value);
+                if (!strv_isempty(l))
+                        return;
+        }
+
+        _unused_ _cleanup_free_ char *key_free = NULL;
+        strv_free(hashmap_remove2(h, key, (void**) &key_free));
+}
+
 static int string_strv_hashmap_put_internal(Hashmap *h, const char *key, const char *value) {
         char **l;
         int r;
index 86ba06f835a81c96af6b1ab0afcb956444b12d6e..5cdc801f35a0a14889357b54bcc4439fe1c2c907 100644 (file)
@@ -258,6 +258,10 @@ int fputstrv(FILE *f, char * const *l, const char *separator, bool *space);
 #define strv_free_and_replace(a, b)             \
         free_and_replace_full(a, b, strv_free)
 
+void string_strv_hashmap_remove(Hashmap *h, const char *key, const char *value);
+static inline void string_strv_ordered_hashmap_remove(OrderedHashmap *h, const char *key, const char *value) {
+        string_strv_hashmap_remove(PLAIN_HASHMAP(h), key, value);
+}
 int _string_strv_hashmap_put(Hashmap **h, const char *key, const char *value  HASHMAP_DEBUG_PARAMS);
 int _string_strv_ordered_hashmap_put(OrderedHashmap **h, const char *key, const char *value  HASHMAP_DEBUG_PARAMS);
 #define string_strv_hashmap_put(h, k, v) _string_strv_hashmap_put(h, k, v  HASHMAP_DEBUG_SRC_ARGS)
index 6b6058b08ac6548786b7bb85b7be1e9d18423c2a..6bcf353887fcee2e3c2782f459ba2d41795f3c52 100644 (file)
@@ -973,6 +973,22 @@ TEST(string_strv_hashmap) {
 
         s = hashmap_get(m, "xxx");
         assert_se(strv_equal(s, STRV_MAKE("bar", "BAR")));
+
+        string_strv_hashmap_remove(m, "foo", "bar");
+        ASSERT_NOT_NULL(s = hashmap_get(m, "foo"));
+        ASSERT_TRUE(strv_equal(s, STRV_MAKE("BAR")));
+
+        string_strv_hashmap_remove(m, "foo", "BAR");
+        ASSERT_NULL(hashmap_get(m, "foo"));
+
+        string_strv_hashmap_remove(m, "xxx", "BAR");
+        ASSERT_NOT_NULL(s = hashmap_get(m, "xxx"));
+        ASSERT_TRUE(strv_equal(s, STRV_MAKE("bar")));
+
+        string_strv_hashmap_remove(m, "xxx", "bar");
+        ASSERT_NULL(hashmap_get(m, "xxx"));
+
+        ASSERT_TRUE(hashmap_isempty(m));
 }
 
 TEST(hashmap_dump_sorted) {