bearophile wrote:
Walter Bright:
and then s.foo(3), if foo is not a compile time member of s, is rewritten as:
    s.opDynamic!("foo")(3);

I don't understand, isn't this the right translation?
s.opDynamic("foo", 3);
If the "foo" name is known at compile time only (as in all C# examples and in 
Python) you can't use a template argument.
(And then it becomes useful to have associative arrays that are fast when the 
number of keys is small, < 10).

You mean, if it's known at run-time only?
What Walter has written is definitely the correct one.

Consider, for example, swizzling an array of float[4] using SSE2
Instead of writing the 256 functions  .xyzw(), .xzyz(), .wzyy(), etc,
you can just write a single function:

bool isXYZW(char c) { return c=='x' || c=='y' || c=='z' || c=='w');

float[4] opDynamic(char [] s)() if (s.length==4 && isXYZW(s[0]) && isXYZW(s[1] && isXYZW(s[2]) && isXYZW
{
    string hexdigit = "0123456789ABCDEF";
    mixin("asm { pshufd xmm0, xmm1, 0x"
      ~ hexdigit[((s[0]-'w'+3)&3)*4+(s[1]-'w'+3)&3]
      ~ hexdigit[((s[2]-'w'+3)&3)*4+(s[3]-'w'+3)&3] ~";");
}

Not actually tested <g>.

Reply via email to