On Thu, 19 May 2011 07:42:57 -0400, Lars T. Kyllingstad <[email protected]> wrote:

On Wed, 18 May 2011 14:03:05 -0400, Steven Schveighoffer wrote:

Having seen quite a few incorrect descriptions of how D slices work
(particularly regarding appending), I wrote an article that tries to
describe how D slices work, and why they behave the way they do.

Being one of the only places where I have web space, it's on my
dcollections site, I probably will move it to the D wiki eventually, but
I'm much more familiar with the Trac wiki syntax.

Please, if you have any comments or recommendations, let me know.  I
certainly am no author, so I probably screwed a few things up :)

http://www.dsource.org/projects/dcollections/wiki/ArrayArticle

This is an excellent article!  It answers many questions about the new
appending system which I've been meaning to ask you for a long time.

Thanks!


One question, still:  It seems inconsistent that the value of capacity()
normally includes the existing slice elements, yet suddenly returns 0
when the array cannot be appended to. Why doesn't it return slice.length?

Well, I think someone has brought that up before, and I thought it was a good idea, but I found a reason recently for leaving it the way it is.

If an array has completely filled a memory block, and you have a slice that ends at the end of that memory block, the capacity will be equal to the slice length. This might be a condition you want to know, vs a slice that does not end at the end of the array (which currently returns capacity of 0).

The example I found was a recent request for a way to safely remove an element from a slice. I recommended to use assumeSafeAppend after removing the element. The question was then asked, what if the slice is part of a larger array? Calling assumeSafeAppend effectively invalidates all elements after the slice. So you want to know positively that a slice ends at the end of the array, and only call assumeSafeAppend if it's safe to do so.

Maybe there is a better way to do this, but it turns out to be a useful inconsistency. Keep in mind that calling capacity is not a simple quick lookup, so you don't want to have to call it multiple times.

Slices of non-heap arrays also return a capacity of 0.

-Steve

Reply via email to