"the last change" for ranges

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Wed May 20 10:04:42 PDT 2009


Bill Baxter wrote:
> On Wed, May 20, 2009 at 9:19 AM, Andrei Alexandrescu
> <SeeWebsiteForEmail at erdani.org> wrote:
> 
>> I'm thinking a better design is to require any range that's forward or
>> better to define a function save(). Ranges that don't implement it are input
>> ranges; those that do, will guarantee a brand new range is returned from
>> save(). So then adjacentFind would look like this:
>>
>> R adjacentFind(R)(R r)
>> {
>>    if (r,empty) return r;
>>    R last = r.save;
>>    r.popFront;
>>    for (; !r.empty && last.front != r.front; last.popFront, r.popFront)
>>    {
>>    }
>>    return r;
>> }
>>
>> Obviously, when you pass a range that doesn't support save, adjacentFind
>> will not compile, which is what we want.
> 
> The only other alternative that comes to mind would be forcing input
> ranges to hide their copy constructor, or whatever the D equivalent
> is, making R last = r; fail.  But that would make input ranges very
> difficult to use.

Exactly. I thought of that design, and it was difficult to even pass a 
range to a function.

> So, of those two options at least, requiring a .save sounds like the
> better choice.
> 
> The down side is you will get no error if you write the code the first
> way, without a .save.   I see this as turning into tip #5 in
> "Effective D" -- "Know when to use .save"   It would be nice if that
> potential mistake could be eliminated somehow.  You could perhaps
> require input ranges to implement transfer semantics, and have them
> implement a .clone for cases when you really do want to make an
> aliasing copy.

Good point. I don't have a solution for that. Giving ranges move 
semantics would probably make for another Effective D tip (or perhaps 
more... move semantics are pretty brutal).

Another partial solution is to define a different interface for input 
ranges, one that combines front() and popFront(). Something like 
popNext. That way, people who use only the primitives empty() and 
popNext() know they are using a forward range and with hope they'll 
remember they can't really save copies of it and expect them to 
"remember" where they are in the input.


Andrei



More information about the Digitalmars-d mailing list