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 * Add item to hash table.
60 * @param ht pointer to hash table
62 * @param data data value
65 void HASHPREFIX(AddEntry)(HASHTYPE ht, HTKEYTYPE key
74 * Retrieve item from hash table.
75 * @param ht pointer to hash table
76 * @param key key value
77 * @retval data address to store data value from bucket
78 * @retval dataCount address to store data value size from bucket
79 * @retval tableKey address to store key value from bucket (may be NULL)
80 * @return 1 on success, 0 if the item is not found.
83 int HASHPREFIX(GetEntry)(HASHTYPE ht, HTKEYTYPE key,
90 * Check for key in hash table.
91 * @param ht pointer to hash table
92 * @param key key value
93 * @return 1 if the key is present, 0 otherwise
96 int HASHPREFIX(HasEntry)(HASHTYPE ht, HTKEYTYPE key);
99 * Print statistics about the hash to stderr
100 * This is for debugging only
101 * @param ht pointer to hash table
104 void HASHPREFIX(PrintStats)(HASHTYPE ht);