]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/shared/hashmap.h
kmod-setup: properly iterate through module table
[thirdparty/systemd.git] / src / shared / hashmap.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#include <stdbool.h>
25
44a6b1b6
ZJS
26#include "macro.h"
27
60918275
LP
28/* Pretty straightforward hash table implementation. As a minor
29 * optimization a NULL hashmap object will be treated as empty hashmap
30 * for all read operations. That way it is not necessary to
31 * instantiate an object for each Hashmap use. */
32
33typedef struct Hashmap Hashmap;
034c6ed7
LP
34typedef struct _IteratorStruct _IteratorStruct;
35typedef _IteratorStruct* Iterator;
36
37#define ITERATOR_FIRST ((Iterator) 0)
38#define ITERATOR_LAST ((Iterator) -1)
60918275
LP
39
40typedef unsigned (*hash_func_t)(const void *p);
41typedef int (*compare_func_t)(const void *a, const void *b);
42
44a6b1b6
ZJS
43unsigned string_hash_func(const void *p) _pure_;
44int string_compare_func(const void *a, const void *b) _pure_;
60918275 45
44a6b1b6
ZJS
46unsigned trivial_hash_func(const void *p) _const_;
47int trivial_compare_func(const void *a, const void *b) _const_;
60918275 48
44a6b1b6
ZJS
49unsigned uint64_hash_func(const void *p) _pure_;
50int uint64_compare_func(const void *a, const void *b) _pure_;
a4bcff5b 51
60918275 52Hashmap *hashmap_new(hash_func_t hash_func, compare_func_t compare_func);
91cdde8a 53void hashmap_free(Hashmap *h);
449ddb2d 54void hashmap_free_free(Hashmap *h);
fabe5c0e 55void hashmap_free_free_free(Hashmap *h);
91cdde8a 56Hashmap *hashmap_copy(Hashmap *h);
034c6ed7 57int hashmap_ensure_allocated(Hashmap **h, hash_func_t hash_func, compare_func_t compare_func);
60918275
LP
58
59int hashmap_put(Hashmap *h, const void *key, void *value);
d99ae53a 60int hashmap_update(Hashmap *h, const void *key, void *value);
3158713e 61int hashmap_replace(Hashmap *h, const void *key, void *value);
2f79c10e
DB
62void *hashmap_get(Hashmap *h, const void *key);
63void *hashmap_get2(Hashmap *h, const void *key, void **rkey);
96342de6 64bool hashmap_contains(Hashmap *h, const void *key);
2f79c10e
DB
65void *hashmap_remove(Hashmap *h, const void *key);
66void *hashmap_remove_value(Hashmap *h, const void *key, void *value);
101d8e63 67int hashmap_remove_and_put(Hashmap *h, const void *old_key, const void *new_key, void *value);
8fe914ec 68int hashmap_remove_and_replace(Hashmap *h, const void *old_key, const void *new_key, void *value);
60918275 69
91cdde8a 70int hashmap_merge(Hashmap *h, Hashmap *other);
101d8e63
LP
71void hashmap_move(Hashmap *h, Hashmap *other);
72int hashmap_move_one(Hashmap *h, Hashmap *other, const void *key);
91cdde8a 73
44a6b1b6
ZJS
74unsigned hashmap_size(Hashmap *h) _pure_;
75bool hashmap_isempty(Hashmap *h) _pure_;
60918275 76
034c6ed7
LP
77void *hashmap_iterate(Hashmap *h, Iterator *i, const void **key);
78void *hashmap_iterate_backwards(Hashmap *h, Iterator *i, const void **key);
79void *hashmap_iterate_skip(Hashmap *h, const void *key, Iterator *i);
60918275 80
11dd41ce 81void hashmap_clear(Hashmap *h);
9946996c 82void hashmap_clear_free(Hashmap *h);
fabe5c0e 83void hashmap_clear_free_free(Hashmap *h);
9946996c 84
60918275 85void *hashmap_steal_first(Hashmap *h);
22be093f 86void *hashmap_steal_first_key(Hashmap *h);
44a6b1b6
ZJS
87void *hashmap_first(Hashmap *h) _pure_;
88void *hashmap_first_key(Hashmap *h) _pure_;
89void *hashmap_last(Hashmap *h) _pure_;
60918275 90
3c1668da
LP
91void *hashmap_next(Hashmap *h, const void *key);
92
db1413d7
KS
93char **hashmap_get_strv(Hashmap *h);
94
034c6ed7 95#define HASHMAP_FOREACH(e, h, i) \
aed5e44d 96 for ((i) = ITERATOR_FIRST, (e) = hashmap_iterate((h), &(i), NULL); (e); (e) = hashmap_iterate((h), &(i), NULL))
60918275 97
034c6ed7 98#define HASHMAP_FOREACH_KEY(e, k, h, i) \
aed5e44d 99 for ((i) = ITERATOR_FIRST, (e) = hashmap_iterate((h), &(i), (const void**) &(k)); (e); (e) = hashmap_iterate((h), &(i), (const void**) &(k)))
11dd41ce 100
034c6ed7 101#define HASHMAP_FOREACH_BACKWARDS(e, h, i) \
aed5e44d 102 for ((i) = ITERATOR_LAST, (e) = hashmap_iterate_backwards((h), &(i), NULL); (e); (e) = hashmap_iterate_backwards((h), &(i), NULL))