xxxxxxxxxx
import std.typecons;
import std.stdio;
void main() {
writeln("OK:");
ok();
writeln("\nNOT OK:");
notOk();
}
void ok() {
auto r = refCounted(Range());
writeln("before ", r.front);
for (auto __rangeCopy = r; !__rangeCopy.empty; __rangeCopy.popFront())
writeln("loop ", __rangeCopy.front);
writeln("after ", r.front);
assert(r.i == 3, "r.i != 3");
}
void notOk() {
auto r = refCounted(Range());
writeln("before ", r.front);
foreach (i; r)
writeln("loop ", i);
writeln("after ", r.front);
assert(r.i == 3, "r.ri != 3");
}
struct Range {
int i;
// @disable this(this); // uncomment this line and notOk() fails to compile at foreach
bool empty() {
return i == 3;
}
void popFront() {
i++;
}
int front() {
write("addr ", &this, ": ");
return i;
}
}