On 07/17/2017 08:35 PM, Nordlöw wrote:
Thanks, but I'm talking about the variadic case where the number of input arguments are unknown (>= 2) where the function header looks something like

import std.traits : allSatisfy, isStaticArray;

auto append(R, Args...)(auto ref Args args)
     if (args.length >= 2 &&
         allSatisfy!(isStaticArray, Args))
     // TODO all ElementTypes have CommonType
{
     // ...
}


I see. Here's what I could come up with:

----
import std.traits : allSatisfy, isStaticArray;

auto append(Args...)(auto ref Args args)
    if (args.length >= 2 &&
        allSatisfy!(isStaticArray, Args))
{
    import std.algorithm : sum;
    import std.meta : staticMap;
    import std.range: ElementType;
    import std.traits : CommonType;

    enum staticArrayLength(A : E[n], E, size_t n) = n;

    alias E = ElementType!(Args[0]);
    static assert(is(CommonType!(staticMap!(ElementType, Args)) : E));
    enum lengths = staticMap!(staticArrayLength, Args);

    E[sum([lengths])] result;
    foreach (i, length; lengths)
    {
        enum offset = sum!(size_t[])([lengths[0 .. i]]);
        result[offset .. offset + length] = args[i];
    }
    return result;
}

@nogc unittest
{
    int[3] a = [1, 2, 3];
    const int[4] b = [4, 5, 6, 7];
    immutable int[5] c = [8, 9, 10, 11, 12];

    auto r = append(a, b, c);
    assert(r == [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]);
    static assert(is(typeof(r) == int[12]));
}
----

Reply via email to