From 6a7841eb099e8f92bb2c321e87e2b1f4724ddaed Mon Sep 17 00:00:00 2001 From: antirez Date: Wed, 2 Nov 2011 15:28:45 +0100 Subject: [PATCH] added an union in the dict.h structure to store 64 bit integers directly into hash table entries. --- src/dict.c | 3 +-- src/dict.h | 16 +++++++++++----- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/dict.c b/src/dict.c index 24001fdd..f98fdd0e 100644 --- a/src/dict.c +++ b/src/dict.c @@ -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, diff --git a/src/dict.h b/src/dict.h index 74bcd2aa..31cd6564 100644 --- a/src/dict.h +++ b/src/dict.h @@ -33,6 +33,8 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include + #ifndef __DICT_H #define __DICT_H @@ -44,7 +46,11 @@ 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)