Support leaving HTDATATYPE undefined to use hash as key only hash (set)
authorFlorian Festi <ffesti@redhat.com>
Wed, 5 Nov 2008 14:11:55 +0000 (15:11 +0100)
committerFlorian Festi <ffesti@redhat.com>
Mon, 24 Nov 2008 13:03:16 +0000 (14:03 +0100)
lib/rpmhash.C
lib/rpmhash.H

index a631074..907ea86 100644 (file)
@@ -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
index 3e5c007..e6fcd29 100644 (file)
@@ -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.