Vector Swizzling in D
Boscop
nospam at example.com
Wed Mar 14 10:46:24 PDT 2012
On Wednesday, 14 March 2012 at 17:35:06 UTC, Don Clugston wrote:
> In the last bit of code, why not use CTFE for valid(string s)
> instead of templates?
>
> bool valid(string s)
> {
> foreach(c; s)
> {
> if (c < 'w' || c > 'z') return false;
> }
> return true;
> }
>
> In fact you can use CTFE for the other template functions as
> well.
In the original version I actually did this, but even with -O
-inline -release the opDispatchs call didn't get inlined. I
thought it was caused by CTFE-code that prevented the inlining.
FWIW, this was the original code using CTFE:
---
import std.algorithm: reduce;
struct Vec {
double[4] v;
@property auto X() {return v[0];}
@property auto Y() {return v[1];}
@property auto Z() {return v[2];}
@property auto W() {return v[3];}
this(double x, double y, double z, double w) {v = [x,y,z,w];}
@property auto opDispatch(string s)() if(s.length <= 4 &&
reduce!((s,c)=>s && 'w' <= c && c <= 'z')(true, s)) {
char[] p = s.dup;
foreach(i; s.length .. 4) p ~= p[$-1];
int i(char c) {return [3,0,1,2][c-'w'];}
return Vec(v[i(p[0])], v[i(p[1])], v[i(p[2])], v[i(p[3])]);
}
}
unittest {
assert(Vec(5,6,7,8).zyzx == Vec(7, 6, 7, 5));
assert(Vec(5,6,7,8).zyx == Vec(7, 6, 5, 5));
assert(Vec(5,6,7,8).wy == Vec(8, 6, 6, 6));
assert(Vec(5,6,7,8).z == Vec(7, 7, 7, 7));
}
---
(I was using reduce here only to demonstrate D's functional
features and nice lambda syntax. Maybe that's what prevented
inlining?)
More information about the Digitalmars-d-learn
mailing list