blob: 7c56120fc1a112693cd00a5b90517197082b1698 [file] [log] [blame]
template StaticArrayTypeOf(T)
{
inout(U[n]) idx(U, size_t n)( inout(U[n]) );
/+static if (is(T == enum))
alias .StaticArrayTypeOf!(OriginalType!T) StaticArrayTypeOf;
else +/static if (is(typeof(idx(T.init/+defaultInit!T+/)) X))
alias X StaticArrayTypeOf;
else
static assert(0, T.stringof~" is not a static array type");
}
template DynamicArrayTypeOf(T)
{
inout(U[]) idx(U)( inout(U[]) );
/+static if (is(T == enum))
alias .DynamicArrayTypeOf!(OriginalType!T) DynamicArrayTypeOf;
else +/static if (!is(StaticArrayTypeOf!T) &&
is(typeof(idx(T.init/+defaultInit!T+/)) X))
{
alias typeof(T.init[0]/+defaultInit!T[0]+/) E;
E[] idy( E[] );
const(E[]) idy( const(E[]) );
inout(E[]) idy( inout(E[]) );
shared( E[]) idy( shared( E[]) );
shared(const E[]) idy( shared(const E[]) );
shared(inout E[]) idy( shared(inout E[]) );
immutable(E[]) idy( immutable(E[]) );
alias typeof(idy(T.init/+defaultInit!T+/)) DynamicArrayTypeOf;
}
else
static assert(0, T.stringof~" is not a dynamic array");
}
template isDynamicArray(T)
{
enum isDynamicArray = is(DynamicArrayTypeOf!T)/+ && !isAggregateType!T+/;
}
template isArray(T)
{
enum bool isArray = /+isStaticArray!T || +/isDynamicArray!T;
}