288
|
1 /**
|
|
2 * Tuple-related stuff.
|
|
3 *
|
|
4 * Authors: Daniel Keep <daniel.keep@gmail.com>
|
|
5 * Copyright: See LICENSE.
|
|
6 */
|
|
7 module qt.qtd.util.Tuple;
|
|
8
|
|
9 import std.typetuple;
|
|
10
|
|
11 /**
|
|
12 * Sequence can be used to generate a tuple of integer values. It can be
|
|
13 * used in one of three forms:
|
|
14 *
|
|
15 * -----
|
|
16 * Sequence!(6) // ==> (0, 1, 2, 3, 4, 5)
|
|
17 * Sequence!(1,6) // ==> (1, 2, 3, 4, 5)
|
|
18 * Sequence!(1,6,2) // ==> (1, 3, 5)
|
|
19 * -----
|
|
20 */
|
|
21
|
|
22 template Sequence(int max)
|
|
23 {
|
|
24 static if( max <= 0 )
|
|
25 alias TypeTuple!() Sequence;
|
|
26 else
|
|
27 alias TypeTuple!(Sequence!(max-1), max-1) Sequence;
|
|
28 }
|
|
29
|
|
30 /// ditto
|
|
31
|
|
32 template Sequence(int min, int max)
|
|
33 {
|
|
34 static if( max <= min )
|
|
35 alias TypeTuple!() Sequence;
|
|
36 else
|
|
37 alias TypeTuple!(Sequence!(min, max-1), max-1) Sequence;
|
|
38 }
|
|
39
|
|
40 /// ditto
|
|
41
|
|
42 template Sequence(int min, int max, int stride)
|
|
43 {
|
|
44 static if( min >= max )
|
|
45 alias TypeTuple!() Sequence;
|
|
46 else
|
|
47 alias TypeTuple!(min, Sequence!(min+stride, max, stride)) Sequence;
|
|
48 }
|
|
49
|
|
50 version( Unittest )
|
|
51 {
|
|
52 static assert( Sequence!(3)[0] == 0 );
|
|
53 static assert( Sequence!(3)[1] == 1 );
|
|
54 static assert( Sequence!(3)[2] == 2 );
|
|
55 static assert( Sequence!(3).length == 3 );
|
|
56
|
|
57 static assert( Sequence!(1, 3)[0] == 1 );
|
|
58 static assert( Sequence!(1, 3)[1] == 2 );
|
|
59 static assert( Sequence!(1, 3).length == 2 );
|
|
60
|
|
61 static assert( Sequence!(1, 5, 2)[0] == 1 );
|
|
62 static assert( Sequence!(1, 5, 2)[1] == 3 );
|
|
63 static assert( Sequence!(1, 5, 2).length == 2 );
|
|
64 }
|