Hello,

There is no builtin func to delete or insert one or more elements from or into a dynamic array. The reason is probably that providing a dedicated idiom may let such an operation look cheap (same reason as for refusing 'in' for dyn arrays).
Still, there is a need for this functionality, to avoid
* either repetedly coding it when needed, possibly with bugs,
* or using concat, which copies the whole content instead of the necessary part.

For both operations, the actual process is a shift operation on the part of the array ranging from a lower bound to the upper end, for an offset equal to the deleted/inserted slice's length. We could, I guess, provide this shift process builtin. This would allow writing deletion/insertion easily, while making it obvious that the operation is costly.
See example below. What do you think?


Denis

void shift (T) (ref T[] array, size_t low, sizediff_t offset) {
    if (offset == 0) return;
    auto len = array.length;
    size_t i;

    // move up for insertion: proceed backwards
    if (offset > 0) {
        array.length = len + offset;
        for (i=len-1 ; i>=low ; i--)
            array[i+offset] = array[i];
    }
    // move down for deletion: note offset is negative!
    else {
        for (i=low ; i<array.length ; i++)
            array[i+offset] = array[i];
        array.length = len + offset;
    }
}

unittest {
    auto a = [0,1,2,3,4,5,6,7,8,9];
    writeln(a);
    // delete [4..6]
    a.shift(7, -3);
    writeln(a);         // [0,1,2,3,7,8,9]
    // insert [4..6]
    a.shift(4, +3);
    a[4..7] = [4,5,6];
    writeln(a);         // [0,1,2,3,4,5,6,7,8,9]
}

--
_________________
vita es estrany
spir.wikidot.com

_______________________________________________
phobos mailing list
[email protected]
http://lists.puremagic.com/mailman/listinfo/phobos

Reply via email to