RefRange
David
d at dav1d.de
Sun Aug 26 14:25:15 PDT 2012
Am 26.08.2012 18:06, schrieb Ali Çehreli:
> On 08/26/2012 08:41 AM, David wrote:
>> It's a RefRange, but not completly ... Can somebody explain me that
>> behaviour?
>>
>> http://dpaste.dzfl.pl/643de2a3
>
> According to its documentation, RefRange works differently whether the
> original range is a ForwardRange or not:
>
> http://dlang.org/phobos/std_range.html#refRange
>
> I have made TestRange a ForwardRange but then I had to comment out two
> lines of your program. Does it work according to your expectations with
> this change?
>
> import std.stdio;
> import std.range;
>
> struct TestRange {
> float[] x = [0, 1, 2, 3, 4, 5];
>
> @property bool empty() {
> return x.length == 0;
> }
>
> @property ref float front() {
> return x[0];
> }
>
> void popFront() {
> //writefln("before: %s", x);
> x = x[1..$];
> //x.popFront();
> //writefln("after: %s", x);
> }
>
> TestRange save() @property {
> return TestRange(x);
> }
> }
>
>
>
> void main() {
> static assert(isForwardRange!TestRange);
>
> TestRange r = TestRange();
> auto rr = refRange(&r);
>
> // foreach(element; rr) {}
>
> // writefln("Original range: %s", r.x);
> // writefln("RefRange: %s", rr.x);
>
> writefln("%s - %s", r.x.ptr, r.x.ptr);
>
> rr.popFront();
>
> writefln("%s - %s", r.x.ptr, r.x.ptr);
> writefln("Original range: %s", r.x);
> // We can't expect the RefRange to have the members of the original
> range
> // writefln("RefRange: %s", rr.x);
>
> r.popFront();
>
> writefln("%s - %s", r.x.ptr, r.x.ptr);
> writefln("Original range: %s", r.x);
> // We can't expect the RefRange to have the members of the original
> range
> // writefln("RefRange: %s", rr.x);
> }
>
> Ali
Yes, that does it, but .save doesn't play well with RefRange (a static
assert inside RefRange fails, telling that the produced RefRange-Type is
not a ForwardRange).
More information about the Digitalmars-d-learn
mailing list