blob: 0938ac2698b9091f836c519d93225ed2f45c5859 [file] [log] [blame]
/**
* Contains a modified version of std.algorithm.remove that doesn't take an
* alias parameter to avoid DMD @@BUG6395@@.
*/
module thrift.internal.algorithm;
import std.algorithm : move;
import std.exception;
import std.functional;
import std.range;
import std.traits;
enum SwapStrategy
{
unstable,
semistable,
stable,
}
Range removeEqual(SwapStrategy s = SwapStrategy.stable, Range, E)(Range range, E e)
if (isBidirectionalRange!Range)
{
auto result = range;
static if (s != SwapStrategy.stable)
{
for (;!range.empty;)
{
if (range.front !is e)
{
range.popFront;
continue;
}
move(range.back, range.front);
range.popBack;
result.popBack;
}
}
else
{
auto tgt = range;
for (; !range.empty; range.popFront)
{
if (range.front is e)
{
// yank this guy
result.popBack;
continue;
}
// keep this guy
move(range.front, tgt.front);
tgt.popFront;
}
}
return result;
}