From c84248b5d2fba04e5056bad32a5d29a5fc906e8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Viktor=20S=C3=B6derqvist?= Date: Wed, 11 Jan 2023 09:57:10 +0100 Subject: Make dictEntry opaque Use functions for all accesses to dictEntry (except in dict.c). Dict abuses e.g. in defrag.c have been replaced by support functions provided by dict. --- src/dict.h | 76 +++++++++++++++++++------------------------------------------- 1 file changed, 23 insertions(+), 53 deletions(-) (limited to 'src/dict.h') diff --git a/src/dict.h b/src/dict.h index 00b721d3d..a7ee282da 100644 --- a/src/dict.h +++ b/src/dict.h @@ -44,19 +44,7 @@ #define DICT_OK 0 #define DICT_ERR 1 -typedef struct dictEntry { - void *key; - union { - void *val; - uint64_t u64; - int64_t s64; - double d; - } v; - struct dictEntry *next; /* Next entry in the same hash bucket. */ - void *metadata[]; /* An arbitrary number of bytes (starting at a - * pointer-aligned address) of size as returned - * by dictType's dictEntryMetadataBytes(). */ -} dictEntry; +typedef struct dictEntry dictEntry; /* opaque */ typedef struct dict dict; @@ -112,60 +100,22 @@ typedef void (dictScanBucketFunction)(dict *d, dictEntry **bucketref); /* ------------------------------- Macros ------------------------------------*/ #define dictFreeVal(d, entry) do { \ if ((d)->type->valDestructor) \ - (d)->type->valDestructor((d), (entry)->v.val); \ + (d)->type->valDestructor((d), dictGetVal(entry)); \ } while(0) -#define dictSetVal(d, entry, _val_) do { \ - if ((d)->type->valDup) \ - (entry)->v.val = (d)->type->valDup((d), _val_); \ - else \ - (entry)->v.val = (_val_); \ -} while(0) - -#define dictSetSignedIntegerVal(entry, _val_) \ - do { (entry)->v.s64 = _val_; } while(0) - -#define dictSetUnsignedIntegerVal(entry, _val_) \ - do { (entry)->v.u64 = _val_; } while(0) - -#define dictSetDoubleVal(entry, _val_) \ - do { (entry)->v.d = _val_; } while(0) - -#define dictIncrSignedIntegerVal(entry, _val_) \ - ((entry)->v.s64 += _val_) - -#define dictIncrUnsignedIntegerVal(entry, _val_) \ - ((entry)->v.u64 += _val_) - -#define dictIncrDoubleVal(entry, _val_) \ - ((entry)->v.d += _val_) - #define dictFreeKey(d, entry) \ if ((d)->type->keyDestructor) \ - (d)->type->keyDestructor((d), (entry)->key) - -#define dictSetKey(d, entry, _key_) do { \ - if ((d)->type->keyDup) \ - (entry)->key = (d)->type->keyDup((d), _key_); \ - else \ - (entry)->key = (_key_); \ -} while(0) + (d)->type->keyDestructor((d), dictGetKey(entry)) #define dictCompareKeys(d, key1, key2) \ (((d)->type->keyCompare) ? \ (d)->type->keyCompare((d), key1, key2) : \ (key1) == (key2)) -#define dictMetadata(entry) (&(entry)->metadata) #define dictMetadataSize(d) ((d)->type->dictEntryMetadataBytes \ ? (d)->type->dictEntryMetadataBytes(d) : 0) #define dictHashKey(d, key) ((d)->type->hashFunction(key)) -#define dictGetKey(he) ((he)->key) -#define dictGetVal(he) ((he)->v.val) -#define dictGetSignedIntegerVal(he) ((he)->v.s64) -#define dictGetUnsignedIntegerVal(he) ((he)->v.u64) -#define dictGetDoubleVal(he) ((he)->v.d) #define dictSlots(d) (DICTHT_SIZE((d)->ht_size_exp[0])+DICTHT_SIZE((d)->ht_size_exp[1])) #define dictSize(d) ((d)->ht_used[0]+(d)->ht_used[1]) #define dictIsRehashing(d) ((d)->rehashidx != -1) @@ -202,6 +152,26 @@ void dictRelease(dict *d); dictEntry * dictFind(dict *d, const void *key); void *dictFetchValue(dict *d, const void *key); int dictResize(dict *d); +void dictSetKey(dict *d, dictEntry* de, void *key); +void dictSetVal(dict *d, dictEntry *de, void *val); +void dictSetSignedIntegerVal(dictEntry *de, int64_t val); +void dictSetUnsignedIntegerVal(dictEntry *de, uint64_t val); +void dictSetDoubleVal(dictEntry *de, double val); +int64_t dictIncrSignedIntegerVal(dictEntry *de, int64_t val); +uint64_t dictIncrUnsignedIntegerVal(dictEntry *de, uint64_t val); +double dictIncrDoubleVal(dictEntry *de, double val); +void dictSetNext(dictEntry *de, dictEntry *next); +void *dictMetadata(dictEntry *de); +void *dictGetKey(const dictEntry *de); +void *dictGetVal(const dictEntry *de); +int64_t dictGetSignedIntegerVal(const dictEntry *de); +uint64_t dictGetUnsignedIntegerVal(const dictEntry *de); +double dictGetDoubleVal(const dictEntry *de); +double *dictGetDoubleValPtr(dictEntry *de); +dictEntry *dictGetNext(const dictEntry *de); +dictEntry **dictGetNextRef(dictEntry *de); +size_t dictMemUsage(const dict *d); +size_t dictEntryMemUsage(void); dictIterator *dictGetIterator(dict *d); dictIterator *dictGetSafeIterator(dict *d); void dictInitIterator(dictIterator *iter, dict *d); -- cgit v1.2.1