"the last change" for ranges
Robert Jacques
sandford at jhu.edu
Wed May 20 10:42:25 PDT 2009
On Wed, 20 May 2009 13:04:42 -0400, Andrei Alexandrescu
<SeeWebsiteForEmail at erdani.org> wrote:
> 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
Bicycle shed: Well, since output ranges use 'put', how about 'get' for
input ranges?
More information about the Digitalmars-d
mailing list