75 lines
1.9 KiB
C
75 lines
1.9 KiB
C
#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
|
|
|