container stuff

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Wed May 26 08:52:50 PDT 2010


On 05/26/2010 12:40 AM, Jerry Quinn wrote:
> softXXX might be better named safeXXX or stableXXX.  The names might
> be more suggestive of preserving iteration.

Done. "stable". Thanks.

> The doc isn't quite clear whether make is a member function or
> standalone.  I assume it's standalone, but that's worth firming up.

make is standalone, the indentation should give that away.

>>> I don't like insertInstead, can we make it replace?
>>
>> replace was the original name. insertInstead is consistent with
>> the other two, so we have (softI|i)nsert[Before|After|Instead].
>
> I second the request for the name "replace".  Despite the
> consistency, I think replace is clear to programmers as well as being
> more familiar and comfortable.  Also, the operation really isn't
> "insert instead", it's "delete then insert instead".  So there is
> lack of symmetry because it removes elements while the other does
> not.

Good point. I inserted "replace" instead of "insertInstead" (and just 
inserted a pun, too).

> Another  issue I see is that opIndex and its brethren takes KeyType,
> but for something like vector, this should be size_t..  I don't think
> you want ElementType to be tuple!(size_t, ElementType) in this case.

Arrays don't define KeyType, yet they define opIndex. That doesn't go 
against the spec. That being said, I'd like to see a bit more 
unification between arrays and associative arrays.

> Related to this, do you intend removal of a single element to use
> remove(range) or removeKey?

I think remove(range.take(1)) should remove one element. I'm also 
thinking of simplifying matters by defining remove(range, k) where k is 
an "up to" number.

> Finally, opSlice(begin, end) is not there.  Was this intentional or
> overlooked?

I'm still mulling over that. As was discussed in this group, $ is easy 
to detect statically but 0 is not. Some containers don't like nonzero 
beginning anchors, and I wouldn't want to make that a runtime test. If 
Walter won't make a language change, I'd have to define begin() as an 
anchor, and before you know it, cursors are in :o).

To recap:

a) arrays (but not associative arrays) can define c[a .. b] for 
integrals a and b.

b) associative arrays can define c[a .. b] for a, b key types. It's 
nontrivial but it can be done.

c) sentinel-terminated arrays (e.g. C stringz) can only define c[a .. $] 
for an integral a.

d) lists can, with ho and hum, define c[0 .. a] for an integral a. The 
ho and hum comes from the fact that the range thus obtained is not a 
"proper" Range type, it's a Take!Range.

e) Any other cases?


Andrei


More information about the Digitalmars-d mailing list