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; }
bool RowAggregator::matchesFindParam(const void *et, const void *key, unsigned fphash) const { if (fphash != hashFromElement(et)) return false; // et = element in the table (an AggregateRowBuilder) key = new row (in input row layout). return comparer->docompare(key, getFindParam(et)) == 0; }
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; }
bool RowAggregator::matchesElement(const void *et, const void * searchET) const { return elementComparer->docompare(getFindParam(et), searchET) == 0; }