> 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(); } } }