Isn't using find with retro awkward?
Andrej Mitrovic
andrej.mitrovich at gmail.com
Wed Feb 16 11:24:36 PST 2011
The only thing I could come up with is exhausting the entire range to
get the length of a bidirectional range. But that's inefficient.
Anyway here's the dull thing:
import std.stdio;
import std.range;
import std.array;
R findBack(alias pred = "a == b", R, E)(R haystack, E needle)
if (isBidirectionalRange!R)
{
size_t index;
bool found;
auto saved = haystack;
foreach (item; retro(haystack))
{
if (item == needle)
{
found = true;
index++;
break;
}
index++;
}
if (found)
{
size_t newIndex;
while (!haystack.empty)
{
newIndex++;
haystack.popBack;
}
newIndex -= index;
while (!saved.empty && newIndex)
{
saved.popFront;
newIndex--;
}
}
return saved;
}
void main()
{
auto orig = [4, 0, 4, 0];
auto result = findBack(orig, 4);
assert(array(result) == [4, 0]);
result.front = 10;
assert(orig == [4, 0, 10, 0]);
}
You'll have to forgive me but I have yet to study algorithms properly. :)
More information about the Digitalmars-d-learn
mailing list