30#ifndef INCLUDED_SIMPLE_VECTOR_HPP
31#define INCLUDED_SIMPLE_VECTOR_HPP
40template <
typename T, std::
size_t N>
class vector
49 using pointer =
typename data_type::pointer;
63 for (
unsigned int i = 0; i < N; ++i)
data[i] = ptr[i];
67 for (
unsigned int i = 0; i < N; ++i) data[i] = static_cast<T>(other.
data[i]);
70 vector(std::array<T, N>&& _data) :
data(std::move(_data)) {}
81 static constexpr std::size_t
size() {
return N; }
106 for (
unsigned int i = 0; i < N; ++i) {
108 if (i < N - 1) os <<
" ";
131 for (
unsigned int i = 0; i < N; ++i)
data[i] += other[i];
136 for (
unsigned int i = 0; i < N; ++i)
data[i] += element;
141 for (
unsigned int i = 0; i < N; ++i)
data[i] -= other[i];
146 for (
unsigned int i = 0; i < N; ++i)
data[i] -= element;
151 for (
unsigned int i = 0; i < N; ++i)
data[i] *= other[i];
156 for (
unsigned int i = 0; i < N; ++i)
data[i] *= element;
161 for (
unsigned int i = 0; i < N; ++i)
data[i] /= other[i];
166 for (
unsigned int i = 0; i < N; ++i)
data[i] /= element;
188 for (
unsigned int i = 0; i < N; ++i) v.
data[i] = -v.
data[i];
192template <
typename U,
typename V, std::
size_t N>
196 for (
unsigned int i = 0; i < N; ++i) res[i] += rhs[i];
200template <
typename U,
typename V, std::
size_t N>
204 for (
unsigned int i = 0; i < N; ++i) res[i] += rhs;
205 return std::move(res);
208template <
typename U,
typename V, std::
size_t N>
212 for (
unsigned int i = 0; i < N; ++i) res[i] += lhs;
213 return std::move(res);
216template <
typename U,
typename V, std::
size_t N>
220 for (
unsigned int i = 0; i < N; ++i) res[i] -= rhs[i];
224template <
typename U,
typename V, std::
size_t N>
228 for (
unsigned int i = 0; i < N; ++i) res[i] -= rhs;
229 return std::move(res);
232template <
typename U,
typename V, std::
size_t N>
236 for (
unsigned int i = 0; i < N; ++i) res[i] -= lhs;
237 return std::move(res);
240template <
typename U,
typename V, std::
size_t N>
244 for (
unsigned int i = 0; i < N; ++i) res[i] *= rhs[i];
245 return std::move(res);
248template <
typename U,
typename V, std::
size_t N>
252 for (
unsigned int i = 0; i < N; ++i) res[i] *= rhs;
253 return std::move(res);
256template <
typename U,
typename V, std::
size_t N>
260 for (
unsigned int i = 0; i < N; ++i) res[i] *= lhs;
261 return std::move(res);
264template <
typename U,
typename V, std::
size_t N>
268 for (
unsigned int i = 0; i < N; ++i) res[i] /= rhs[i];
269 return std::move(res);
272template <
typename U,
typename V, std::
size_t N>
276 for (
unsigned int i = 0; i < N; ++i) res[i] /= rhs;
277 return std::move(res);
280template <
typename U,
typename V, std::
size_t N>
284 for (
unsigned int i = 0; i < N; ++i) res[i] = lhs / res[i];
285 return std::move(res);
288template <
typename U,
typename V, std::
size_t N>
291 typename std::common_type<U, V>::type res(lhs[0] * rhs[0]);
292 for (
unsigned int i = 1; i < N; ++i) res += lhs[i] * rhs[i];
293 return std::move(res);
301 auto m = std::fabs(v[0]);
302 for (
unsigned int i = 1; i < N; ++i) m = max(m, std::fabs(v[i]));
306template <
typename U,
typename V, std::
size_t N>
307typename std::enable_if<N == 3, math::vector<typename std::common_type<U, V>::type, N>>::type
cross(
const math::vector<U, N>& lhs,
311 {lhs.
y() * rhs.
z() - lhs.
z() * rhs.
y(), lhs.
z() * rhs.
x() - lhs.
x() * rhs.
z(), lhs.
x() * rhs.
y() - lhs.
y() * rhs.
x()});
314template <
typename U,
typename V, std::
size_t N>
317 return lhs.
x() * rhs.
y() - lhs.
y() * rhs.
x();
const_iterator begin() const
Definition vector.hpp:116
reverse_iterator rbegin()
Definition vector.hpp:121
const_reference front() const
Definition vector.hpp:91
vector & operator*=(const vector &other)
Definition vector.hpp:149
typename data_type::reference reference
Definition vector.hpp:47
typename data_type::iterator iterator
Definition vector.hpp:51
const_reverse_iterator rbegin() const
Definition vector.hpp:122
reference operator[](size_type pos)
Definition vector.hpp:84
const_reference operator[](size_type pos) const
Definition vector.hpp:85
const_reference y() const
Definition vector.hpp:97
vector & operator+=(const U &element)
Definition vector.hpp:134
const_iterator cend() const
Definition vector.hpp:120
vector & operator=(vector &&) &=default
reference w()
Definition vector.hpp:100
typename data_type::value_type value_type
Definition vector.hpp:44
typename data_type::pointer pointer
Definition vector.hpp:49
typename data_type::size_type size_type
Definition vector.hpp:45
typename data_type::const_iterator const_iterator
Definition vector.hpp:52
reference x()
Definition vector.hpp:94
const_reference w() const
Definition vector.hpp:101
const_reference z() const
Definition vector.hpp:99
vector & operator-=(const U &element)
Definition vector.hpp:144
typename data_type::reverse_iterator reverse_iterator
Definition vector.hpp:53
vector & operator+=(const vector &other)
Definition vector.hpp:129
vector(const vector &)=default
data_type data
Definition vector.hpp:171
static constexpr std::size_t size()
Definition vector.hpp:81
iterator end()
Definition vector.hpp:118
reverse_iterator rend()
Definition vector.hpp:124
const_reverse_iterator rend() const
Definition vector.hpp:125
typename data_type::const_reverse_iterator const_reverse_iterator
Definition vector.hpp:54
vector(std::array< U, N > &&_data)
Definition vector.hpp:70
vector & operator-=(const vector &other)
Definition vector.hpp:139
const_reverse_iterator crend() const
Definition vector.hpp:126
iterator begin()
Definition vector.hpp:115
vector(const U &element)
Definition vector.hpp:58
vector & operator/=(const U &element)
Definition vector.hpp:164
vector(const vector< T2, N > &other)
Definition vector.hpp:65
const_reference operator()(size_type i) const
Definition vector.hpp:88
reference z()
Definition vector.hpp:98
const_reference x() const
Definition vector.hpp:95
reference operator()(size_type i)
Definition vector.hpp:87
const_reverse_iterator crbegin() const
Definition vector.hpp:123
const_reference back() const
Definition vector.hpp:93
vector(const U *ptr)
Definition vector.hpp:61
vector(const std::array< U, N > &_data)
Definition vector.hpp:69
typename data_type::const_pointer const_pointer
Definition vector.hpp:50
std::array< U, N > data_type
Definition vector.hpp:43
vector & operator*=(const U &element)
Definition vector.hpp:154
reference back()
Definition vector.hpp:92
reference y()
Definition vector.hpp:96
vector & operator/=(const vector &other)
Definition vector.hpp:159
vector & operator=(const U &element) &
Definition vector.hpp:74
reference front()
Definition vector.hpp:90
const_iterator end() const
Definition vector.hpp:119
typename data_type::const_reference const_reference
Definition vector.hpp:48
vector & operator=(const vector &) &=default
const_iterator cbegin() const
Definition vector.hpp:117
vector(vector &&)=default
friend std::ostream & operator<<(std::ostream &os, const vector &v)
Definition vector.hpp:103
typename data_type::difference_type difference_type
Definition vector.hpp:46
math::vector< typename std::common_type< U, V >::type, N > operator*(const math::vector< U, N > &lhs, const math::vector< V, N > &rhs)
Definition vector.hpp:241
math::vector< T, N > operator-(math::vector< T, N > v)
Definition vector.hpp:186
U norm_inf(const math::vector< U, N > &v)
Definition vector.hpp:298
math::vector< typename std::common_type< U, V >::type, N > operator/(const math::vector< U, N > &lhs, const math::vector< V, N > &rhs)
Definition vector.hpp:265
bool operator>(const math::vector< T, N > &lhs, const math::vector< T, N > &rhs)
Definition vector.hpp:182
std::common_type< U, V >::type dot(const math::vector< U, N > &lhs, const math::vector< V, N > &rhs)
Definition vector.hpp:289
bool operator<=(const math::vector< T, N > &lhs, const math::vector< T, N > &rhs)
Definition vector.hpp:180
bool operator<(const math::vector< T, N > &lhs, const math::vector< T, N > &rhs)
Definition vector.hpp:178
bool operator>=(const math::vector< T, N > &lhs, const math::vector< T, N > &rhs)
Definition vector.hpp:184
std::enable_if< N==3, math::vector< typenamestd::common_type< U, V >::type, N > >::type cross(const math::vector< U, N > &lhs, const math::vector< V, N > &rhs)
Definition vector.hpp:307
bool operator!=(const math::vector< T, N > &lhs, const math::vector< T, N > &rhs)
Definition vector.hpp:176
U norm2(const math::vector< U, N > &v)
Definition vector.hpp:296
bool operator==(const math::vector< T, N > &lhs, const math::vector< T, N > &rhs)
Definition vector.hpp:174
math::vector< typename std::common_type< U, V >::type, N > operator+(const math::vector< U, N > &lhs, const math::vector< V, N > &rhs)
Definition vector.hpp:193