On Friday, 14 August 2015 at 00:33:30 UTC, Luís Marques wrote:
Despite using them all the time, I'm suddenly confused about
ranges...
My understanding is that (for library-worth code) algorithms
that consume ranges are supposed to use .save() to be
compatible with both ref type and value type ranges. What about
the reverse? Are algorithms supposed to try to avoid
effectively .save()ing ranges (when they are value types) by
not copying range variables? Furthermore, is it incorrect for
an input range that is also not a forward range (or at least
does not declare itself formally as a forward range by having a
save()) to allow itself to be bitwise copied? (i.e., to
effectively provide a save() behaviour).
I was confused a lot about ranges until I realised that a range
is only a `view` onto the data. A range is not *the* data.
For example, consuming a range does not consume the underlying
data or modify it in any way. A forward range's save method is
for creating a copy of the view, not a copy of the underlying
data. This is to allow two ranges to be consumed independently
without affecting the data.
Usually, these ranges are returned in the form of a Result struct
as shown here:
https://github.com/D-Programming-Language/phobos/blob/master/std/uni.d#L6517