From f79a3cc9bde94d70b63473d052ee4d6092d0b8f1 Mon Sep 17 00:00:00 2001 From: rexy712 Date: Sun, 16 Aug 2020 08:20:47 -0700 Subject: [PATCH] Add vector class --- include/vec.hpp | 68 +++++++++++++++++++++++++ include/vec.tpp | 130 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 198 insertions(+) create mode 100644 include/vec.hpp create mode 100644 include/vec.tpp diff --git a/include/vec.hpp b/include/vec.hpp new file mode 100644 index 0000000..023327a --- /dev/null +++ b/include/vec.hpp @@ -0,0 +1,68 @@ +#ifndef REXY_VEC_HPP +#define REXY_VEC_HPP + +#include "mat.hpp" + +namespace math{ + + template + class vector : public matrix_base + { + private: + using base = matrix_base; + public: + using value_type = typename base::value_type; + using size_type = typename base::size_type; + using pointer = typename base::pointer; + using const_pointer = typename base::const_pointer; + using reference = typename base::reference; + using const_reference = typename base::const_reference; + + public: + using base::base; + + constexpr vector(const vector&) = default; + constexpr vector(vector&&) = default; + ~vector() = default; + + //Assignement + constexpr vector& operator=(const vector&) = default; + constexpr vector& operator=(vector&&) = default; + template + constexpr vector& operator=(const vector& m); + + constexpr reference operator[](size_type i); + constexpr const_reference operator[](size_type i)const; + }; + + + template + constexpr auto operator*(const matrix& left, const vector& right); + template + constexpr auto operator*(const vector& left, const vector& right); + template::value,int> = 0> + constexpr auto operator*(const vector& left, U&& right); + template::value,int> = 0> + constexpr auto operator*(U&& left, const vector& right); + template::value,int> = 0> + constexpr auto operator/(const vector& left, U&& right); + template + constexpr auto operator+(const vector& left, const vector& right); + template + constexpr auto operator-(const vector& left, const vector& right); + template + constexpr auto operator-(const vector& left); + + template::value,int> = 0> + constexpr decltype(auto) operator*=(vector& left, U&& right); + template::value,int> = 0> + constexpr decltype(auto) operator/=(vector& left, U&& right); + template + constexpr decltype(auto) operator+=(vector& left, const vector& right); + template + constexpr decltype(auto) operator-=(vector& left, const vector& right); +} + +#include "vec.tpp" + +#endif diff --git a/include/vec.tpp b/include/vec.tpp new file mode 100644 index 0000000..7e0b907 --- /dev/null +++ b/include/vec.tpp @@ -0,0 +1,130 @@ +#ifndef REXY_VEC_TPP +#define REXY_VEC_TPP + +namespace math{ + + template + template + constexpr vector& vector::operator=(const vector& m){ + base::operator=(m); + return *this; + } + template + constexpr auto vector::operator[](size_type i) -> reference{ + return this->m_data[i]; + } + template + constexpr auto vector::operator[](size_type i)const -> const_reference{ + return this->m_data[i]; + } + + template + constexpr auto operator*(const matrix& left, const vector& right){ + using res_t = decltype(std::declval() * std::declval()); + vector res(zero_initialize); + size_t index = 0; + //columns == rows + for(size_t i = 0;i < R;++i){ + for(size_t k = 0;k < C;++k){ + res.get(index) += left[i][k] * right[k]; + } + ++index; + } + return res; + } + template + constexpr auto operator*(const vector& left, const vector& right){ + using res_t = decltype(std::declval() * std::declval()); + res_t res = 0; + for(size_t i = 0;i < R;++i){ + res += left[i] * right[i]; + } + return res; + } + template::value,int>> + constexpr auto operator*(const vector& left, U&& right){ + using res_t = decltype(std::declval() * std::declval()); + vector res(zero_initialize); + for(size_t i = 0;i < R;++i){ + res[i] = left[i] * std::forward(right); + } + return res; + } + template::value,int>> + constexpr auto operator*(U&& left, const vector& right){ + using res_t = decltype(std::declval() * std::declval()); + vector res(zero_initialize); + for(size_t i = 0;i < R;++i){ + res[i] = std::forward(right) * left[i]; + } + return res; + } + template::value,int>> + constexpr auto operator/(const vector& left, U&& right){ + using res_t = decltype(std::declval() / std::declval()); + vector res(zero_initialize); + for(size_t i = 0;i < R;++i){ + res[i] = left[i] / std::forward(right); + } + return res; + } + template + constexpr auto operator+(const vector& left, const vector& right){ + using res_t = decltype(std::declval() + std::declval()); + vector res(zero_initialize); + for(size_t i = 0;i < R;++i){ + res[i] = left[i] + right[i]; + } + return res; + } + template + constexpr auto operator-(const vector& left, const vector& right){ + using res_t = decltype(std::declval() - std::declval()); + vector res(zero_initialize); + for(size_t i = 0;i < R;++i){ + res[i] = left[i] - right[i]; + } + return res; + } + template + constexpr auto operator-(const vector& left){ + using res_t = decltype(-std::declval()); + vector res(zero_initialize); + for(size_t i = 0;i < R;++i){ + res[i] = -left[i]; + } + return res; + } + + template::value,int>> + constexpr decltype(auto) operator*=(vector& left, U&& right){ + for(size_t i = 0;i < R;++i){ + left[i] *= right; + } + return left; + } + template::value,int>> + constexpr decltype(auto) operator/=(vector& left, U&& right){ + for(size_t i = 0;i < R;++i){ + left[i] /= right; + } + return left; + } + template + constexpr decltype(auto) operator+=(vector& left, const vector& right){ + for(size_t i = 0;i < R;++i){ + left[i] += right[i]; + } + return left; + } + template + constexpr decltype(auto) operator-=(vector& left, const vector& right){ + for(size_t i = 0;i < R;++i){ + left[i] -= right[i]; + } + return left; + } + +} + +#endif