output ranges: by ref or by value?

Jason House jason.james.house at gmail.com
Fri Jan 1 08:27:36 PST 2010


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.



More information about the Digitalmars-d mailing list