algorithms that take ranges by reference

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Wed Dec 30 16:11:49 PST 2009


Kevin Bealer wrote:
> Andrei Alexandrescu Wrote:
> 
>> The grand STL tradition is to _always_ take iterators by value. If 
>> iterators are computed, they are returned by the algorithm.
>>
>> My initial approach to defining std.algorithm was to continue that 
>> tradition for ranges: ranges are values. No algorithm currently takes a 
>> range by reference. There are a couple of simple functions that 
>> emphatically do take ref, namely popFrontN and popBackN in std.range.
>>
>> It is becoming, however, increasingly clear that there are algorithms 
>> that could and should manipulate ranges by reference. They might take 
>> and return values, but it's just too messy to do so. (Cue music for the 
>> "improve built-in tuples choir.)
>>
>> A concrete case is text processing. Many contemporary libraries use 
>> index-based processing, but that's difficult when handling multibyte 
>> characters. To address that, bidirectional ranges are one correct way to 
>> go. Phobos defines a ByCodeUnit range that spans a string correctly, one 
>> dchar at a time. With that, you can write:
>>
> ...
>> Andrei
> 
> I would vote yes -- I've used this technique (with my own character slice classes in C++) and they are a great idiom to work with.
> 
> I think ranges (and slices) have some of the properties from each of pointers, containers, and streams.  A stream is always a by-ref kind of thing unless you are in a language that needs monads etc.
> 
> Let me suggest one more function I've found very useful:
> 
> bool readUntil(R1, R2, R3)(ref R1 input, R2 delim, ref R3 result)
> {
>   // Like findSkip, but returning intervening text.
> }

You read my mind. I was thinking of something with "copy" in the name.

Andrei



More information about the Digitalmars-d mailing list