On Wednesday, 19 March 2014 at 23:00:08 UTC, Walter Bright wrote:
I don't have a solid enough experience with this style of
programming, but one opportunity of 'each' could be that it
could be specialized and achieve greater speed for some
arguments.
Speaking of which, it would be nice to have a compiler default
iteration scheme that is optimal for any range.
The current status is:
"for ( ; !r.empty ; r.popFront )" is sub-optimal for string
types, and sometimes arrays.
alias E = ElementEncodingType!Range;
"foreach(E e; range);" will create copies of elements
"foreach(ref E e; range);" will always work, but is arguably
wrong for RValue ranges
"foreach(auto ref E e; range);" is not legal, but there is an ER
requesting it, and I think it would make perfect sense to have
this.
Finally: The hand written library code
while ( decode(s, i) < s.length )
{ ... }
Is faster for strings, than the compiler's/druntime's "foreach(E
e; range);".
It would be awesome if:
foreach(auto ref E e; range);
Worked, *and* was always optimal.
The current scheme makes those who care jump through hoops, such
as in `find`'s implementation.