output ranges: by ref or by value?
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Fri Jan 1 08:44:49 PST 2010
Jason House wrote:
> Andrei Alexandrescu wrote:
>
>> Philippe Sigaud wrote:
>>> On Thu, Dec 31, 2009 at 16:47, Michel Fortin <michel.fortin at michelf.com
>>> <mailto:michel.fortin at michelf.com>> wrote:
>>>
>>> On 2009-12-31 09:58:06 -0500, Andrei Alexandrescu
>>> <SeeWebsiteForEmail at erdani.org
>>> <mailto:SeeWebsiteForEmail at erdani.org>> said:
>>>
>>> The question of this post is the following: should output ranges
>>> be passed by value or by reference? ArrayAppender uses an extra
>>> indirection to work properly when passed by value. But if we
>>> want to model built-in arrays' operator ~=, we'd need to request
>>> that all output ranges be passed by reference.
>>>
>>>
>>> I think modeling built-in arrays is the way to go as it makes less
>>> things to learn. In fact, it makes it easier to learn ranges because
>>> you can begin by learning arrays, then transpose this knowledge to
>>> ranges which are more abstract and harder to grasp.
>>>
>>>
>>> I agree. And arrays may well be the most used range anyway.
>> Upon more thinking, I'm leaning the other way. ~= is a quirk of arrays
>> motivated by practical necessity. I don't want to propagate that quirk
>> into ranges. The best output range is one that works properly when
>> passed by value.
>
> I worry about a growing level of convention with ranges. Another recent
> range thread discussed the need to call consume after a successful call to
> startsWith. If I violated convention and had a range class, things would
> fail miserably. There would be no need to consume after a successful call
> to startsWith and the range would have a random number of elements removed
> on an unsuccessful call to startsWith. I'm pretty sure that early
> discussions of ranges claimed that they could be either structs and classes,
> but in practice that isn't the case.
I am implementing right now a change in the range interface mentioned in
http://www.informit.com/articles/printerfriendly.aspx?p=1407357, namely:
add a function save() that saves the iteration state of a range.
With save() in tow, class ranges and struct ranges can be used the same
way. True, if someone forgets to say
auto copy = r.save();
and instead says:
auto copy = r;
the behavior will indeed be different for class ranges and struct ranges.
Andrei
More information about the Digitalmars-d
mailing list