protocol for using InputRanges
Steven Schveighoffer
schveiguy at yahoo.com
Mon Mar 24 04:41:33 PDT 2014
On Sun, 23 Mar 2014 09:00:17 -0400, Tommi <tommitissari at hotmail.com> wrote:
> On Sunday, 23 March 2014 at 00:50:34 UTC, Walter Bright wrote:
>> It's become clear to me that we've underspecified what an InputRange
>> is. The normal way to use it is:
>>
>> while (!r.empty) {
>> auto e = r.front;
>> ... do something with e ...
>> r.popFront();
>> }
>>
>> no argument there. But there are two issues:
>>
>> 1. If you know the range is not empty, is it allowed to call r.front
>> without calling r.empty first?
>>
>> If this is true, extra logic will need to be added to r.front in many
>> cases.
>>
>> 2. Can r.front be called n times in a row? I.e. is calling front()
>> destructive?
>>
>> If true, this means that r.front will have to cache a copy in many
>> cases.
>
> Is InputRange supposed to be a one-pass range and am I supposed to able
> to use InputRange as a lightweight wrapper for a stream? If the answer
> is yes, then I think the fundamental issue is that the
> empty-front-popFront interface is not optimal for something like
> InputRange. But given that's the interface we have, I think that
> InputRange's front must be allowed to be destructive because the stream
> it could potentially be wrapping is destructive.
A range interface only works for a buffered stream, which naturally allows
caching.
-Steve
More information about the Digitalmars-d
mailing list