*/
struct Bucket_s {
HTKEYTYPE key; /*!< hash key */
+#ifdef HTDATATYPE
HTDATATYPE * data; /*!< pointer to hashed data */
int dataCount; /*!< length of data (0 if unknown) */
+#endif
Bucket next; /*!< pointer to next item in bucket */
};
hashFunctionType fn; /*!< generate hash value for key */
hashEqualityType eq; /*!< compare hash keys for equality */
hashFreeKey freeKey;
+#ifdef HTDATATYPE
hashFreeData freeData;
+#endif
};
/**
HASHTYPE HASHPREFIX(Create)(int numBuckets,
hashFunctionType fn, hashEqualityType eq,
- hashFreeKey freeKey, hashFreeData freeData)
+ hashFreeKey freeKey
+#ifdef HTDATATYPE
+, hashFreeData freeData
+#endif
+)
{
HASHTYPE ht;
ht->numBuckets = numBuckets;
ht->buckets = xcalloc(numBuckets, sizeof(*ht->buckets));
ht->freeKey = freeKey;
+#ifdef HTDATATYPE
ht->freeData = freeData;
+#endif
ht->fn = fn;
ht->eq = eq;
return ht;
}
-void HASHPREFIX(AddEntry)(HASHTYPE ht, HTKEYTYPE key, HTDATATYPE data)
+void HASHPREFIX(AddEntry)(HASHTYPE ht, HTKEYTYPE key
+#ifdef HTDATATYPE
+, HTDATATYPE data
+#endif
+)
{
unsigned int hash;
Bucket b;
if (b == NULL) {
b = xmalloc(sizeof(*b));
b->key = key;
+#ifdef HTDATATYPE
b->dataCount = 0;
- b->next = ht->buckets[hash];
b->data = NULL;
+#endif
+ b->next = ht->buckets[hash];
ht->buckets[hash] = b;
}
+#ifdef HTDATATYPE
b->data = xrealloc(b->data, sizeof(*b->data) * (b->dataCount + 1));
b->data[b->dataCount++] = data;
+#endif
}
HASHTYPE HASHPREFIX(Free)(HASHTYPE ht)
{
Bucket b, n;
- int i, j;
+ int i;
for (i = 0; i < ht->numBuckets; i++) {
b = ht->buckets[i];
do {
n = b->next;
+#ifdef HTDATATYPE
if (b->data) {
if (ht->freeData) {
+ int j;
for (j=0; j < b->dataCount; j++ ) {
b->data[j] = ht->freeData(b->data[j]);
}
}
b->data = _free(b->data);
}
+#endif
b = _free(b);
} while ((b = n) != NULL);
}
if (!(b = HASHPREFIX(findEntry)(ht, key))) return 0; else return 1;
}
+#ifdef HTDATATYPE
+
int HASHPREFIX(GetEntry)(HASHTYPE ht, HTKEYTYPE key, HTDATATYPE** data,
int * dataCount, HTKEYTYPE* tableKey)
{
int buckets = 0;
for (bucket=ht->buckets[i]; bucket; bucket=bucket->next){
buckets++;
+#ifdef HTDATATYPE
datacnt += bucket->dataCount;
+#endif
}
if (maxbuckets < buckets) maxbuckets = buckets;
if (buckets) hashcnt++;
fprintf(stderr, "Values: %i\n", datacnt);
fprintf(stderr, "Max Keys/Bucket: %i\n", maxbuckets);
}
+
+#endif
#define hashFunctionType JOIN(HASHTYPE,HashFunctionType)
#define hashEqualityType JOIN(HASHTYPE,HashEqualityType)
#define hashFreeKey JOIN(HASHTYPE,FreeKey)
-#define hashFreeData JOIN(HASHTYPE,FreeData)
typedef unsigned int (*hashFunctionType) (HTKEYTYPE string);
typedef int (*hashEqualityType) (HTKEYTYPE key1, HTKEYTYPE key2);
typedef HTKEYTYPE (*hashFreeKey) (HTKEYTYPE);
+
+#ifdef HTDATATYPE
+#define hashFreeData JOIN(HASHTYPE,FreeData)
typedef HTDATATYPE (*hashFreeData) (HTDATATYPE);
+#endif
/**
* Create hash table.
RPM_GNUC_INTERNAL
HASHTYPE HASHPREFIX(Create)(int numBuckets,
hashFunctionType fn, hashEqualityType eq,
- hashFreeKey freeKey, hashFreeData freeData);
+ hashFreeKey freeKey
+#ifdef HTDATATYPE
+, hashFreeData freeData
+#endif
+);
/**
* Destroy hash table.
* @param data data value
*/
RPM_GNUC_INTERNAL
-void HASHPREFIX(AddEntry)(HASHTYPE ht, HTKEYTYPE key, HTDATATYPE data);
+void HASHPREFIX(AddEntry)(HASHTYPE ht, HTKEYTYPE key
+#ifdef HTDATATYPE
+, HTDATATYPE data
+#endif
+);
+
+#ifdef HTDATATYPE
/**
* Retrieve item from hash table.
HTDATATYPE** data,
int * dataCount,
HTKEYTYPE* tableKey);
+#endif
/**
* Check for key in hash table.