static int
dictExpand(
dict
*
ht
,
unsigned long
size)
{
dict n; /* the new hashtable */
unsigned long realsize = _dictNextPower( size ), i;
/* the size is invalid if it is smaller than the number of
* elements already inside the hashtable */
if ( ht -> used > size)
return DICT_ERR;
_dictInit( &n , ht -> type , ht -> privdata);
n . size = realsize;
n . sizemask = realsize - 1;
n . table = calloc( realsize , sizeof( dictEntry *));
/* Copy all the elements from the old to the new table:
* note that if the old hash table is empty ht->size is zero,
* so dictExpand just creates an hash table. */
n . used = ht -> used;
for ( i = 0; i < ht -> size && ht -> used > 0; i ++) {
dictEntry * he , * nextHe;
if ( ht -> table [ i ] == NULL) continue;
/* For each hash entry on this slot... */
he = ht -> table [ i ];
while( he) {
unsigned int h;
nextHe = he -> next;
/* Get the new element index */
h = dictHashKey( ht , he -> key) & n . sizemask;
he -> next = n . table [ h ];
n . table [ h ] = he;
ht -> used --;
/* Pass to the next element */
he = nextHe;
}
}
assert( ht -> used == 0);
free( ht -> table);
/* Remap the new hashtable in the old */
* ht = n;
return DICT_OK;
}
dict n; /* the new hashtable */
unsigned long realsize = _dictNextPower( size ), i;
/* the size is invalid if it is smaller than the number of
* elements already inside the hashtable */
if ( ht -> used > size)
return DICT_ERR;
_dictInit( &n , ht -> type , ht -> privdata);
n . size = realsize;
n . sizemask = realsize - 1;
n . table = calloc( realsize , sizeof( dictEntry *));
/* Copy all the elements from the old to the new table:
* note that if the old hash table is empty ht->size is zero,
* so dictExpand just creates an hash table. */
n . used = ht -> used;
for ( i = 0; i < ht -> size && ht -> used > 0; i ++) {
dictEntry * he , * nextHe;
if ( ht -> table [ i ] == NULL) continue;
/* For each hash entry on this slot... */
he = ht -> table [ i ];
while( he) {
unsigned int h;
nextHe = he -> next;
/* Get the new element index */
h = dictHashKey( ht , he -> key) & n . sizemask;
he -> next = n . table [ h ];
n . table [ h ] = he;
ht -> used --;
/* Pass to the next element */
he = nextHe;
}
}
assert( ht -> used == 0);
free( ht -> table);
/* Remap the new hashtable in the old */
* ht = n;
return DICT_OK;
}