std.range.interfaces : InputRange moveFront

Johan Engelen j at j.nl
Fri Dec 1 09:11:40 UTC 2017


On Thursday, 30 November 2017 at 06:36:12 UTC, Ali Çehreli wrote:
>
> import std.range;
>
> struct S {
>     int i;
>     bool is_a_copy = false;
>     this(this) {
>         is_a_copy = true;
>     }
> }
>
> void main() {
>     auto r =  [S(1)];
>
>     auto a = r.front;
>     assert(a.is_a_copy);       // yes, a is a copy
>     assert(a.i == 1);          // as expected, 1
>     assert(r.front.i == 1);    // front is still 1
>
>     auto b = r.moveFront();
>     assert(!b.is_a_copy);      // no, b is not a copy
>     assert(b.i == 1);          // state is transferred
>     assert(r.front.i == 0);    // front is int.init
> }

I tested it and it works like you wrote, but the behavior is 
different for an array of integers...:

auto a = [ 1,2,3 ];
writeln(a.front); // 1
auto b = a.moveFront();
writeln(b); // 1
writeln(a.length); // still 3
writeln(a.front); // still 1

-Johan


More information about the Digitalmars-d-learn mailing list