Transience of .front in input vs. forward ranges
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Sun Nov 4 07:16:53 PST 2012
On 11/4/12 9:36 AM, deadalnix wrote:
> Let's put back relevant elements of the solution I propose :
> 1/ range preserve .front by default .
> 2/ Ranges that would get performance boost from invalidating .front can
> propose a property (we called it .fast in the thread) that return a new
> range that invalidate .front .
IMHO this property is deducible from the others:
fast!R == isInputRange!R && !isForwardRange!R &&
hasMutableIndirections!(ElementType!R)
I think it would be vastly better to avoid defining a new property of
ranges (that subsequently would need to be cross-checked by many
algorithms). Then we have additional scalability issues because all
derived ranges would need to propagate .fast etc. Then we need to cater
for odd cases such as random-access ranges being .fast.
The simpler way would be to simply state that input ranges can't
guarantee the persistence of .front after calling .popFront. This is
quite expected for input ranges, and no different for any object that
gives a char[]-based API; subsequently changing the object may change
the contents of the char[] returned.
The algorithms that need to worry about .front's transience are only the
ones that work with input ranges (as opposed to forward ranges or
stronger). This approach puts the burden in the right place - on the
implementers of specific algorithms supporting one-pass streaming.
Andrei
More information about the Digitalmars-d
mailing list