#ifndef __SVECTOR_TPP__ #define __SVECTOR_TPP__ template SVector::SVector(const T &value) { components.fill(value); } template SVector::SVector(const std::initializer_list &init) { size_t n = (init.size() < N) ? init.size() : N; /* copy init list without include */ size_t index = 0; /* copy the initializer list until its size */ for (auto c : init) { if (index >= n) break; components[index++] = c; } /* fill the remaining components with zero */ while(index < N) components[index++] = 0; } template SVector::SVector(const SVector &cpy) { this->components = cpy.components; } template SVector& SVector::operator=(const SVector &v) { this->components = v.components; } template const size_t SVector::size() const { return N; } /* Access operators */ template T& SVector::operator[](size_t i) { return components[i]; } template const T& SVector::operator[](size_t i) const { return components[i]; } template SVector& SVector::operator+=(const Vector &w) { return static_cast&>(this->add(w)); } template SVector& SVector::operator-=(const Vector &w) { return static_cast&>(this->sub(w)); } template SVector& SVector::operator*=(double k) { return static_cast&>(this->mult(k)); } template SVector& SVector::operator/=(double k) { return static_cast&>(this->divide(k)); } template SVector& SVector::operator~() { return static_cast&>(this->reverse()); } template SVector& SVector::unit() { return static_cast&>(this->_unit()); } template const SVector operator+(SVector v, const Vector& w) { return v += w; } template const SVector operator-(SVector v, const Vector& w) { return v -= w; } template const SVector operator*(SVector v, double k) { return v *= k; } template const SVector operator/(SVector v, double k) { return v /= k; } template const SVector operator*(double k, SVector v) { return v *= k; } template const SVector operator/(double k, SVector v) { return v /= k; } template const SVector operator-(SVector v) { return ~v; } inline const SVector operator^(const SVector& v, const SVector& w) { SVector u = {0, 0, 0}; u[0] = v[1] * w[2] - v[2] * w[1]; u[1] = v[2] * w[0] - v[0] * w[2]; u[2] = v[0] * w[1] - v[1] * w[0]; return u; } inline double operator^(const SVector& v, const SVector& w) { return v[0] * w[1] - v[1] * w[0]; } inline double operator^(const SVector& v, const SVector& w) { return v[0] * w[0]; } #endif