Beispiel #1
0
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;
}
Beispiel #2
0
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);
}
Beispiel #3
0
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);
}
Beispiel #4
0
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;
}
Beispiel #5
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;
}