void *SuperHashTable::next(const void *et) const { unsigned i; if (!et) { if (!tablecount) return NULL; i = (unsigned) -1; } else { i = doFindExact(et); if (table[i] != et) { assertex(!"SuperHashTable::Next : start item not found"); return NULL; } } while (1) { i++; if (i>=tablesize) return NULL; if (table[i]) break; } setCache(i); return table[i]; }
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; }
bool SuperHashTable::removeExact(void *et) { if (!et) return false; unsigned v = doFindExact(et); if (table[v]!=et) return false; doDeleteElement(v); onRemove(et); return true; }
void *SuperHashTable::findExact(const void * findEt) const { unsigned vm = doFindExact(findEt); void *et = table[vm]; return et; }