]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
set: add new helper set_make() which is like set_new() + multiple set_put() in vararg
authorLennart Poettering <lennart@poettering.net>
Mon, 25 Sep 2017 15:15:59 +0000 (17:15 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 26 Sep 2017 14:17:22 +0000 (16:17 +0200)
src/basic/meson.build
src/basic/set.c [new file with mode: 0644]
src/basic/set.h
src/test/test-set.c

index 994336fde2d327781a7265c89ade48498b5a562e..1ddefb7fbb846dfd4ccfc0500db84e9276266fe4 100644 (file)
@@ -145,6 +145,7 @@ basic_sources_plain = files('''
         securebits.h
         selinux-util.c
         selinux-util.h
+        set.c
         set.h
         sigbus.c
         sigbus.h
diff --git a/src/basic/set.c b/src/basic/set.c
new file mode 100644 (file)
index 0000000..fd398b8
--- /dev/null
@@ -0,0 +1,61 @@
+/***
+  This file is part of systemd.
+
+  Copyright 2017 Lennart Poettering
+
+  systemd is free software; you can redistribute it and/or modify it
+  under the terms of the GNU Lesser General Public License as published by
+  the Free Software Foundation; either version 2.1 of the License, or
+  (at your option) any later version.
+
+  systemd is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with systemd; If not, see <http://www.gnu.org/licenses/>.
+***/
+
+#include "set.h"
+
+int set_make(Set **ret, const struct hash_ops *hash_ops HASHMAP_DEBUG_PARAMS, void *add, ...) {
+        _cleanup_set_free_ Set *s = NULL;
+        int r;
+
+        assert(ret);
+
+        s = set_new(hash_ops HASHMAP_DEBUG_PASS_ARGS);
+        if (!s)
+                return -ENOMEM;
+
+        if (add) {
+                va_list ap;
+
+                r = set_put(s, add);
+                if (r < 0)
+                        return r;
+
+                va_start(ap, add);
+
+                for(;;) {
+                        void *arg = va_arg(ap, void*);
+
+                        if (!arg)
+                                break;
+
+                        r = set_put(s, arg);
+                        if (r < 0) {
+                                va_end(ap);
+                                return r;
+                        }
+                }
+
+                va_end(ap);
+        }
+
+        *ret = s;
+        s = NULL;
+
+        return 0;
+}
index a5f8beb0c4b4f97849a0df03a825270e792a599d..12d0fda1ca30bb55ed0217849bd077632391b61f 100644 (file)
@@ -136,3 +136,5 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(Set*, set_free_free);
 
 #define _cleanup_set_free_ _cleanup_(set_freep)
 #define _cleanup_set_free_free_ _cleanup_(set_free_freep)
+
+int set_make(Set **ret, const struct hash_ops *hash_ops HASHMAP_DEBUG_PARAMS, void *add, ...);
index 0ee5ddcc9f63e7ce3041e0e02acde069b7c595d1..3fab350cf6d005f3a5bb00a15c3c84d42ab0269f 100644 (file)
@@ -55,9 +55,54 @@ static void test_set_put(void) {
         assert_se(set_put(m, (void*) "22") == 0);
 }
 
+static void test_set_make(void) {
+        _cleanup_set_free_ Set *s = NULL;
+
+        assert_se(set_make(&s, NULL, UINT_TO_PTR(4), UINT_TO_PTR(6), UINT_TO_PTR(8), NULL) == 0);
+        assert_se(set_size(s) == 3);
+        assert_se(!set_contains(s, UINT_TO_PTR(0)));
+        assert_se(!set_contains(s, UINT_TO_PTR(1)));
+        assert_se(!set_contains(s, UINT_TO_PTR(2)));
+        assert_se(!set_contains(s, UINT_TO_PTR(3)));
+        assert_se(set_contains(s, UINT_TO_PTR(4)));
+        assert_se(!set_contains(s, UINT_TO_PTR(5)));
+        assert_se(set_contains(s, UINT_TO_PTR(6)));
+        assert_se(!set_contains(s, UINT_TO_PTR(7)));
+        assert_se(set_contains(s, UINT_TO_PTR(8)));
+        assert_se(!set_contains(s, UINT_TO_PTR(9)));
+        s = set_free(s);
+
+        assert_se(set_make(&s, NULL, NULL) == 0);
+        assert_se(set_size(s) == 0);
+        assert_se(!set_contains(s, UINT_TO_PTR(0)));
+        assert_se(!set_contains(s, UINT_TO_PTR(4)));
+        assert_se(!set_contains(s, UINT_TO_PTR(6)));
+        assert_se(!set_contains(s, UINT_TO_PTR(8)));
+        s = set_free(s);
+
+        assert_se(set_make(&s, NULL, UINT_TO_PTR(3), NULL) == 0);
+        assert_se(set_size(s) == 1);
+        assert_se(!set_contains(s, UINT_TO_PTR(0)));
+        assert_se(!set_contains(s, UINT_TO_PTR(1)));
+        assert_se(!set_contains(s, UINT_TO_PTR(2)));
+        assert_se(set_contains(s, UINT_TO_PTR(3)));
+        assert_se(!set_contains(s, UINT_TO_PTR(4)));
+
+        assert_se(set_make(&s, NULL, UINT_TO_PTR(2), UINT_TO_PTR(5), NULL) == 0);
+        assert_se(set_size(s) == 2);
+        assert_se(!set_contains(s, UINT_TO_PTR(0)));
+        assert_se(!set_contains(s, UINT_TO_PTR(1)));
+        assert_se(set_contains(s, UINT_TO_PTR(2)));
+        assert_se(!set_contains(s, UINT_TO_PTR(3)));
+        assert_se(!set_contains(s, UINT_TO_PTR(4)));
+        assert_se(set_contains(s, UINT_TO_PTR(5)));
+        assert_se(!set_contains(s, UINT_TO_PTR(6)));
+}
+
 int main(int argc, const char *argv[]) {
         test_set_steal_first();
         test_set_put();
+        test_set_make();
 
         return 0;
 }