bool SuperHashTable::doAdd(void * donor, bool replace) { unsigned vs = getHashFromElement(donor); unsigned vm = doFind(vs, getFindParam(donor)); void *et = table[vm]; if (et) { if (replace) { onRemove(et); table[vm] = donor; onAdd(donor); return true; } else return false; } else { unsigned tablelim = getTableLimit(tablesize); if (tablecount>=tablelim) { expand(); vm = doFind(vs, getFindParam(donor)); } tablecount++; table[vm] = donor; onAdd(donor); } return true; }
void SuperHashTable::addNew(void * donor, unsigned hash) { unsigned tablelim = getTableLimit(tablesize); if (tablecount>=tablelim) expand(); unsigned vm = doFindNew(hash); tablecount++; table[vm] = donor; onAdd(donor); }
void SuperHashTable::ensure(unsigned mincount) { if (mincount <= getTableLimit(tablesize)) return; unsigned newsize = tablesize; loop { #ifdef HASHSIZE_POWER2 newsize += newsize; #else if (newsize>=0x3FF) newsize += 0x400; else newsize += newsize+1; #endif if (newsize < tablesize) throw MakeStringException(0, "HashTable expanded beyond 2^32 items"); if (mincount <= getTableLimit(newsize)) break; } expand(newsize); }
void *SuperHashTable::addOrFindExact(void * donor) { unsigned vm = doFindExact(donor); void *et = table[vm]; if(!et) { unsigned tablelim = getTableLimit(tablesize); if (tablecount>=tablelim) { expand(); vm = doFindExact(donor); } tablecount++; table[vm] = donor; onAdd(donor); return donor; } return et; }
void *SuperHashTable::addOrFind(void * donor) { unsigned vs = getHashFromElement(donor); unsigned vm = doFind(vs, getFindParam(donor)); void *et = table[vm]; if(!et) { unsigned tablelim = getTableLimit(tablesize); if (tablecount>=tablelim) { expand(); vm = doFind(vs, getFindParam(donor)); } tablecount++; table[vm] = donor; onAdd(donor); return donor; } return et; }