On 11/28/2014 12:44 AM, bearophile wrote:

> Now we have a better syntax for implicit casts:

[...]

>      app.put(ubyte(0).repeat.take(5));

Much better! :)

> But I have a question too. What's the best way to append several lazy
> items to a dynamic array? This doesn't work:
>
> void main() {
>      import std.array, std.range;
>      int[] arr;
>      arr.put(only(1, 2, 3));
> }

I don't think there is a better way in Phobos. (?) The following trivial function would do as long as the array has room at the end, which requires that it is "safe to append":

void expandWith(A, R)(ref A arr, R range)
{
    foreach (e; range) {
        arr ~= e;
    }
}

void main() {
    import std.range;

    int[] arr = [ 42 ];

    // Ensure that there is room for new elements
    arr.reserve(100);
    assumeSafeAppend(arr);

    const oldPlace = arr.ptr;
    arr.expandWith(only(1, 2, 3));
    const newPlace = arr.ptr;

    assert(newPlace == oldPlace);
}

Ali

Reply via email to