On 06/18/2012 06:29 PM, Andrej Mitrovic wrote:
I just had a need for this but couldn't find it in Phobos:

import std.stdio;
import std.traits;
import std.range;

template SwapElem(Arr, Type)
{
     static if (isArray!(ElementType!Arr))
     {
         static if (isDynamicArray!Arr)
             alias SwapElem!(ElementType!Arr, Type)[] SwapElem;
         else
             alias SwapElem!(ElementType!Arr, Type)[Arr.length] SwapElem;
     }
     else
     {
         static if (isDynamicArray!Arr)
             alias Type[] SwapElem;
         else
             alias Type[Arr.length] SwapElem;
     }
}

void main()
{
     alias int[2][1] IntArr;
     alias SwapElem!(IntArr, float) FloatArr;
     writeln(typeid(FloatArr));  // float[2][1]
}

It doesn't handle complex declarations like "int[2]*[1]". It seems
hard to do since I can't pass a naked pointer as a type to a template.
Some other clever tricks would have to be used here. But it's a worthy
start. If you can improve it feel free to do so. :)

template SwapElem(A, E){
    static if(is(A X:X[N],size_t N)) alias SwapElem!(X,E)[N] R;
    else static if(is(A X:X[])) alias SwapElem!(X,E)[] R;
    else static if(is(A X:X*)) alias SwapElem!(X,E)* R;
    else alias E R;
    alias R SwapElem;
}

pragma(msg, SwapElem!(int[]*[3][]*[2][]*[1][], float));

Reply via email to