www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - rank of range

reply drug <drug2004 bk.ru> writes:
Hello!
Is there a convenient way to get rank of range a.k.a. count of 
dimensions in compile time? Like:

static assert( rankOf!(uint[]) == 1);
static assert( rankOf!(uint[][][]) == 3);
Jul 01
parent reply =?UTF-8?Q?Ali_=c3=87ehreli?= <acehreli yahoo.com> writes:
On 07/01/2017 10:05 AM, drug wrote:
 Hello!
 Is there a convenient way to get rank of range a.k.a. count of
 dimensions in compile time? Like:

 static assert( rankOf!(uint[]) == 1);
 static assert( rankOf!(uint[][][]) == 3);
I'm not aware of one but this seems to work: template rankOf(R) { import std.range : isInputRange, ElementType; static if (isInputRange!R) { enum rankOf = rankOf!(ElementType!R) + 1; } else { enum rankOf = 0; } } unittest { static assert (rankOf!long == 0); static assert (rankOf!(int[]) == 1); static assert (rankOf!(int[][][]) == 3); } void main() { } Ali
Jul 01
parent drug <drug2004 bk.ru> writes:
01.07.2017 20:33, Ali Çehreli пишет:
 On 07/01/2017 10:05 AM, drug wrote:
 Hello!
 Is there a convenient way to get rank of range a.k.a. count of
 dimensions in compile time? Like:

 static assert( rankOf!(uint[]) == 1);
 static assert( rankOf!(uint[][][]) == 3);
I'm not aware of one but this seems to work: template rankOf(R) { import std.range : isInputRange, ElementType; static if (isInputRange!R) { enum rankOf = rankOf!(ElementType!R) + 1; } else { enum rankOf = 0; } } unittest { static assert (rankOf!long == 0); static assert (rankOf!(int[]) == 1); static assert (rankOf!(int[][][]) == 3); } void main() { } Ali
That's what I've done exactly)) Except I didn't tested against long. Thanks for reply!
Jul 01