|
- #pragma once
-
- #if defined (__cplusplus)
- extern "C" {
- #endif
-
- #if !defined (__VMS) \
- && (defined (__cplusplus) \
- || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */))
- # include <stdint.h>
- #else
- typedef unsigned int uint32_t;
- #endif
-
- typedef struct HashTableElement
- {
- uint32_t key_length;
- uint32_t value_length;
- void *key;
- void *value;
- HashTableElement *next;
- } HashTableElement;
-
- typedef struct Table
- {
- HashTableElement** ds;
- uint32_t tc;
- } Table;
-
- typedef enum
- {
- kReferenceMode = 0,
- kCopyMode
- } TableMode;
-
- typedef struct HashTable
- {
- int (*kc)(const void *key1, uint32_t key1_length, const void *key2, uint32_t key2_length);
- Table tables[2];
- uint32_t used;
- uint32_t max;
- uint32_t min;
- uint32_t rehashidx;
- uint32_t seed;
- TableMode table_mode;
- } HashTable;
-
- typedef enum
- {
- kMode1 = 0,
- kMode2
- } SetMode;
-
- HashTable* HashTable_New(HashTable *o, uint32_t n, TableMode mode);
- void HashTable_Delete(HashTable *o);
-
- int HashTable_SetWithMode(HashTable *o, const void* key, uint32_t kl, void* val, uint32_t vl, SetMode smode);
- #define HashTable_Set(o,key,kl,val,vl) HashTable_SetWithMode(o,key,kl,val,vl,kMode1)
- #define HashTable_Setnx(o,key,kl,val,vl) HashTable_SetWithMode(o,key,kl,val,vl,kMode2)
- void* HashTable_Lookup(HashTable *o, const void* key, uint32_t kl);
- #define HashTable_Get(o,key,kl) HashTable_Lookup(o,key,kl)
- int HashTable_Remove(HashTable *o, const void* key, uint32_t kl);
- HashTableElement *HashTable_Elements(HashTable *o, TableMode tmode);
- void HashTable_RemoveElements(HashTableElement *elems, TableMode tmode);
- void HashTable_RehashWithSeed(HashTable *o, uint32_t seed);
- void HashTable_Rehash(HashTable *o);
- void HashTable_SetCompareFunc(HashTable *o, int (*kc_func)(const void*, uint32_t, const void*, uint32_t));
-
- // TODO: HashTableIter, HashTableIter_Begin, HashTableIter_Next, HashTableIter_End
-
- #if defined (__cplusplus)
- }
- #endif
|