/** This file is a part of our_dick Copyright (C) 2020 rexy712 This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ #ifndef REXY_VEC_HPP #define REXY_VEC_HPP #include "mat.hpp" #include "math_common.hpp" namespace math{ //class representing vectors //inherit from matrix base because it also shared matrix attributes 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; template && ...),int> = 0> constexpr vector(const vector& other, Args&&... args); template constexpr vector(const vector& other); constexpr vector(const vector&) = default; constexpr vector(vector&&) = default; ~vector(void) = 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; constexpr reference x(void); constexpr const_reference x(void)const; template constexpr reference y(void); template constexpr const_reference y(void)const; template constexpr reference z(void); template constexpr const_reference z(void)const; template constexpr reference w(void); template constexpr const_reference w(void)const; value_type magnitude(void)const; vector normalize(void); protected: template constexpr void assign_(size_type offset, U&& u, Args&&... args); }; template constexpr auto perp(const vector& v); template constexpr auto perp(const vector& left, const vector& right); template constexpr auto cross(const vector& left, const vector& right); template constexpr auto magnitude(const vector& v); template constexpr auto operator*(const matrix& left, const vector& right); template constexpr auto operator*(const vector& left, const vector& right); template constexpr auto operator*(const vector& left, U&& right); template constexpr auto operator*(U&& left, const vector& right); template 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 constexpr decltype(auto) operator*=(vector& left, U&& right); template 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