]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/shared/set.h
Add set_consume which always takes ownership
[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);
ef42202a 49int set_consume(Set *s, void *value);
f00b3eda 50int set_replace(Set *s, void *value);
60918275 51void *set_get(Set *s, void *value);
96342de6 52bool set_contains(Set *s, void *value);
60918275 53void *set_remove(Set *s, void *value);
101d8e63 54int set_remove_and_put(Set *s, void *old_value, void *new_value);
60918275 55
91cdde8a 56int set_merge(Set *s, Set *other);
101d8e63
LP
57void set_move(Set *s, Set *other);
58int set_move_one(Set *s, Set *other, void *value);
91cdde8a 59
60918275
LP
60unsigned set_size(Set *s);
61bool set_isempty(Set *s);
62
034c6ed7
LP
63void *set_iterate(Set *s, Iterator *i);
64void *set_iterate_backwards(Set *s, Iterator *i);
65void *set_iterate_skip(Set *s, void *value, Iterator *i);
60918275 66
11dd41ce 67void set_clear(Set *s);
9946996c
LP
68void set_clear_free(Set *s);
69
91cdde8a
LP
70void *set_steal_first(Set *s);
71void* set_first(Set *s);
72void* set_last(Set *s);
60918275 73
9590dfe7
LP
74char **set_get_strv(Set *s);
75
034c6ed7
LP
76#define SET_FOREACH(e, s, i) \
77 for ((i) = ITERATOR_FIRST, (e) = set_iterate((s), &(i)); (e); (e) = set_iterate((s), &(i)))
60918275 78
034c6ed7
LP
79#define SET_FOREACH_BACKWARDS(e, s, i) \
80 for ((i) = ITERATOR_LAST, (e) = set_iterate_backwards((s), &(i)); (e); (e) = set_iterate_backwards((s), &(i)))
dfb33a97
LP
81
82#define _cleanup_set_free_ _cleanup_(set_freep)
83#define _cleanup_set_free_free_ _cleanup_(set_free_freep)