]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/shared/set.h
strv: multiple cleanups
[thirdparty/systemd.git] / src / shared / set.h
CommitLineData
03467c88 1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
60918275 2
c2f1db8f 3#pragma once
60918275 4
a7334b09
LP
5/***
6 This file is part of systemd.
7
8 Copyright 2010 Lennart Poettering
9
10 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
11 under the terms of the GNU Lesser General Public License as published by
12 the Free Software Foundation; either version 2.1 of the License, or
a7334b09
LP
13 (at your option) any later version.
14
15 systemd is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 18 Lesser General Public License for more details.
a7334b09 19
5430f7f2 20 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
21 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22***/
23
60918275
LP
24/* Pretty straightforward set implementation. Internally based on the
25 * hashmap. That means that as a minor optimization a NULL set
26 * object will be treated as empty set for all read
27 * operations. That way it is not necessary to instantiate an object
28 * for each set use. */
29
30#include "hashmap.h"
1ca208fb 31#include "util.h"
60918275
LP
32
33typedef struct Set Set;
34
35Set *set_new(hash_func_t hash_func, compare_func_t compare_func);
91cdde8a 36void set_free(Set* s);
53ec43c6 37void set_free_free(Set *s);
a740c14c 38
034c6ed7
LP
39Set* set_copy(Set *s);
40int set_ensure_allocated(Set **s, hash_func_t hash_func, compare_func_t compare_func);
60918275
LP
41
42int set_put(Set *s, void *value);
ef42202a 43int set_consume(Set *s, void *value);
f00b3eda 44int set_replace(Set *s, void *value);
60918275 45void *set_get(Set *s, void *value);
96342de6 46bool set_contains(Set *s, void *value);
60918275 47void *set_remove(Set *s, void *value);
101d8e63 48int set_remove_and_put(Set *s, void *old_value, void *new_value);
60918275 49
91cdde8a 50int set_merge(Set *s, Set *other);
101d8e63
LP
51void set_move(Set *s, Set *other);
52int set_move_one(Set *s, Set *other, void *value);
91cdde8a 53
60918275
LP
54unsigned set_size(Set *s);
55bool set_isempty(Set *s);
56
034c6ed7
LP
57void *set_iterate(Set *s, Iterator *i);
58void *set_iterate_backwards(Set *s, Iterator *i);
59void *set_iterate_skip(Set *s, void *value, Iterator *i);
60918275 60
11dd41ce 61void set_clear(Set *s);
9946996c
LP
62void set_clear_free(Set *s);
63
91cdde8a
LP
64void *set_steal_first(Set *s);
65void* set_first(Set *s);
66void* set_last(Set *s);
60918275 67
9590dfe7
LP
68char **set_get_strv(Set *s);
69
034c6ed7
LP
70#define SET_FOREACH(e, s, i) \
71 for ((i) = ITERATOR_FIRST, (e) = set_iterate((s), &(i)); (e); (e) = set_iterate((s), &(i)))
60918275 72
034c6ed7
LP
73#define SET_FOREACH_BACKWARDS(e, s, i) \
74 for ((i) = ITERATOR_LAST, (e) = set_iterate_backwards((s), &(i)); (e); (e) = set_iterate_backwards((s), &(i)))
dfb33a97 75
14bf2c9d
LP
76DEFINE_TRIVIAL_CLEANUP_FUNC(Set*, set_free);
77DEFINE_TRIVIAL_CLEANUP_FUNC(Set*, set_free_free);
dfb33a97
LP
78#define _cleanup_set_free_ _cleanup_(set_freep)
79#define _cleanup_set_free_free_ _cleanup_(set_free_freep)