On Friday, 2 October 2015 at 08:13:00 UTC, John Colvin wrote:
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:
[...]

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]);
}

Although you should consider that isExpressions is instantiating V.length templates anyway (it uses a binary split to avoid excessive template recursion depth, but it ends up checking them all one-per-template in the end anyway.

Reply via email to