On 1/15/13 2:07 PM, Phil Lavoie wrote:
Continuing with reversible ranges:
I don't think .reverse will take us far enough. Won't work with arrays
which kinda puts a monkey wrench into everything. r1.before(r2) works
much better:
R rfind(R, E)(R r, E e) {
auto original = r.save;
for (; !r.empty; r.popBack) {
if (r.endsWith(e)) break;
}
return original.before(r);
}
The generic implementation of before is trivial:
auto before(R)(R theBuck, R stopsHere) {
static struct Result {
bool empty() { return r1 is r2; }
auto ref front() { return r1.front; }
void popFront() { r1.popFront; }
private R r1, r2;
}
return Result(theBuck, stopsHere);
}
For random-access ranges:
auto before(R)(R theBuck, R stopsHere) {
return theBuck[0 .. theBuck.length - stopsHere.length];
}
(Glossing over checks and balances etc.)
Bidirectional ranges would need to implement before natively to return
the same type as the original range.
The question is whether before() is enough for many other algorithms
we'd want to define.
Andrei