VLERange: a range in between BidirectionalRange and RandomAccessRange

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Tue Jan 11 08:36:54 PST 2011


On 1/11/11 4:41 AM, Michel Fortin wrote:
> On 2011-01-10 22:57:36 -0500, Andrei Alexandrescu
> <SeeWebsiteForEmail at erdani.org> said:
>> In addition to these (and connecting the two), a VLERange would offer
>> two additional primitives:
>>
>> 1. size_t stepSize(size_t offset) gives the length of the step needed
>> to skip to the next element.
>>
>> 2. size_t backstepSize(size_t offset) gives the size of the _backward_
>> step that goes to the previous element.
>
> I like the idea, but I'm not sure about this interface. What's the
> result of stepSize if your range must create two elements from one
> underlying unit? Perhaps in those cases the element type could be an
> array (to return more than one element from one iteration).
>
> For instance, say we have a conversion range taking a Unicode string and
> converting it to ISO Latin 1. The best (lossy) conversion for "œ" is
> "oe" (one chararacter to two characters), in this case 'front' could
> simply return "oe" (two characters) in one iteration, with stepSize
> being the size of the "œ" code point. In the same conversion process,
> encountering "e" followed by a combining "´" would return pre-combined
> character "é" (two characters to one character).

In the design as I thought of it, the effective length of one logical 
element is one or more representation units. My understanding is that 
you are referring to a fractional number of representation units for one 
logical element.

>> Writing to such ranges is not addressed by this design. Ideas are
>> welcome.
>
> Writing, as in assigning to 'front'? That's not really possible with
> variable-length units as it'd need to shift everything in case of a
> length difference. Or maybe you meant writing as in having an output
> range for variable-length elements... I'm not sure

Well all of the above :o). Clearly assigning to e.g. front or back 
should not work. The question is what kind of API can we provide beyond 
simple append with put().


Andrei


More information about the Digitalmars-d mailing list