]> git.saurik.com Git - redis.git/commitdiff
added an union in the dict.h structure to store 64 bit integers directly into hash...
authorantirez <antirez@gmail.com>
Wed, 2 Nov 2011 14:28:45 +0000 (15:28 +0100)
committerantirez <antirez@gmail.com>
Wed, 2 Nov 2011 14:28:45 +0000 (15:28 +0100)
src/dict.c
src/dict.h

index 24001fdd0a520098eaecdc00bc893d2761968a40..f98fdd0ee78c818b315158cabf7ae4ea0b9ecc04 100644 (file)
@@ -270,7 +270,7 @@ int dictAdd(dict *d, void *key, void *val)
     if ((index = _dictKeyIndex(d, key)) == -1)
         return DICT_ERR;
 
-    /* Allocates the memory and stores key */
+    /* Allocate the memory and store the new entry */
     ht = dictIsRehashing(d) ? &d->ht[1] : &d->ht[0];
     entry = zmalloc(sizeof(*entry));
     entry->next = ht->table[index];
@@ -297,7 +297,6 @@ int dictReplace(dict *d, void *key, void *val)
         return 1;
     /* It already exists, get the entry */
     entry = dictFind(d, key);
-    /* Free the old value and set the new one */
     /* Set the new value and free the old one. Note that it is important
      * to do that in this order, as the value may just be exactly the same
      * as the previous one. In this context, think to reference counting,
index 74bcd2aad67531c9c08a1360736a98c740a8e284..31cd65646c12f72658231328f745d9495754decc 100644 (file)
@@ -33,6 +33,8 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include <stdint.h>
+
 #ifndef __DICT_H
 #define __DICT_H
 
 
 typedef struct dictEntry {
     void *key;
-    void *val;
+    union {
+        void *val;
+        uint64_t u64;
+        int64_t i64;
+    } v;
     struct dictEntry *next;
 } dictEntry;
 
@@ -90,13 +96,13 @@ typedef struct dictIterator {
 /* ------------------------------- Macros ------------------------------------*/
 #define dictFreeEntryVal(d, entry) \
     if ((d)->type->valDestructor) \
-        (d)->type->valDestructor((d)->privdata, (entry)->val)
+        (d)->type->valDestructor((d)->privdata, (entry)->v.val)
 
 #define dictSetHashVal(d, entry, _val_) do { \
     if ((d)->type->valDup) \
-        entry->val = (d)->type->valDup((d)->privdata, _val_); \
+        entry->v.val = (d)->type->valDup((d)->privdata, _val_); \
     else \
-        entry->val = (_val_); \
+        entry->v.val = (_val_); \
 } while(0)
 
 #define dictFreeEntryKey(d, entry) \
@@ -118,7 +124,7 @@ typedef struct dictIterator {
 #define dictHashKey(d, key) (d)->type->hashFunction(key)
 
 #define dictGetEntryKey(he) ((he)->key)
-#define dictGetEntryVal(he) ((he)->val)
+#define dictGetEntryVal(he) ((he)->v.val)
 #define dictSlots(d) ((d)->ht[0].size+(d)->ht[1].size)
 #define dictSize(d) ((d)->ht[0].used+(d)->ht[1].used)
 #define dictIsRehashing(ht) ((ht)->rehashidx != -1)