2 //metadoc SHash copyright Steve Dekorte 2002, Marc Fauconneau 2007
3 //metadoc SHash license BSD revised
4 /*metadoc SHash description
6 keys and values are references (they are not copied or freed)
7 key pointers are assumed unique
11 #define SHASH_DEFINED 1
28 typedef int (SHashKeysEqualCallback
)(void *, void *);
29 typedef intptr_t (SHashHashforKeyCallback
)(void *);
33 SHashRecord
*records
; // contains the two tables
35 unsigned int log2tableSize
; // log2(tableSize)
36 unsigned int tableSize
; // total number of records per table
37 unsigned int numKeys
; // number of used records
39 unsigned int mask
; // hash bit mask
40 SHashRecord nullRecord
; // for lookup misses
41 unsigned int balance
; // to balance tables
42 SHashKeysEqualCallback
*keysEqual
;
43 SHashHashforKeyCallback
*hashForKey
;
47 //#define SHash_mask(self) (self->tableSize-1)
48 #define SHash_maxLoops(self) (self->tableSize < 20 ? self->tableSize : 20)
49 #define SHash_maxKeys(self) (self->tableSize)
50 #define SHash_setKeysEqualCallback(self, v) (self->keysEqual = v)
51 #define SHash_setHashForKeyCallback(self, v) (self->hashForKey = v)
53 BASEKIT_API
void SHash_print(SHash
*self
); // to debug
55 BASEKIT_API SHash
*SHash_new(void);
56 BASEKIT_API
void SHash_free(SHash
*self
);
57 BASEKIT_API SHash
*SHash_clone(SHash
*self
);
58 BASEKIT_API
void SHash_copy_(SHash
*self
, SHash
*other
);
60 BASEKIT_API SHashRecord
* SHash_cuckoo_(SHash
*self
, SHashRecord
* record
);
61 BASEKIT_API
void SHash_grow(SHash
*self
);
62 BASEKIT_API
void SHash_growWithRecord(SHash
*self
, SHashRecord
* record
);
64 BASEKIT_API
size_t SHash_memorySize(SHash
*self
);
65 BASEKIT_API
void SHash_compact(SHash
*self
);
67 BASEKIT_API
unsigned int SHash_count(SHash
*self
);
68 BASEKIT_API
unsigned int SHash_countRecords_size_(unsigned char *records
, unsigned int size
);
70 BASEKIT_API
void *SHash_firstKeyForValue_(SHash
*self
, void *v
);
72 BASEKIT_API
void SHash_removeValue_(SHash
*self
, void *value
);
74 #include "SHash_inline.h"