CAlgHashList.h
#ifndef _C_ALG_HASH_LIST_H_
#define _C_ALG_HASH_LIST_H_
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "CAlgShareList.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct{
unsigned int k_size;
unsigned int v_size;
unsigned int max_count;
unsigned int trunk_size;
unsigned int trunk_mask;
CAlgShareList free_list;
#ifdef WIN32
#pragma warning(disable:4200)
#endif
CAlgShareList hlist[0];
#ifdef WIN32
#pragma warning(default:4200)
#endif
}CAlgHashList;
typedef struct{
int pos;
CAlgShareList *list;
CAlgShareNode *node_base; //node base address
unsigned char *kv_base; //kv base address
unsigned char *kv;
}HashListRC;
typedef unsigned int (*Alg_Hash_F)(const void* k, unsigned int size);
static inline unsigned int CAlgHashList_Pow2(unsigned int mask)
{
int order = 31;
while((mask & (1<< order))== 0 && order > 0)
order --;
return 1 << order;
}
static inline unsigned int CAlgHashList_MemSize(unsigned int key_size, unsigned int val_size,
unsigned int trunk_size, unsigned int max_count)
{
//make trunk_size is pow of 2
trunk_size = CAlgHashList_Pow2(trunk_size);
return sizeof(CAlgHashList)
+ sizeof(CAlgShareList) * trunk_size
+ sizeof(CAlgShareNode) * max_count
+ (key_size + val_size) * max_count;
}
static inline void CAlgHashList_Create(CAlgHashList* h, unsigned int key_size, unsigned int val_size,
unsigned int trunk_size, unsigned int max_count)
{
unsigned int i;
CAlgShareNode* n = (CAlgShareNode*)((unsigned char*)(h->hlist) + sizeof(CAlgShareList) * trunk_size);
trunk_size = CAlgHashList_Pow2(trunk_size);
h->k_size = key_size;
h->v_size = val_size;
h->trunk_size = trunk_size;
h->max_count = max_count;
h->trunk_mask = h->trunk_size - 1;
CAlgShareList_ReSet(&h->free_list, key_size);
//add ShareNode to free list
n->curr_data = NULL;
CAlgShareList_InsertPointer(&h->free_list, NULL, NULL, n, 0);
for(i=1; i<max_count; i++, n++){
(n+1)->curr_data = NULL;
CAlgShareList_InsertPointer(&h->free_list,
n, NULL, n+1, i);
}
for(i=0; i<trunk_size; i++){
//NOTE: only set key_size, but the list node pointer store key_size + val_size
CAlgShareList_ReSet(&h->hlist[i], key_size);
}
}
static inline unsigned int CAlgHashList_DefaultHash(const void* k, unsigned int k_size)
{
unsigned int i, hash = 0;
const unsigned char *p = (const unsigned char *)k;
for (i = 0; i< k_size; i++, p++) {
hash = hash * 33 + *p;
}
return hash;
}
static inline int CAlgHashList_Find(CAlgHashList* h, const void* k, HashListRC* rc,
Alg_Cmp_F cmp_f, Alg_Hash_F hash_f)
{
CAlgShareList* list;
CAlgShareNode* node_base = (CAlgShareNode*)(&h->hlist[h->trunk_size]);
int pos;
unsigned int hash_v ;
unsigned char* kv_base = ((unsigned char*)node_base) + sizeof(CAlgShareNode)*h->max_count;
unsigned int kv_size = h->k_size + h->v_size;
if