]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/shared/hashmap.h
core: no need to pass bus object to selinux access check calls anymore
[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 26#include "macro.h"
5e2f14e6 27#include "util.h"
44a6b1b6 28
60918275
LP
29/* Pretty straightforward hash table implementation. As a minor
30 * optimization a NULL hashmap object will be treated as empty hashmap
31 * for all read operations. That way it is not necessary to
32 * instantiate an object for each Hashmap use. */
33
9bf3b535
LP
34#define HASH_KEY_SIZE 16
35
60918275 36typedef struct Hashmap Hashmap;
034c6ed7
LP
37typedef struct _IteratorStruct _IteratorStruct;
38typedef _IteratorStruct* Iterator;
39
40#define ITERATOR_FIRST ((Iterator) 0)
41#define ITERATOR_LAST ((Iterator) -1)
60918275 42
9bf3b535 43typedef unsigned long (*hash_func_t)(const void *p, const uint8_t hash_key[HASH_KEY_SIZE]);
60918275
LP
44typedef int (*compare_func_t)(const void *a, const void *b);
45
9bf3b535 46unsigned long string_hash_func(const void *p, const uint8_t hash_key[HASH_KEY_SIZE]) _pure_;
44a6b1b6 47int string_compare_func(const void *a, const void *b) _pure_;
60918275 48
1210bc66
LP
49/* This will compare the passed pointers directly, and will not
50 * dereference them. This is hence not useful for strings or
51 * suchlike. */
9bf3b535 52unsigned long trivial_hash_func(const void *p, const uint8_t hash_key[HASH_KEY_SIZE]) _pure_;
44a6b1b6 53int trivial_compare_func(const void *a, const void *b) _const_;
60918275 54
9bf3b535 55unsigned long uint64_hash_func(const void *p, const uint8_t hash_key[HASH_KEY_SIZE]) _pure_;
44a6b1b6 56int uint64_compare_func(const void *a, const void *b) _pure_;
a4bcff5b 57
60918275 58Hashmap *hashmap_new(hash_func_t hash_func, compare_func_t compare_func);
91cdde8a 59void hashmap_free(Hashmap *h);
449ddb2d 60void hashmap_free_free(Hashmap *h);
fabe5c0e 61void hashmap_free_free_free(Hashmap *h);
91cdde8a 62Hashmap *hashmap_copy(Hashmap *h);
034c6ed7 63int hashmap_ensure_allocated(Hashmap **h, hash_func_t hash_func, compare_func_t compare_func);
60918275
LP
64
65int hashmap_put(Hashmap *h, const void *key, void *value);
d99ae53a 66int hashmap_update(Hashmap *h, const void *key, void *value);
3158713e 67int hashmap_replace(Hashmap *h, const void *key, void *value);
2f79c10e
DB
68void *hashmap_get(Hashmap *h, const void *key);
69void *hashmap_get2(Hashmap *h, const void *key, void **rkey);
96342de6 70bool hashmap_contains(Hashmap *h, const void *key);
2f79c10e
DB
71void *hashmap_remove(Hashmap *h, const void *key);
72void *hashmap_remove_value(Hashmap *h, const void *key, void *value);
101d8e63 73int hashmap_remove_and_put(Hashmap *h, const void *old_key, const void *new_key, void *value);
8fe914ec 74int hashmap_remove_and_replace(Hashmap *h, const void *old_key, const void *new_key, void *value);
60918275 75
91cdde8a 76int hashmap_merge(Hashmap *h, Hashmap *other);
101d8e63
LP
77void hashmap_move(Hashmap *h, Hashmap *other);
78int hashmap_move_one(Hashmap *h, Hashmap *other, const void *key);
91cdde8a 79
44a6b1b6
ZJS
80unsigned hashmap_size(Hashmap *h) _pure_;
81bool hashmap_isempty(Hashmap *h) _pure_;
45fa9e29 82unsigned hashmap_buckets(Hashmap *h) _pure_;
60918275 83
034c6ed7
LP
84void *hashmap_iterate(Hashmap *h, Iterator *i, const void **key);
85void *hashmap_iterate_backwards(Hashmap *h, Iterator *i, const void **key);
86void *hashmap_iterate_skip(Hashmap *h, const void *key, Iterator *i);
60918275 87
11dd41ce 88void hashmap_clear(Hashmap *h);
9946996c 89void hashmap_clear_free(Hashmap *h);
fabe5c0e 90void hashmap_clear_free_free(Hashmap *h);
9946996c 91
60918275 92void *hashmap_steal_first(Hashmap *h);
22be093f 93void *hashmap_steal_first_key(Hashmap *h);
44a6b1b6
ZJS
94void *hashmap_first(Hashmap *h) _pure_;
95void *hashmap_first_key(Hashmap *h) _pure_;
96void *hashmap_last(Hashmap *h) _pure_;
60918275 97
3c1668da
LP
98void *hashmap_next(Hashmap *h, const void *key);
99
db1413d7
KS
100char **hashmap_get_strv(Hashmap *h);
101
034c6ed7 102#define HASHMAP_FOREACH(e, h, i) \
aed5e44d 103 for ((i) = ITERATOR_FIRST, (e) = hashmap_iterate((h), &(i), NULL); (e); (e) = hashmap_iterate((h), &(i), NULL))
60918275 104
034c6ed7 105#define HASHMAP_FOREACH_KEY(e, k, h, i) \
aed5e44d 106 for ((i) = ITERATOR_FIRST, (e) = hashmap_iterate((h), &(i), (const void**) &(k)); (e); (e) = hashmap_iterate((h), &(i), (const void**) &(k)))
11dd41ce 107
034c6ed7 108#define HASHMAP_FOREACH_BACKWARDS(e, h, i) \
aed5e44d 109 for ((i) = ITERATOR_LAST, (e) = hashmap_iterate_backwards((h), &(i), NULL); (e); (e) = hashmap_iterate_backwards((h), &(i), NULL))
5e2f14e6
LP
110
111DEFINE_TRIVIAL_CLEANUP_FUNC(Hashmap*, hashmap_free);
112DEFINE_TRIVIAL_CLEANUP_FUNC(Hashmap*, hashmap_free_free);
113DEFINE_TRIVIAL_CLEANUP_FUNC(Hashmap*, hashmap_free_free_free);
114#define _cleanup_hashmap_free_ _cleanup_(hashmap_freep)
115#define _cleanup_hashmap_free_free_ _cleanup_(hashmap_free_freep)
116#define _cleanup_hashmap_free_free_free_ _cleanup_(hashmap_free_free_freep)