1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2 | #ifndef HASHTABLE_H |
3 | #define HASHTABLE_H |
4 | |
5 | #include "array_size.h" |
6 | #include "list.h" |
7 | |
8 | #define HASH_SIZE(name) (ARRAY_SIZE(name)) |
9 | |
10 | #define HASHTABLE_DECLARE(name, size) struct hlist_head name[size] |
11 | |
12 | #define HASHTABLE_DEFINE(name, size) \ |
13 | HASHTABLE_DECLARE(name, size) = \ |
14 | { [0 ... ((size) - 1)] = HLIST_HEAD_INIT } |
15 | |
16 | #define hash_head(table, key) (&(table)[(key) % HASH_SIZE(table)]) |
17 | |
18 | /** |
19 | * hash_add - add an object to a hashtable |
20 | * @table: hashtable to add to |
21 | * @node: the &struct hlist_node of the object to be added |
22 | * @key: the key of the object to be added |
23 | */ |
24 | #define hash_add(table, node, key) \ |
25 | hlist_add_head(node, hash_head(table, key)) |
26 | |
27 | /** |
28 | * hash_for_each - iterate over a hashtable |
29 | * @table: hashtable to iterate |
30 | * @obj: the type * to use as a loop cursor for each entry |
31 | * @member: the name of the hlist_node within the struct |
32 | */ |
33 | #define hash_for_each(table, obj, member) \ |
34 | for (int _bkt = 0; _bkt < HASH_SIZE(table); _bkt++) \ |
35 | hlist_for_each_entry(obj, &table[_bkt], member) |
36 | |
37 | /** |
38 | * hash_for_each_possible - iterate over all possible objects hashing to the |
39 | * same bucket |
40 | * @table: hashtable to iterate |
41 | * @obj: the type * to use as a loop cursor for each entry |
42 | * @member: the name of the hlist_node within the struct |
43 | * @key: the key of the objects to iterate over |
44 | */ |
45 | #define hash_for_each_possible(table, obj, member, key) \ |
46 | hlist_for_each_entry(obj, hash_head(table, key), member) |
47 | |
48 | #endif /* HASHTABLE_H */ |
49 | |