protocol for using InputRanges

Tommi tommitissari at hotmail.com
Sun Mar 23 06:00:17 PDT 2014


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.


More information about the Digitalmars-d mailing list