]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/shared/set.h
hashmap: allow hashmap_move() to fail
[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
d5099efc 35Set *set_new(const struct hash_ops *hash_ops);
91cdde8a 36void set_free(Set* s);
53ec43c6 37void set_free_free(Set *s);
a740c14c 38
034c6ed7 39Set* set_copy(Set *s);
d5099efc 40int set_ensure_allocated(Set **s, const struct hash_ops *hash_ops);
60918275
LP
41
42int set_put(Set *s, void *value);
ef42202a 43int set_consume(Set *s, void *value);
c0c743cb
LP
44int set_put_strdup(Set *s, const char *p);
45int set_put_strdupv(Set *s, char **l);
f00b3eda 46int set_replace(Set *s, void *value);
60918275 47void *set_get(Set *s, void *value);
96342de6 48bool set_contains(Set *s, void *value);
60918275 49void *set_remove(Set *s, void *value);
101d8e63 50int set_remove_and_put(Set *s, void *old_value, void *new_value);
60918275 51
91cdde8a 52int set_merge(Set *s, Set *other);
e4c691b5 53int set_reserve(Set *s, unsigned entries_add);
7ad63f57 54int set_move(Set *s, Set *other);
101d8e63 55int set_move_one(Set *s, Set *other, void *value);
91cdde8a 56
60918275
LP
57unsigned set_size(Set *s);
58bool set_isempty(Set *s);
59
034c6ed7 60void *set_iterate(Set *s, Iterator *i);
60918275 61
11dd41ce 62void set_clear(Set *s);
9946996c
LP
63void set_clear_free(Set *s);
64
91cdde8a
LP
65void *set_steal_first(Set *s);
66void* set_first(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
14bf2c9d
LP
73DEFINE_TRIVIAL_CLEANUP_FUNC(Set*, set_free);
74DEFINE_TRIVIAL_CLEANUP_FUNC(Set*, set_free_free);
dfb33a97
LP
75#define _cleanup_set_free_ _cleanup_(set_freep)
76#define _cleanup_set_free_free_ _cleanup_(set_free_freep)