1 /**
2  * Contains a modified version of std.algorithm.remove that doesn't take an
3  * alias parameter to avoid DMD @@BUG6395@@.
4  */
5 module thrift.internal.algorithm;
6 
7 import std.algorithm : move;
8 import std.exception;
9 import std.functional;
10 import std.range;
11 import std.traits;
12 
13 enum SwapStrategy
14 {
15     unstable,
16     semistable,
17     stable,
18 }
19 
20 Range removeEqual(SwapStrategy s = SwapStrategy.stable, Range, E)(Range range, E e)
21 if (isBidirectionalRange!Range)
22 {
23     auto result = range;
24     static if (s != SwapStrategy.stable)
25     {
26         for (;!range.empty;)
27         {
28             if (range.front !is e)
29             {
30                 range.popFront;
31                 continue;
32             }
33             move(range.back, range.front);
34             range.popBack;
35             result.popBack;
36         }
37     }
38     else
39     {
40         auto tgt = range;
41         for (; !range.empty; range.popFront)
42         {
43             if (range.front is e)
44             {
45                 // yank this guy
46                 result.popBack;
47                 continue;
48             }
49             // keep this guy
50             move(range.front, tgt.front);
51             tgt.popFront;
52         }
53     }
54     return result;
55 }