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.

Reply via email to