On Wednesday, 17 December 2014 at 11:15:30 UTC, zeljkog wrote:
On 15.12.14 01:00, "Nordlöw" wrote:
Isn't this algorithm already encoded somewhere in Phobos?
void append(T, Args...)(ref T[] arr, auto ref Args args){
{
static if (args.length == 1)
arr ~= args[0]; // inlined
else{
arr.length += args.length;
foreach(i, e; args)
arr[$ - args.length + i] = e;
}
}
I've just tested, this looks usable.
Equal for 1 item, considerably (~40%) faster for 2, and much
(100+%) faster for more.
Also more convenient.
Maybe samthing like that should go to Fobos.
I don't think you can beat appender. And your function does not
accept ranges, only elements. I would write it like this:
---
void append(T, Args...)(ref T[] data, Args args)
{
static size_t estimateLength(Args args)
{
size_t result;
foreach(e; args)
static if(hasLength!(typeof(e)))
result += e.length;
else
result += 1;
return result;
}
auto app = appender!(T[])(data);
app.reserve(data.length + estimateLength(args));
foreach(e; args)
app.put(e);
data = app.data;
}
void main()
{
import std.stdio;
int[] data;
append(data, 1, 2, only(1, 2, 3), iota(4, 9));
writeln(data);
}
---
Maybe appender.put should get an overload that does the same,
though I didn't had the need for it yet.