]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/shared/set.h
util: replace decimal_str_max() by a typesafe macro DECIMAL_STR_WIDTH()
[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"
31
32typedef struct Set Set;
33
34Set *set_new(hash_func_t hash_func, compare_func_t compare_func);
91cdde8a 35void set_free(Set* s);
a740c14c
MS
36static inline void set_freep(Set **s) {
37 set_free(*s);
38}
39
53ec43c6 40void set_free_free(Set *s);
a740c14c
MS
41static inline void set_free_freep(Set **s) {
42 set_free_free(*s);
43}
44
034c6ed7
LP
45Set* set_copy(Set *s);
46int set_ensure_allocated(Set **s, hash_func_t hash_func, compare_func_t compare_func);
60918275
LP
47
48int set_put(Set *s, void *value);
f00b3eda 49int set_replace(Set *s, void *value);
60918275 50void *set_get(Set *s, void *value);
96342de6 51bool set_contains(Set *s, void *value);
60918275 52void *set_remove(Set *s, void *value);
101d8e63 53int set_remove_and_put(Set *s, void *old_value, void *new_value);
60918275 54
91cdde8a 55int set_merge(Set *s, Set *other);
101d8e63
LP
56void set_move(Set *s, Set *other);
57int set_move_one(Set *s, Set *other, void *value);
91cdde8a 58
60918275
LP
59unsigned set_size(Set *s);
60bool set_isempty(Set *s);
61
034c6ed7
LP
62void *set_iterate(Set *s, Iterator *i);
63void *set_iterate_backwards(Set *s, Iterator *i);
64void *set_iterate_skip(Set *s, void *value, Iterator *i);
60918275 65
11dd41ce 66void set_clear(Set *s);
9946996c
LP
67void set_clear_free(Set *s);
68
91cdde8a
LP
69void *set_steal_first(Set *s);
70void* set_first(Set *s);
71void* set_last(Set *s);
60918275 72
9590dfe7
LP
73char **set_get_strv(Set *s);
74
034c6ed7
LP
75#define SET_FOREACH(e, s, i) \
76 for ((i) = ITERATOR_FIRST, (e) = set_iterate((s), &(i)); (e); (e) = set_iterate((s), &(i)))
60918275 77
034c6ed7
LP
78#define SET_FOREACH_BACKWARDS(e, s, i) \
79 for ((i) = ITERATOR_LAST, (e) = set_iterate_backwards((s), &(i)); (e); (e) = set_iterate_backwards((s), &(i)))