Example #1
0
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];
}
Example #2
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;
}
Example #3
0
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;
}
Example #4
0
void *SuperHashTable::findExact(const void * findEt) const
{
    unsigned vm = doFindExact(findEt);
    void *et = table[vm];
    return et;
}