www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Vector Swizzling in D

reply "Boscop" <nospam example.com> writes:
Hi everyone,

I wrote a blog post for people who know a bit of D and want to 
dig deeper, it shows different approaches to get vector swizzling 
syntax in D:

http://boscop.tk/blog/?p=1

There is nothing revolutionary involved but it might still be 
useful to someone.
Comments and criticism are welcome.
Mar 14 2012
next sibling parent reply Dmitry Olshansky <dmitry.olsh gmail.com> writes:
On 14.03.2012 18:57, Boscop wrote:
 Hi everyone,

 I wrote a blog post for people who know a bit of D and want to dig
 deeper, it shows different approaches to get vector swizzling syntax in D:

 http://boscop.tk/blog/?p=1

 There is nothing revolutionary involved but it might still be useful to
 someone.
 Comments and criticism are welcome.

Why I'm not seeing opDispatch anywhere ? Take it as criticism :) -- Dmitry Olshansky
Mar 14 2012
parent Dmitry Olshansky <dmitry.olsh gmail.com> writes:
On 14.03.2012 19:03, Dmitry Olshansky wrote:
 On 14.03.2012 18:57, Boscop wrote:
 Hi everyone,

 I wrote a blog post for people who know a bit of D and want to dig
 deeper, it shows different approaches to get vector swizzling syntax
 in D:

 http://boscop.tk/blog/?p=1

 There is nothing revolutionary involved but it might still be useful to
 someone.
 Comments and criticism are welcome.

Why I'm not seeing opDispatch anywhere ? Take it as criticism :)

-- Dmitry Olshansky
Mar 14 2012
prev sibling next sibling parent "H. S. Teoh" <hsteoh quickfur.ath.cx> writes:
On Wed, Mar 14, 2012 at 03:57:02PM +0100, Boscop wrote:
 Hi everyone,
 
 I wrote a blog post for people who know a bit of D and want to dig
 deeper, it shows different approaches to get vector swizzling syntax
 in D:
 
 http://boscop.tk/blog/?p=1
 
 There is nothing revolutionary involved but it might still be useful
 to someone.
 Comments and criticism are welcome.

I like it. It's a good way to show off what's possible with opDispatch. :-) Reminds me of implementing Roman numerals with opDispatch, that was discussed recently. T -- Prosperity breeds contempt, and poverty breeds consent. -- Suck.com
Mar 14 2012
prev sibling next sibling parent reply Don Clugston <dac nospam.com> writes:
On 14/03/12 15:57, Boscop wrote:
 Hi everyone,

 I wrote a blog post for people who know a bit of D and want to dig
 deeper, it shows different approaches to get vector swizzling syntax in D:

 http://boscop.tk/blog/?p=1

 There is nothing revolutionary involved but it might still be useful to
 someone.
 Comments and criticism are welcome.

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.
Mar 14 2012
parent Don Clugston <dac nospam.com> writes:
On 14/03/12 18:46, Boscop wrote:
 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;

This won't be CTFEd, because it's not forced to be a compile-time constant.
 foreach(i; s.length .. 4) p ~= p[$-1];

But, you can do something like: enum p = extend(s); since p is an enum, it must use CTFE.
 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])]);
 }

 ---
 (I was using reduce here only to demonstrate D's functional features and
 nice lambda syntax. Maybe that's what prevented inlining?)

Mar 15 2012
prev sibling next sibling parent "Boscop" <nospam example.com> writes:
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?)
Mar 14 2012
prev sibling parent "Boscop" <nospam example.com> writes:
Thanks for the suggestions, I updated the article with an 
improved CTFE version at the end.
Mar 15 2012