oversight with input ranges
Steven Schveighoffer via Digitalmars-d
digitalmars-d at puremagic.com
Wed Apr 22 09:02:51 PDT 2015
On 4/21/15 7:31 PM, ketmar wrote:
> On Tue, 21 Apr 2015 18:57:50 -0400, Steven Schveighoffer wrote:
>
>> On 4/21/15 3:53 PM, ketmar wrote:
>>> here's the interesting oversight for isInputRange:
>>> https://issues.dlang.org/show_bug.cgi?id=14478
>>>
>>> so be careful: ranges with non-copyable elements aren't input ranges
>>> for now. ;-)
>>
>> This does seem like an incorrect limitation, and I'm not sure if it was
>> intentional. However, there is a lot of code out there that expects this
>> to work when isInputRange is true. I don't know if we should change it,
>> as the range definition is pretty clear in the documentation that auto h
>> = r.front is a required feature for ranges. What is the use case for
>> this?
>
> one possible use case was shown in bugreport. array of non-copyable
> struct, yet i still want chain 'em, for example. or filter. or...
>
> struct S {
> int n;
> @disable this (this);
> }
>
> void main () {
> S[2] arr;
> arr[0].n = 1;
> arr[1].n = 2;
> foreach (ref el; arr[].filter!((ref a) => a.n > 1)) {
> writeln(el.n);
> }
> }
>
>
> this code is perfectly valid, it doesn't require copying at all, yet it
> is invalid now.
>
Yes, I agree this is a valid use case. I don't think we can change
isInputRange, because other code may depend on that requirement of
copyability, but it is probably possible to alter algorithms so they can
accept these "not-quite" input ranges. Definitely proxy or decorator
type adapters that provide a proxy for front shouldn't be restricted to
using only copyable range elements.
1st step is we need a trait to define what we are looking for, then the
next step is to simply alter all the appropriate algorithms to use it.
It shouldn't hinder any code that exists if we do that.
So what should be the name of this beast?
-Steve
More information about the Digitalmars-d
mailing list