X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/2612e0521fde55db2c720092d4ad02a8f015f46e..0f07781538a4cb0249c70045ec4c83011defd923:/src/dict.h diff --git a/src/dict.h b/src/dict.h index 25cce4e5..5f856953 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 s64; + } v; struct dictEntry *next; } dictEntry; @@ -74,10 +80,13 @@ typedef struct dict { int iterators; /* number of iterators currently running */ } dict; +/* If safe is set to 1 this is a safe iteartor, that means, you can call + * dictAdd, dictFind, and other functions against the dictionary even while + * iterating. Otherwise it is a non safe iterator, and only dictNext() + * should be called while iterating. */ typedef struct dictIterator { dict *d; - int table; - int index; + int table, index, safe; dictEntry *entry, *nextEntry; } dictIterator; @@ -85,37 +94,44 @@ typedef struct dictIterator { #define DICT_HT_INITIAL_SIZE 4 /* ------------------------------- Macros ------------------------------------*/ -#define dictFreeEntryVal(d, entry) \ +#define dictFreeVal(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 { \ +#define dictSetVal(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) \ +#define dictSetSignedIntegerVal(entry, _val_) \ + do { entry->v.s64 = _val_; } while(0) + +#define dictSetUnsignedIntegerVal(entry, _val_) \ + do { entry->v.u64 = _val_; } while(0) + +#define dictFreeKey(d, entry) \ if ((d)->type->keyDestructor) \ (d)->type->keyDestructor((d)->privdata, (entry)->key) -#define dictSetHashKey(d, entry, _key_) do { \ +#define dictSetKey(d, entry, _key_) do { \ if ((d)->type->keyDup) \ entry->key = (d)->type->keyDup((d)->privdata, _key_); \ else \ entry->key = (_key_); \ } while(0) -#define dictCompareHashKeys(d, key1, key2) \ +#define dictCompareKeys(d, key1, key2) \ (((d)->type->keyCompare) ? \ (d)->type->keyCompare((d)->privdata, key1, key2) : \ (key1) == (key2)) #define dictHashKey(d, key) (d)->type->hashFunction(key) - -#define dictGetEntryKey(he) ((he)->key) -#define dictGetEntryVal(he) ((he)->val) +#define dictGetKey(he) ((he)->key) +#define dictGetVal(he) ((he)->v.val) +#define dictGetSignedIntegerVal(he) ((he)->v.s64) +#define dictGetUnsignedIntegerVal(he) ((he)->v.u64) #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) @@ -124,7 +140,9 @@ typedef struct dictIterator { dict *dictCreate(dictType *type, void *privDataPtr); int dictExpand(dict *d, unsigned long size); int dictAdd(dict *d, void *key, void *val); +dictEntry *dictAddRaw(dict *d, void *key); int dictReplace(dict *d, void *key, void *val); +dictEntry *dictReplaceRaw(dict *d, void *key); int dictDelete(dict *d, const void *key); int dictDeleteNoFree(dict *d, const void *key); void dictRelease(dict *d); @@ -132,6 +150,7 @@ dictEntry * dictFind(dict *d, const void *key); void *dictFetchValue(dict *d, const void *key); int dictResize(dict *d); dictIterator *dictGetIterator(dict *d); +dictIterator *dictGetSafeIterator(dict *d); dictEntry *dictNext(dictIterator *iter); void dictReleaseIterator(dictIterator *iter); dictEntry *dictGetRandomKey(dict *d); @@ -143,6 +162,8 @@ void dictEnableResize(void); void dictDisableResize(void); int dictRehash(dict *d, int n); int dictRehashMilliseconds(dict *d, int ms); +void dictSetHashFunctionSeed(unsigned int initval); +unsigned int dictGetHashFunctionSeed(void); /* Hash table types */ extern dictType dictTypeHeapStringCopyKey;