VEBtree.predecessor

this method retrieves the predecessor of the given input.

class VEBtree
@nogc nothrow
Nullable!(size_t, maxSizeBound)
predecessor
(
alias boundaries = "()"
)
(
size_t value
)

Examples

auto currentSeed = unpredictableSeed();
static if(vdebug){write("UT: vT, predecessor.  "); writeln("seed: ", currentSeed);} 
rndGenInUse.seed(currentSeed); //initialize the random generator

auto uS = uniform(allowedArraySize,testedSize, rndGenInUse);
VEBtree vT = new VEBtree(uS); 

// testing the boundaries now: 
auto randomElement = uniform(allowedArraySize, uS); 
assert(vT.predecessor(randomElement).isNull);
assert(vT.predecessor!"[]"(randomElement) == 0);

size_t n; 
uint[allowedArraySize] insertedVals;  
while(n < allowedArraySize)
{
    auto valToInsert = uniform(0U, uS, rndGenInUse); 
    if(vT.insert(valToInsert))
    {
        insertedVals[n] = valToInsert; 
        n++;
    }
}

auto sortedInserted = assumeSorted(sort(insertedVals[])); 

assert(vT.max == sortedInserted.back); 
assert(vT.min == sortedInserted.front); 
size_t j = allowedArraySize - 1; 

size_t i = testedSize + 1; 
do
{
      --i;
    const auto el = vT.predecessor(i); 
    if(el.isNull)
    {
        assert(i == vT.min); 
        assert(sortedInserted.contains(i));
        break; // quit the loop;

    }
    else
    {
        if(sortedInserted.contains(i)) --j; 
        assert(el == sortedInserted[j]); 
    }

}while(i > 0);

Meta