|
dvander@2226
|
1 |
#ifndef _INCLUDE_KNIGHT_KE_HASHTABLE_H_ |
|
dvander@2226
|
2 |
#define _INCLUDE_KNIGHT_KE_HASHTABLE_H_ |
|
dvander@2226
|
3 |
|
|
dvander@2226
|
4 |
#include <KeStdTypes.h> |
|
dvander@2226
|
5 |
#include <KnightAllocator.h> |
|
dvander@2226
|
6 |
|
|
dvander@2226
|
7 |
namespace Knight |
|
dvander@2226
|
8 |
{ |
|
dvander@2226
|
9 |
class KeHashTable; |
|
dvander@2226
|
10 |
|
|
dvander@2226
|
11 |
/** |
|
dvander@2226
|
12 |
* @brief Must generate a hash function given a key. |
|
dvander@2226
|
13 |
* |
|
dvander@2226
|
14 |
* @param key Pointer to the key. |
|
dvander@2226
|
15 |
* @return Hash value. |
|
dvander@2226
|
16 |
*/ |
|
dvander@2226
|
17 |
typedef uint32_t (*KeHashGenerator)(const void *key); |
|
dvander@2226
|
18 |
|
|
dvander@2226
|
19 |
/** |
|
dvander@2226
|
20 |
* @brief Must compare two values. |
|
dvander@2226
|
21 |
* |
|
dvander@2226
|
22 |
* @param val1 First value. |
|
dvander@2226
|
23 |
* @param val2 Second value. |
|
dvander@2226
|
24 |
* @return True if equal, false if not. |
|
dvander@2226
|
25 |
*/ |
|
dvander@2226
|
26 |
typedef bool (*KeHashComparator)(const void *val1, const void *val2); |
|
dvander@2226
|
27 |
|
|
dvander@2226
|
28 |
/** |
|
dvander@2226
|
29 |
* @brief Must call the destructor of the given data, and free if necessary. |
|
dvander@2226
|
30 |
* |
|
dvander@2226
|
31 |
* @param val Pointer to data. |
|
dvander@2226
|
32 |
*/ |
|
dvander@2226
|
33 |
typedef void (*KeHashDestructor)(const void *val); |
|
dvander@2226
|
34 |
|
|
dvander@2226
|
35 |
/** |
|
dvander@2226
|
36 |
* @brief Must transfer the contents of an object from the source to the destination. |
|
dvander@2226
|
37 |
* |
|
dvander@2226
|
38 |
* @param dest Destination address. |
|
dvander@2226
|
39 |
* @param source Source address. |
|
dvander@2226
|
40 |
*/ |
|
dvander@2226
|
41 |
typedef void (*KeHashCopyCtor)(void *dest, const void *source); |
|
dvander@2226
|
42 |
|
|
dvander@2226
|
43 |
/** |
|
dvander@2226
|
44 |
* @brief Contains information about how to process keys and values in a hash table. |
|
dvander@2226
|
45 |
*/ |
|
dvander@2226
|
46 |
struct KeHashMarshal |
|
dvander@2226
|
47 |
{ |
|
dvander@2226
|
48 |
size_t bytes; /**< Bytes of storage needed (0 to use pointers). */ |
|
dvander@2226
|
49 |
KeHashComparator cmp; /**< Comparator (if NULL, void * comparison used) */ |
|
dvander@2226
|
50 |
KeHashDestructor dtor; /**< Optional function for performing dtor cleanup. */ |
|
dvander@2226
|
51 |
KeHashCopyCtor ctor; /**< If bytes != 0, must be a valid function |
|
dvander@2226
|
52 |
(ignored otherwise). */ |
|
dvander@2226
|
53 |
}; |
|
dvander@2226
|
54 |
|
|
dvander@2226
|
55 |
/** |
|
dvander@2226
|
56 |
* @brief Creates a new hash table structure. |
|
dvander@2226
|
57 |
* |
|
dvander@2226
|
58 |
* @param bits Dictates starting number of buckets as a power of two. |
|
dvander@2226
|
59 |
* Pass 0 for the default (which is 4). |
|
dvander@2226
|
60 |
* @param key_gen Key generation function. |
|
dvander@2226
|
61 |
* @param key_marshal Structure detailing how to marshal keys. |
|
dvander@2226
|
62 |
* @param vak_marshal Structure detailing how to marshal values. |
|
dvander@2226
|
63 |
* @param nodeAlloc Node allocator (can be NULL for malloc/free). |
|
dvander@2226
|
64 |
* @param keep_free_list True to keep a free list of nodes, false otherwise. |
|
dvander@2226
|
65 |
* @return New hash table container. |
|
dvander@2226
|
66 |
*/ |
|
dvander@2226
|
67 |
extern KeHashTable *KE_CreateHashTable( |
|
dvander@2226
|
68 |
uint32_t bits, |
|
dvander@2226
|
69 |
KeHashGenerator key_gen, |
|
dvander@2226
|
70 |
const KeHashMarshal *key_marshal, |
|
dvander@2226
|
71 |
const KeHashMarshal *val_marshal, |
|
dvander@2226
|
72 |
ke_allocator_t *nodeAlloc, |
|
dvander@2226
|
73 |
bool keep_free_list |
|
dvander@2226
|
74 |
); |
|
dvander@2226
|
75 |
|
|
dvander@2226
|
76 |
/** |
|
dvander@2226
|
77 |
* @brief Destroys a hash table. |
|
dvander@2226
|
78 |
* |
|
dvander@2226
|
79 |
* @param table Hash table. |
|
dvander@2226
|
80 |
*/ |
|
dvander@2226
|
81 |
extern void KE_DestroyHashTable(KeHashTable *table); |
|
dvander@2226
|
82 |
|
|
dvander@2226
|
83 |
/** |
|
dvander@2226
|
84 |
* @brief Adds a key/value to the hash table. If the pair already exists, the old value |
|
dvander@2226
|
85 |
* is overwritten (calling any destructors as necessary). |
|
dvander@2226
|
86 |
* |
|
dvander@2226
|
87 |
* @param table Hash table. |
|
dvander@2226
|
88 |
* @param key Key pointer. |
|
dvander@2226
|
89 |
* @param val Value pointer. |
|
dvander@2226
|
90 |
*/ |
|
dvander@2226
|
91 |
extern void KE_AddToHashTable(KeHashTable *table, const void *key, void *val); |
|
dvander@2226
|
92 |
|
|
dvander@2226
|
93 |
/** |
|
dvander@2226
|
94 |
* @brief Removes a key entry from the hash table. |
|
dvander@2226
|
95 |
* |
|
dvander@2226
|
96 |
* @param table Hash table. |
|
dvander@2226
|
97 |
* @param key Key pointer. |
|
dvander@2226
|
98 |
*/ |
|
dvander@2226
|
99 |
extern void KE_RemoveFromHashTable(KeHashTable *table, const void *key); |
|
dvander@2226
|
100 |
|
|
dvander@2226
|
101 |
/** |
|
dvander@2226
|
102 |
* @brief Finds an entry in the hash table. |
|
dvander@2226
|
103 |
* |
|
dvander@2226
|
104 |
* @param table Hash table. |
|
dvander@2226
|
105 |
* @param key Key pointer. |
|
dvander@2226
|
106 |
* @param value Pointer to store the value (optional). |
|
dvander@2226
|
107 |
* @return On success, true is returned and value is filled if given. |
|
dvander@2226
|
108 |
* On failure, false is failed and outputs are undefined. |
|
dvander@2226
|
109 |
*/ |
|
dvander@2226
|
110 |
extern bool KE_FindInHashTable(KeHashTable *table, const void *key, void **value); |
|
dvander@2226
|
111 |
|
|
dvander@2226
|
112 |
/** |
|
dvander@2226
|
113 |
* @brief Clears all entries in the hash table (caching free entries when possible). |
|
dvander@2226
|
114 |
* |
|
dvander@2226
|
115 |
* @param table Hash table. |
|
dvander@2226
|
116 |
*/ |
|
dvander@2226
|
117 |
extern void KE_ClearHashTable(KeHashTable *table); |
|
dvander@2226
|
118 |
|
|
dvander@2226
|
119 |
/** |
|
dvander@2226
|
120 |
* @brief Generic function for hasing strings. |
|
dvander@2226
|
121 |
* |
|
dvander@2226
|
122 |
* @param str Key string. |
|
dvander@2226
|
123 |
* @return Hash value. |
|
dvander@2226
|
124 |
*/ |
|
dvander@2226
|
125 |
extern uint32_t KE_HashString(const void *str); |
|
dvander@2226
|
126 |
} |
|
dvander@2226
|
127 |
|
|
dvander@2226
|
128 |
#endif //_INCLUDE_KNIGHT_KE_HASHTABLE_H_ |