www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Metaprogramming with D.

reply "Agustin" <agustin.l.alvarez hotmail.com> writes:
I'm trying to implement a template Vector and i would like to 
know if this is possible.

My current vector class is:

public class Vector(T, size_t size) {
     private T components[size];
}

And i would like to implement a property as this:

 property
public size_t length() const {
     return Trait.ExpandFor(size, components, Function(+, (n, 
j))); // Kind of messy but you get my point.
}

instead of doing for(...) over a array i would like to make a 
trait that produce this code

return (x * x + y * y + z * z + ...)
Oct 19 2013
parent reply "TheFlyingFiddle" <theflyingfiddle gmail.com> writes:
On Saturday, 19 October 2013 at 15:22:31 UTC, Agustin wrote:
 I'm trying to implement a template Vector and i would like to 
 know if this is possible.

 My current vector class is:

 public class Vector(T, size_t size) {
     private T components[size];
 }

 And i would like to implement a property as this:

  property
 public size_t length() const {
     return Trait.ExpandFor(size, components, Function(+, (n, 
 j))); // Kind of messy but you get my point.
 }

 instead of doing for(...) over a array i would like to make a 
 trait that produce this code

 return (x * x + y * y + z * z + ...)
From your post i guess that the goal here is to do loop unrolling. A simple way to achive this is to force a loop unrool by iterating over a TypeTuple. module vector; import std.typetuple; class Vector(T, size_t size) { private T[size] components; public T length() const //Guessing this is vector magnitude { T res = 0; foreach(i; staticIota!(0u, size)) //Unrools the loop at compile-time. { res += components[i]; } return cast(T)std.math.sqrt(res); } } //Creates a range from start inclusive to end exclusive. template staticIota(size_t start, size_t end) { static if(start == end) alias TypeTuple!() staticIota; else static if(start < end) alias TypeTuple!(start, staticIota!(start + 1, end)) staticIota; else static assert(0, "start cannot be greater then end!"); } This works since the value _size_ is avalible at compile-time.
Oct 19 2013
parent "TheFlyingFiddle" <theflyingfiddle gmail.com> writes:
   	    res += components[i];
Should be res += components[i] * components[i];
Oct 19 2013