1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
#ifndef H_HASH
#define H_HASH
/** \file lib/hash.h
* Hash table implemenation.
*/
typedef struct hashTable_s * hashTable;
#ifdef __cplusplus
extern "C" {
#endif
/** */
typedef unsigned int (*hashFunctionType) (const void * string) /*@*/;
/** */
typedef int (*hashEqualityType) (const void * key1, const void * key2) /*@*/;
/**
* Return hash value of a string
* @param string string on which to calculate hash value
* @return hash value
*/
unsigned int hashFunctionString(const void * string) /*@*/;
/**
* Compare two hash table entries for equality.
* @param key1 entry 1
* @param key2 entry 2
* @return 0 if entries are equal
*/
int hashEqualityString(const void * key1, const void * key2) /*@*/;
/**
* Create hash table.
* If keySize > 0, the key is duplicated within the table (which costs
* memory, but may be useful anyway.
* @param numBuckets number of hash buckets
* @param keySize size of key (0 if unknown)
* @param freeData should data be freed when table is destroyed?
* @param fn function to generate hash value for key
* @param eq function to compare hash keys for equality
* @return pointer to initialized hash table
*/
hashTable htCreate(int numBuckets, int keySize, int freeData,
hashFunctionType fn, hashEqualityType eq) /*@*/;
/**
* Destroy hash table.
* @param ht pointer to hash table
*/
void htFree( /*@only@*/ hashTable ht);
/**
* Add item to hash table.
* @param ht pointer to hash table
* @param key pointer to key
* @param data pointer to data value
*/
void htAddEntry(hashTable ht, /*@owned@*/ const void * key,
/*@owned@*/ const void * data) /*@modifies ht */;
/**
* Retrieve item from hash table.
* @param ht pointer to hash table
* @param key pointer to key value
* @retval data address to store data value from bucket
* @retval dataCount address to store data value size from bucket
* @retval tableKey address to store key value from bucket (may be NULL)
* @return 0 on success, 1 if the item is not found.
*/
int htGetEntry(hashTable ht, const void * key, /*@out@*/ const void *** data,
/*@out@*/ int * dataCount, /*@out@*/ const void ** tableKey)
/*@modifies *data, *dataCount, *tableKey @*/;
/**
* Check for key in hash table.
* @param ht pointer to hash table
* @param key pointer to key value
* @return 1 if the key is present, 0 otherwise
*/
int htHasEntry(hashTable ht, const void * key) /*@*/;
#ifdef __cplusplus
}
#endif
#endif
|