> template duffs_device(alias id1, alias id2, alias s)
> {
>     void duff_loop()
>     {
>       if (id1 < id2)
>       {
>           typeof(id1) n = (id2 - id1 + 7) / 8;
>           switch ((id2 - id1) % 8)
>           {
>               case 0:        do {  s();
>               case 7:              s();
>               case 6:              s();
>               case 5:              s();
>               case 4:              s();
>               case 3:              s();
>               case 2:              s();
>               case 1:              s();
>                                 } while (--n > 0);
>           }
>       }
>     }
> }
> 
> void foo() { writefln("foo"); }
> 
> void test()
> {
>     int i = 1;
>     int j = 11;
> 
>     mixin duffs_device!(i, j, delegate { foo(); } );
>     duff_loop();      // executes foo() 10 times
> }

The Duff's device is said to be an optimization, but I get blunt device only 
0.7% slower.

template blunt_device(alias id1, alias id2, alias s)
{
        void blunt_loop()
        {
                if (id1 < id2)
                {
                        typeof(id1) i = id2 - id1;
                        while(i-->0)s();
                }
        }
}

Reply via email to