set: add new helper set_make() which is like set_new() + multiple set_put() in vararg

This commit is contained in:
Lennart Poettering 2017-09-25 17:15:59 +02:00
parent 0cde65e263
commit ca543871b7
4 changed files with 109 additions and 0 deletions

View 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

61
src/basic/set.c Normal file
View file

@ -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;
}

View 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, ...);

View 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;
}