xref: /openbsd/sys/dev/pci/drm/include/linux/hashtable.h (revision 3cab2bb3)
1 /*	$OpenBSD: hashtable.h,v 1.2 2020/06/08 04:48:14 jsg Exp $	*/
2 /*
3  * Copyright (c) 2017 Mark Kettenis
4  *
5  * Permission to use, copy, modify, and distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17 
18 #ifndef _LINUX_HASHTABLE_H
19 #define _LINUX_HASHTABLE_H
20 
21 #include <linux/list.h>
22 #include <linux/hash.h>
23 
24 #define DECLARE_HASHTABLE(name, bits) struct hlist_head name[1 << (bits)]
25 
26 static inline void
27 __hash_init(struct hlist_head *table, u_int size)
28 {
29 	u_int i;
30 
31 	for (i = 0; i < size; i++)
32 		INIT_HLIST_HEAD(&table[i]);
33 }
34 
35 static inline bool
36 __hash_empty(struct hlist_head *table, u_int size)
37 {
38 	u_int i;
39 
40 	for (i = 0; i < size; i++) {
41 		if (!hlist_empty(&table[i]))
42 			return false;
43 	}
44 
45 	return true;
46 }
47 
48 #define __hash(table, key)	&table[key % (nitems(table) - 1)]
49 
50 #define hash_init(table)	__hash_init(table, nitems(table))
51 #define hash_add(table, node, key) \
52 	hlist_add_head(node, __hash(table, key))
53 #define hash_del(node)		hlist_del_init(node)
54 #define hash_empty(table)	__hash_empty(table, nitems(table))
55 #define hash_for_each_possible(table, obj, member, key) \
56 	hlist_for_each_entry(obj, __hash(table, key), member)
57 #define hash_for_each_safe(table, i, tmp, obj, member) 	\
58 	for (i = 0; i < nitems(table); i++)		\
59 	       hlist_for_each_entry_safe(obj, tmp, &table[i], member)
60 
61 #endif
62