From 88db14fc6e116c67c42c9b56122e2163399994d2 Mon Sep 17 00:00:00 2001 From: Florian Festi Date: Wed, 5 Nov 2008 15:11:55 +0100 Subject: [PATCH] Support leaving HTDATATYPE undefined to use hash as key only hash (set) --- lib/rpmhash.C | 35 +++++++++++++++++++++++++++++++---- lib/rpmhash.H | 20 +++++++++++++++++--- 2 files changed, 48 insertions(+), 7 deletions(-) diff --git a/lib/rpmhash.C b/lib/rpmhash.C index a631074..907ea86 100644 --- a/lib/rpmhash.C +++ b/lib/rpmhash.C @@ -15,8 +15,10 @@ typedef struct Bucket_s * Bucket; */ 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 */ }; @@ -28,7 +30,9 @@ struct HASHSTRUCT { hashFunctionType fn; /*!< generate hash value for key */ hashEqualityType eq; /*!< compare hash keys for equality */ hashFreeKey freeKey; +#ifdef HTDATATYPE hashFreeData freeData; +#endif }; /** @@ -54,7 +58,11 @@ Bucket HASHPREFIX(findEntry)(HASHTYPE ht, HTKEYTYPE key) HASHTYPE HASHPREFIX(Create)(int numBuckets, hashFunctionType fn, hashEqualityType eq, - hashFreeKey freeKey, hashFreeData freeData) + hashFreeKey freeKey +#ifdef HTDATATYPE +, hashFreeData freeData +#endif +) { HASHTYPE ht; @@ -62,13 +70,19 @@ HASHTYPE HASHPREFIX(Create)(int numBuckets, 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; @@ -82,20 +96,24 @@ void HASHPREFIX(AddEntry)(HASHTYPE ht, HTKEYTYPE key, HTDATATYPE data) 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]; @@ -107,14 +125,17 @@ HASHTYPE HASHPREFIX(Free)(HASHTYPE ht) 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); } @@ -132,6 +153,8 @@ int HASHPREFIX(HasEntry)(HASHTYPE ht, HTKEYTYPE key) 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) { @@ -159,7 +182,9 @@ void HASHPREFIX(PrintStats)(HASHTYPE ht) { 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++; @@ -171,3 +196,5 @@ void HASHPREFIX(PrintStats)(HASHTYPE ht) { fprintf(stderr, "Values: %i\n", datacnt); fprintf(stderr, "Max Keys/Bucket: %i\n", maxbuckets); } + +#endif diff --git a/lib/rpmhash.H b/lib/rpmhash.H index 3e5c007..e6fcd29 100644 --- a/lib/rpmhash.H +++ b/lib/rpmhash.H @@ -17,12 +17,15 @@ typedef struct HASHSTRUCT * HASHTYPE; #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. @@ -38,7 +41,11 @@ typedef HTDATATYPE (*hashFreeData) (HTDATATYPE); 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. @@ -55,7 +62,13 @@ HASHTYPE HASHPREFIX(Free)( HASHTYPE ht); * @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. @@ -71,6 +84,7 @@ int HASHPREFIX(GetEntry)(HASHTYPE ht, HTKEYTYPE key, HTDATATYPE** data, int * dataCount, HTKEYTYPE* tableKey); +#endif /** * Check for key in hash table. -- 2.7.4