1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
#include "hashmap.ih"
void hm_reshuffle(register HashMap *symtab)
{
size_t newsize = symtab->d_size;
size_t n;
register HashItem **old = symtab->d_map;
HashItem **new = new_calloc(newsize, sizeof(HashItem *));
for (n = 0; n < symtab->d_n; ++old) /* visit all OLD elements */
{
/* Got one */
if (*old != (HashItem *)FREE && *old != (HashItem *)REMOVED)
{
size_t idx;
if (hm_find(&idx, new, newsize, (*old)->d_key) == UFAILED)
new[idx] = *old;
++n;
}
}
free(symtab->d_map);
symtab->d_map = new;
}
|