X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flinal%2Fvector.h;h=31597d4282410e2606590eaea2faa6d3c22c2cd9;hb=0a8781509bafe347b9c32f1106891eac18354965;hp=9ef46fde412f22804535065d6dd59c10b11963e2;hpb=643aa7b2317f88463f66da11e595ebe0f6c9621d;p=libs%2Fmath.git diff --git a/source/linal/vector.h b/source/linal/vector.h index 9ef46fd..31597d4 100644 --- a/source/linal/vector.h +++ b/source/linal/vector.h @@ -3,6 +3,7 @@ #include #include +#include namespace Msp { namespace LinAl { @@ -74,17 +75,30 @@ template class Vector: public VectorComponents { public: + typedef T ElementType; + Vector(); Vector(const T *); + + /** Constructs a vector from an array of interleaved values. Intended for + use by Matrix row accessor. */ + Vector(const T *, unsigned); + +#if __cplusplus >= 201103L + template + Vector(T, Args...); +#else Vector(T, T); Vector(T, T, T); Vector(T, T, T, T); +#endif template Vector(const Vector &); - template - Vector(const Vector &, U); - template - explicit Vector(const Vector &); + + unsigned size() const { return N; } + + template + Vector slice(unsigned) const; Vector &operator*=(T); Vector &operator/=(T); @@ -110,6 +124,25 @@ inline Vector::Vector(const T *d) (*this)[i] = d[i]; } +template +inline Vector::Vector(const T *d, unsigned stride) +{ + for(unsigned i=0; i= 201103L +template +template +inline Vector::Vector(T x_, Args... v) +{ + static_assert(1+sizeof...(v)==N, "Incorrect number of arguments in Vector constructor"); + (*this)[0] = x_; + unsigned i = 1; + for(auto c: std::initializer_list { static_cast(v)... }) + (*this)[i++] = c; +} +#else /* The compiler won't instantiate these unless they are used. Trying to use them on the wrong class results in an error. */ template @@ -135,6 +168,7 @@ inline Vector::Vector(T x_, T y_, T z_, T w_) this->VectorComponents::z = z_; this->VectorComponents::w = w_; } +#endif template template @@ -145,20 +179,44 @@ inline Vector::Vector(const Vector &v) } template -template -inline Vector::Vector(const Vector &v, U s) +inline Vector compose(const Vector &v, T s) { - for(unsigned i=0; i r; + for(unsigned i=0; i -template -inline Vector::Vector(const Vector &v) +inline Vector compose(T s, const Vector &v) { + Vector r; + r[0] = s; for(unsigned i=0; i +inline Vector compose(const Vector &v1, const Vector &v2) +{ + Vector r; + for(unsigned i=0; i +template +inline Vector Vector::slice(unsigned j) const +{ + Vector r; + for(unsigned i=0; i @@ -286,6 +344,20 @@ inline Vector cross(const Vector &v1, const Vector &v2) return Vector(v1.y*v2.z-v1.z*v2.y, v1.z*v2.x-v1.x*v2.z, v1.x*v2.y-v1.y*v2.x); } +template +inline std::ostream &operator<<(std::ostream &s, const Vector &v) +{ + s << "Vector" << N << '('; + for(unsigned i=0; i