Revised RFC on range design for D2

Sergey Gromov snake.scaly at gmail.com
Fri Oct 3 08:29:39 PDT 2008


Fri, 03 Oct 2008 09:02:07 -0500,
Andrei Alexandrescu wrote:
> Sergey Gromov wrote:
> > Thu, 02 Oct 2008 15:03:42 -0500,
> > Andrei Alexandrescu wrote:
> >> Yah, overloaded ops are due for an overhaul. I'm almost afraid to ask... 
> >> any ideas? :o)
> >>
> >> One goal is to fix opIndexAssign and make it work similar to the way it 
> >> works in arrays, e.g. a[b] += c. Indexing into hash tables is a good 
> >> test bed.
> > 
> > What's wrong with a.opIndexAssign(b, a.opIndex(b) + c)?
> 
> One problem is that for a hashtable that does not have b yet, opIndex 
> will throw an exception.
> 
> Another problem (assuming the above is fixed) is that b will be looked 
> up twice in the hash.

The latter is not a problem if you always try to use a[b] as an lvalue 
before trying anything more specific.  Though it makes the former even 
harder to fix.  Probably there should be another opIndex for a context 
where the user expects a non-existent element to be created:

ref T opIndexCreate(size_t i)

When compiler sees "a[b] += c" it first calculates the type of "a[b]" in 
an assignment context.  In case of indexing it means considering 
a.opIndexCreate, then a.opIndex, and finally the built-in indexing.  
Then it checks whether that type is an lvalue or implements the 
requested assignment operation.  If neither is true then compiler falls 
back to a.opIndexAssign(b, ...) as a special backward-compatibility 
case.


More information about the Digitalmars-d-announce mailing list