On Mon, 16 May 2011 16:17:45 -0400, Mehrdad <wfunct...@hotmail.com> wrote:

On 5/16/2011 1:15 PM, Vladimir Panteleev wrote:
On Mon, 16 May 2011 23:11:50 +0300, Andrei Alexandrescu
<seewebsiteforem...@erdani.org> wrote:

I tested the function above.

OP's intention was to create a version of removeAt which modifies the
array in-place only when there are no other aliases towards the data.
The initial approach was to attempt to check if the passed array is a
slice of a larger array, but as it was discussed, it's flawed.


+1

Wait, I don't think the approach is flawed, just not correctly implemented (see my suggestion with capacity).

If you have an array:

[1, 2, 3, 4]

and you want to remove the 2nd element, another alias to the original array would be:

[1, 3, 4, 4]

Are you trying to argue that the last 4 in that array is still valid data? If so, then yes, it's impossible to tell if there are other aliases to the same data. All you can tell is if the data ends at the valid data for that block (via the capacity property).

I can't see any use case for continuing to use the original alias, because the data is obviously corrupt. Any alias that still references that last element would be corrupted.

If you passed in the slice [0..3], you get an original aliased array of:

[1, 3, 3, 4]

Now, anything that references that third element is corrupt. But that fourth element is not corrupted, it wasn't part of the arguments to removeAt. So you can continue to refer to that element, and a properly implemented removeAt should avoid stomping on that element with a later append.

-Steve

Reply via email to