| 1 |
|
| 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
|