isInputRange is false for non-copyable types

Steven Schveighoffer schveiguy at yahoo.com
Tue Apr 17 15:14:02 UTC 2018


On 4/15/18 6:14 AM, Dmitry Olshansky wrote:
> On Sunday, 15 April 2018 at 06:39:43 UTC, Jonathan M Davis wrote:
>> On Sunday, April 15, 2018 07:26:54 Shachar Shemesh via Digitalmars-d 
>> wrote:
>>> [...]
>>
>> It's extremely common for range-based functions to copy front. Even 
>> foreach does it. e.g.
>>
>> [...]
> 
> 
> Arguably it should “move” them.
> 
> This would have worked if input ranges didn’t have to cache front to 
> support multiple ‘front’ calls before popFront. Which is a painful 
> misfeature really as all algorithms would optimize for touching front 
> once anyway.

Ugh, then you get things like fungetc.

However, there are certainly cases where it's expensive to compute 
front, and therefore, requires a cache. A new primitive that accesses 
front and pops it at the same time would be useful. We can have selected 
algorithms that can deal with it use that primitive instead (and 
instrument foreach to do it). Potentially, we can create a wrapper for 
all input ranges such that they support it.

> Input range should “produce” elements not keep cache of them, forward 
> ranges may cache current item alright.

Well, sometimes you HAVE to cache it. For instance File.byLine is 
clearly an input range, and not a forward range. But it MUST cache 
because it's i/o that has to be buffered to be looked at! No reason to 
force caching on the user at that point.

-Steve


More information about the Digitalmars-d mailing list