HMAP_PTR hmap_create_size_policy(unsigned init_tsize, double lfactor, int tsize_mode){ HMAP_PTR map = malloc(sizeof(struct hmap)); int idx; map->n = 0; if(lfactor <= 0) lfactor = DEFAULT_LFACTOR; if(init_tsize <= 0) init_tsize = DEFAULT_INIT_SIZE; map->lfactor = lfactor; map->tsize_tbl = SizeTables[tsize_mode]; map->tsize_policy = SizePolicies[tsize_mode]; idx = 0; while(map->tsize_tbl[idx] < init_tsize) idx++; map->tsize = map->tsize_tbl[idx]; map->tsize_idx = idx; map->max_n = map->tsize * lfactor; map->hfunc = HashFunctions[DEFAULT_HFUNC_ID].hfunc; map->hfunc_desc = HashFunctions[DEFAULT_HFUNC_ID].description; map->tbl = create_tbl_array(map->tsize); map->n = 0; return map; }
static void resize(HMAP_PTR map) { int ntsize; TBL_ENTRY *ntbl; NODE *nxt, *p; unsigned h; int i, idx; map->tsize_idx++; ntsize = map->tsize_tbl[map->tsize_idx]; ntbl = create_tbl_array(ntsize); for(i=0; i<map->tsize; i++) { p = map->tbl[i].members; while(p != NULL) { nxt = p->next; // h = map->hfunc(key); // no need to recompute idx = p->hval % ntsize; add_front(&ntbl[idx], p); p = nxt; } } free(map->tbl); map->tbl = ntbl; map->tsize = ntsize; map->max_n = (int)(ntsize * map->lfactor); }
HMAP_PTR hmap_create(unsigned init_tsize, double lfactor){ HMAP_PTR map = malloc(sizeof(struct hmap)); map->n = 0; if(lfactor <= 0) lfactor = DEFAULT_LFACTOR; if(init_tsize <= 0) init_tsize = DEFAULT_INIT_SIZE; map->lfactor = lfactor; map->tsize = init_tsize; map->max_n = init_tsize * lfactor; map->hfunc = HashFunctions[DEFAULT_HFUNC_ID].hfunc; map->hfunc_desc = HashFunctions[DEFAULT_HFUNC_ID].description; map->tbl = create_tbl_array(init_tsize); return map; }