A simple way to do compile time loop unrolling

finalpatch fengli at gmail.com
Fri May 31 07:06:18 PDT 2013


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.


More information about the Digitalmars-d mailing list