D Paste by downs
Description: Compile-time quicksort
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | module test132; template Tuple(T...) { alias T Tuple; } struct Value(int _v) { const v = _v; } template Select(alias A, T...) { static if (!T.length) alias Tuple!() Select; else static if (A!(T[0].v)) alias Tuple!(T[0], Select!(A, T[1 .. $])) Select; else alias Tuple!(Select!(A, T[1 .. $])) Select; } template Bigger(int I) { template Bigger(int K) { const bool Bigger = K > I; } } template SmallerEq(int I) { template SmallerEq(int K) { const bool SmallerEq = K <= I; } } template Quicksort(T...) { static if (T.length <= 1) alias T Quicksort; else alias Tuple!( Quicksort!(Select!(SmallerEq!(T[$/2].v), T)), Quicksort!(Select!(Bigger!(T[$/2].v), T)) ) Quicksort; } template Values(T...) { static if (!T.length) alias Tuple!() Values; else alias Tuple!(Value!(T[0]), Values!(T[1 .. $])) Values; } alias Quicksort!(Values!(4, 2, 1, 3)) SortedValues; import std.stdio; void main() { writefln(SortedValues.stringof); } |