On Tuesday, 21 April 2015 at 08:09:38 UTC, Per Nordlöw wrote:
On Tuesday, 21 April 2015 at 07:46:03 UTC, Vlad Levenfeld wrote:
template dimensionality (S) {
 template count_dim (uint i = 0) {
   static if (is (typeof(S.init.opSlice!i (0,0))))
     enum count_dim = count_dim!(i+1);
   else enum count_dim = i;
 }

 alias dimensionality = count_dim!();
}

Then you throw in some more stuff to detect 1-dimensional cases.

Great! I guess a template restriction on opSlice would be in Place aswell.

One thing: Why aren't you using opIndex instead? If there are types that have opIndex but not opSlice defined then dimensionality() could cover more types, right?

So, if the type is multidimensional, that means its using the new opIndex/opSlice syntax that was designed for multidimensional structures. So I know that, if dim > 1, opSlice!i must be defined, and (assuming we are only working with integral indices here) I can instantiate it with opSlice!i (0,0).

For other types, you would throw in a test for a length member, or for front, and know that you have a 1-dimensional type.

Alternatively, if we're assuming only integral indices, a recursive attempt to get the typeof(opIndex (Repeat!(i, 0))) would probably handle all the opIndex-but-not-opSlice cases (but you still need to handle non-indexed ranges and D arrays specially).

Reply via email to