summaryrefslogtreecommitdiff
path: root/rpmdb/rpmhash.h
blob: 5e840bd5afaa365a1a13e6c6ce8512c7c7f2936f (plain)
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
89
90
91
92
93
94
95
96
#ifndef H_RPMHASH
#define H_RPMHASH

/**
 * \file rpmdb/rpmhash.h
 * Hash table implemenation.
 */

#ifdef __cplusplus
extern "C" {
#endif

/**
 */
typedef struct hashTable_s * hashTable;

/**
 */
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, size_t keySize, int freeData,
		hashFunctionType fn, hashEqualityType eq); 

/**
 * Destroy hash table.
 * @param ht            pointer to hash table
 * @return		NULL always
 */
hashTable htFree( 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, const void * key,
		const void * data);

/**
 * 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,
		const void *** data,
		int * dataCount,
		const void ** 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