toys/simple-http-server-c/source/hashtable.h

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