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