3 * Hash table implemenation.
7 // Hackery to make sure that macros get expanded
8 #define __JOIN(a,b) a##b
9 #define JOIN(a,b) __JOIN(a,b)
10 #define HASHPREFIX(name) JOIN(HASHTYPE,name)
11 #define HASHSTRUCT JOIN(HASHTYPE,_s)
13 typedef struct HASHSTRUCT * HASHTYPE;
15 /* function pointer types to deal with the datatypes the hash works with */
17 #define hashFunctionType JOIN(HASHTYPE,HashFunctionType)
18 #define hashEqualityType JOIN(HASHTYPE,HashEqualityType)
19 #define hashFreeKey JOIN(HASHTYPE,FreeKey)
21 typedef unsigned int (*hashFunctionType) (HTKEYTYPE string);
22 typedef int (*hashEqualityType) (HTKEYTYPE key1, HTKEYTYPE key2);
23 typedef HTKEYTYPE (*hashFreeKey) (HTKEYTYPE);
26 #define hashFreeData JOIN(HASHTYPE,FreeData)
27 typedef HTDATATYPE (*hashFreeData) (HTDATATYPE);
32 * If keySize > 0, the key is duplicated within the table (which costs
33 * memory, but may be useful anyway.
34 * @param numBuckets number of hash buckets
35 * @param fn function to generate hash value for key
36 * @param eq function to compare hash keys for equality
37 * @param freeKey function to free the keys or NULL
38 * @param freeData function to free the data or NULL
39 * @return pointer to initialized hash table
42 HASHTYPE HASHPREFIX(Create)(int numBuckets,
43 hashFunctionType fn, hashEqualityType eq,
46 , hashFreeData freeData
52 * @param ht pointer to hash table
56 HASHTYPE HASHPREFIX(Free)( HASHTYPE ht);
59 * Remove all entries from the hash table.
60 * @param ht pointer to hash table
63 void HASHPREFIX(Empty)(HASHTYPE ht);
66 * Calculate hash for key.
67 * @param @ht pointer to hash table
71 unsigned int HASHPREFIX(KeyHash)(HASHTYPE ht, HTKEYTYPE key);
74 * Add item to hash table.
75 * @param ht pointer to hash table
77 * @param data data value
80 void HASHPREFIX(AddEntry)(HASHTYPE ht, HTKEYTYPE key
86 /* Add item to hash table with precalculated key hash. */
88 void HASHPREFIX(AddHEntry)(HASHTYPE ht, HTKEYTYPE key, unsigned int keyHash
95 * Retrieve item from hash table.
96 * @param ht pointer to hash table
97 * @param key key value
98 * @retval data address to store data value from bucket
99 * @retval dataCount address to store data value size from bucket
100 * @retval tableKey address to store key value from bucket (may be NULL)
101 * @return 1 on success, 0 if the item is not found.
104 int HASHPREFIX(GetEntry)(HASHTYPE ht, HTKEYTYPE key,
109 HTKEYTYPE* tableKey);
111 /* Retrieve item from hash table with precalculated key hash. */
113 int HASHPREFIX(GetHEntry)(HASHTYPE ht, HTKEYTYPE key, unsigned int keyHash,
118 HTKEYTYPE* tableKey);
121 * Check for key in hash table.
122 * @param ht pointer to hash table
123 * @param key key value
124 * @return 1 if the key is present, 0 otherwise
127 int HASHPREFIX(HasEntry)(HASHTYPE ht, HTKEYTYPE key);
129 /* Check for key in hash table with precalculated key hash. */
131 int HASHPREFIX(HasHEntry)(HASHTYPE ht, HTKEYTYPE key, unsigned int keyHash);
134 * How many buckets are currently allocated (result is implementation
136 * @param ht pointer to hash table
137 * @result number of buckets allocated
140 unsigned int HASHPREFIX(NumBuckets)(HASHTYPE ht);
143 * How many buckets are used (result is implementation dependent)
144 * @param ht pointer to hash table
145 * @result number of buckets used
148 unsigned int HASHPREFIX(UsedBuckets)(HASHTYPE ht);
151 * How many (unique) keys have been added to the hash table
152 * @param ht pointer to hash table
153 * @result number of unique keys
156 unsigned int HASHPREFIX(NumKeys)(HASHTYPE ht);
160 * How many data entries have been added to the hash table
161 * @param ht pointer to hash table
162 * @result number of data entries
165 unsigned int HASHPREFIX(NumData)(HASHTYPE ht);
169 * Print statistics about the hash to stderr
170 * This is for debugging only
171 * @param ht pointer to hash table
174 void HASHPREFIX(PrintStats)(HASHTYPE ht);