summaryrefslogtreecommitdiff
path: root/src/dict.h
diff options
context:
space:
mode:
authorViktor Söderqvist <viktor.soderqvist@est.tech>2023-01-11 09:57:10 +0100
committerViktor Söderqvist <viktor.soderqvist@est.tech>2023-01-11 09:59:24 +0100
commitc84248b5d2fba04e5056bad32a5d29a5fc906e8c (patch)
treeeb124954279832505715f2a76d2634ac99d8550e /src/dict.h
parent25dc3b07571469a5fb004aa817a3852ade2f840f (diff)
downloadredis-c84248b5d2fba04e5056bad32a5d29a5fc906e8c.tar.gz
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.
Diffstat (limited to 'src/dict.h')
-rw-r--r--src/dict.h76
1 files changed, 23 insertions, 53 deletions
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);