On Friday, 31 May 2013 at 14:06:19 UTC, finalpatch wrote:
Just want to share a new way I just discovered to do loop
unrolling.
template Unroll(alias CODE, alias N)
{
static if (N == 1)
enum Unroll = format(CODE, 0);
else
enum Unroll = Unroll!(CODE, N-1)~format(CODE, N-1);
}
after that you can write stuff like
mixin(Unroll!("v[%1$d]"~op~"=rhs.v[%1$d];", 3));
and it gets expanded to
v[0]+=rhs.v[0];v[1]+=rhs.v[1];v[2]+=rhs.v[2];
I find this method simpler than with foreach() and a tuple
range, and also faster because it's identical to hand unrolling.
Remember that in D, most side-effect free functions can be run at
compile time. No need for recursive template trickery:
mixin(iota(3).map!(i => format("v[%1$d]+=rhs.v[%1$d];",
i)).join());