Making recursively-defined traits iterative using `static foreach`
Nordlöw
per.nordlow at gmail.com
Sat Mar 10 09:47:55 UTC 2018
Now that we have `static foreach` I just realized we can start
making recursive implementations of traits such as
template allSame(V...)
if (isExpressions!V)
{
static if (V.length <= 1)
{
enum allSame = true;
}
else static if (V.length & 1) // odd count
{
enum allSame = (V[0] == V[$ - 1] &&
V[0 .. $/2] == V[$/2 .. $-1]
allSame!(V[0 .. $/2]));
}
else // event count
{
enum allSame = (V[0 .. $/2] == V[$/2 .. $]
allSame!(V[0 .. $/2]));
}
}
iterative as
template allSameIterative(V...)
{
static if (V.length <= 1)
{
enum allSameIterative = true;
}
else
{
static foreach (Vi; V[1 .. $])
{
static if (V[0] != Vi)
{
enum allSameIterative = false;
}
}
static if (!is(typeof(allSameIterative) == bool)) // if
not yet defined
{
enum allSameIterative = true;
}
}
}
Is this preferred, typically in terms of compile-time memory
usage and speed?
More information about the Digitalmars-d
mailing list