|
|
|
@ -40,6 +40,12 @@
|
|
|
|
|
#include <limits.h>
|
|
|
|
|
#include "dict.h"
|
|
|
|
|
|
|
|
|
|
#ifdef __GNUC__
|
|
|
|
|
#define __UNUSED_FUNCTION__ __attribute__ ((unused))
|
|
|
|
|
#else
|
|
|
|
|
#define __UNUSED_FUNCTION__
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* -------------------------- private prototypes ---------------------------- */
|
|
|
|
|
|
|
|
|
|
static int _dictExpandIfNeeded(dict *ht);
|
|
|
|
@ -51,6 +57,7 @@ static int _dictInit(dict *ht, dictType *type, void *privDataPtr);
|
|
|
|
|
|
|
|
|
|
/* Generic hash function (a popular one from Bernstein).
|
|
|
|
|
* I tested a few and this was the best. */
|
|
|
|
|
__UNUSED_FUNCTION__
|
|
|
|
|
static unsigned int dictGenHashFunction(const unsigned char *buf, int len) {
|
|
|
|
|
unsigned int hash = 5381;
|
|
|
|
|
|
|
|
|
@ -71,6 +78,7 @@ static void _dictReset(dict *ht) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Create a new hash table */
|
|
|
|
|
__UNUSED_FUNCTION__
|
|
|
|
|
static dict *dictCreate(dictType *type, void *privDataPtr) {
|
|
|
|
|
dict *ht = hi_malloc(sizeof(*ht));
|
|
|
|
|
if (ht == NULL)
|
|
|
|
@ -166,6 +174,7 @@ static int dictAdd(dict *ht, void *key, void *val) {
|
|
|
|
|
* Return 1 if the key was added from scratch, 0 if there was already an
|
|
|
|
|
* element with such key and dictReplace() just performed a value update
|
|
|
|
|
* operation. */
|
|
|
|
|
__UNUSED_FUNCTION__
|
|
|
|
|
static int dictReplace(dict *ht, void *key, void *val) {
|
|
|
|
|
dictEntry *entry, auxentry;
|
|
|
|
|
|
|
|
|
@ -191,6 +200,7 @@ static int dictReplace(dict *ht, void *key, void *val) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Search and remove an element */
|
|
|
|
|
__UNUSED_FUNCTION__
|
|
|
|
|
static int dictDelete(dict *ht, const void *key) {
|
|
|
|
|
unsigned int h;
|
|
|
|
|
dictEntry *de, *prevde;
|
|
|
|
@ -247,6 +257,7 @@ static int _dictClear(dict *ht) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Clear & Release the hash table */
|
|
|
|
|
__UNUSED_FUNCTION__
|
|
|
|
|
static void dictRelease(dict *ht) {
|
|
|
|
|
_dictClear(ht);
|
|
|
|
|
hi_free(ht);
|
|
|
|
@ -267,6 +278,7 @@ static dictEntry *dictFind(dict *ht, const void *key) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
__UNUSED_FUNCTION__
|
|
|
|
|
static dictIterator *dictGetIterator(dict *ht) {
|
|
|
|
|
dictIterator *iter = hi_malloc(sizeof(*iter));
|
|
|
|
|
if (iter == NULL)
|
|
|
|
@ -279,6 +291,7 @@ static dictIterator *dictGetIterator(dict *ht) {
|
|
|
|
|
return iter;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
__UNUSED_FUNCTION__
|
|
|
|
|
static dictEntry *dictNext(dictIterator *iter) {
|
|
|
|
|
while (1) {
|
|
|
|
|
if (iter->entry == NULL) {
|
|
|
|
@ -299,6 +312,7 @@ static dictEntry *dictNext(dictIterator *iter) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
__UNUSED_FUNCTION__
|
|
|
|
|
static void dictReleaseIterator(dictIterator *iter) {
|
|
|
|
|
hi_free(iter);
|
|
|
|
|
}
|
|
|
|
|