Mercurial > projects > qtd
diff d2/qtd/util/Tuple.d @ 344:96a75b1e5b26
project structure changes
author | Max Samukha <maxter@spambox.com> |
---|---|
date | Fri, 14 May 2010 12:14:37 +0300 |
parents | qt/qtd/util/Tuple.d@f9559a957be9 |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/d2/qtd/util/Tuple.d Fri May 14 12:14:37 2010 +0300 @@ -0,0 +1,64 @@ +/** + * Tuple-related stuff. + * + * Authors: Daniel Keep <daniel.keep@gmail.com> + * Copyright: See LICENSE. + */ +module qtd.util.Tuple; + +import std.typetuple; + +/** + * Sequence can be used to generate a tuple of integer values. It can be + * used in one of three forms: + * + * ----- + * Sequence!(6) // ==> (0, 1, 2, 3, 4, 5) + * Sequence!(1,6) // ==> (1, 2, 3, 4, 5) + * Sequence!(1,6,2) // ==> (1, 3, 5) + * ----- + */ + +template Sequence(int max) +{ + static if( max <= 0 ) + alias TypeTuple!() Sequence; + else + alias TypeTuple!(Sequence!(max-1), max-1) Sequence; +} + +/// ditto + +template Sequence(int min, int max) +{ + static if( max <= min ) + alias TypeTuple!() Sequence; + else + alias TypeTuple!(Sequence!(min, max-1), max-1) Sequence; +} + +/// ditto + +template Sequence(int min, int max, int stride) +{ + static if( min >= max ) + alias TypeTuple!() Sequence; + else + alias TypeTuple!(min, Sequence!(min+stride, max, stride)) Sequence; +} + +version( Unittest ) +{ + static assert( Sequence!(3)[0] == 0 ); + static assert( Sequence!(3)[1] == 1 ); + static assert( Sequence!(3)[2] == 2 ); + static assert( Sequence!(3).length == 3 ); + + static assert( Sequence!(1, 3)[0] == 1 ); + static assert( Sequence!(1, 3)[1] == 2 ); + static assert( Sequence!(1, 3).length == 2 ); + + static assert( Sequence!(1, 5, 2)[0] == 1 ); + static assert( Sequence!(1, 5, 2)[1] == 3 ); + static assert( Sequence!(1, 5, 2).length == 2 ); +}