On Thursday, 1 October 2015 at 22:26:39 UTC, Nordlöw wrote:
On Thursday, 1 October 2015 at 02:06:48 UTC, Fusxfaranto wrote:
/** Returns: true iff all values $(D V) are the same. */
template allSame(V...) // TODO restrict to values
only
{
static if (V.length <= 1)
enum bool allSame = true;
else
enum bool allSame = V[0] == V[1] && allSame!(V[1..$]);
}
std.traits to the rescue!
http://dlang.org/phobos/std_traits.html#isExpressions
Using isExpressions!V as a template constraint looks like the
behavior you're looking for.
Thanks!
BTW: Is there some way to turn the recursive definition of
`allSame`
template allSame(V...)
if (isExpressions!(V))
{
static if (V.length <= 1)
enum allSame = true;
else
enum allSame = V[0] == V[1] && allSame!(V[1..$]);
}
into an iterative definition?
Why? To avoid slowing down compilation with all those template
instantiations?
How about a O(log2(N)) depth recursive version, something like
this:
template allSame(V ...)
if (isExpressions!V)
{
static if (V.length <= 1)
enum allSame = true;
else static if(V.length & 1)
enum allSame = V[$-1] == V[0]
&& V[0 .. $/2] == V[$/2 .. $-1]
&& allSame!(V[0 .. $/2]);
else
enum allSame = V[0..$/2] == V[$/2 .. $]
&& allSame!(V[0 .. $/2]);
}