On 06/05/12 22:23, simendsjo wrote: > On Tue, 05 Jun 2012 20:46:51 +0200, Timon Gehr <timon.g...@gmx.ch> wrote: > >> >> It should be dropped. A pointer to range is a perfectly fine range. > > > Sure..? I couldn't get it to work either: > struct R { > string test = "aoeu"; > @property front() { return test[0]; } > @property bool empty() { return !test.length; } > void popFront(){test = test[0..$];} > } > > void main() { > R r; > R* p = &r; > foreach(ch; p) // invalid foreach aggregate p > writeln(ch); > }
It /is/ a valid range, but it's /not/ currently accepted by foreach. So you have to write the above as: struct R { string test = "aoeu"; @property front() { return test[0]; } @property bool empty() { return !test.length; } void popFront(){test = test[0..$];} } struct RangePtr(R) { R* ptr; alias ptr this; @property front()() { return ptr.front; } } void main() { R r; auto p = RangePtr!R(&r); foreach(ch; p) writeln(ch); } which works, but only obfuscates the code and can be less efficient. artur