ECOGEN 6.0
Evolutive, Compressible, Open, Genuine, Easy, N-phase
Loading...
Searching...
No Matches
vector.hpp
Go to the documentation of this file.
1//
2// ,---. ,--, .---. ,--, ,---. .-. .-.
3// | .-' .' .') / .-. ) .' .' | .-' | \| |
4// | `-. | |(_) | | |(_) | | __ | `-. | | |
5// | .-' \ \ | | | | \ \ ( _) | .-' | |\ |
6// | `--. \ `-. \ `-' / \ `-) ) | `--. | | |)|
7// /( __.' \____\ )---' )\____/ /( __.' /( (_)
8// (__) (_) (__) (__) (__)
9//
10// This file is part of ECOGEN.
11//
12// ECOGEN is the legal property of its developers, whose names
13// are listed in the copyright file included with this source
14// distribution.
15//
16// ECOGEN is free software: you can redistribute it and/or modify
17// it under the terms of the GNU General Public License as published
18// by the Free Software Foundation, either version 3 of the License,
19// or (at your option) any later version.
20//
21// ECOGEN is distributed in the hope that it will be useful,
22// but WITHOUT ANY WARRANTY; without even the implied warranty of
23// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24// GNU General Public License for more details.
25//
26// You should have received a copy of the GNU General Public License
27// along with ECOGEN (file LICENSE).
28// If not, see <http://www.gnu.org/licenses/>.
29
30#ifndef INCLUDED_SIMPLE_VECTOR_HPP
31#define INCLUDED_SIMPLE_VECTOR_HPP
32
33#include <type_traits>
34#include <array>
35#include <iostream>
36
37namespace math
38{
39
40template <typename T, std::size_t N> class vector
41{
42 public: // member types
43 using data_type = std::array<T, N>;
44 using value_type = typename data_type::value_type;
45 using size_type = typename data_type::size_type;
46 using difference_type = typename data_type::difference_type;
47 using reference = typename data_type::reference;
48 using const_reference = typename data_type::const_reference;
49 using pointer = typename data_type::pointer;
50 using const_pointer = typename data_type::const_pointer;
51 using iterator = typename data_type::iterator;
52 using const_iterator = typename data_type::const_iterator;
53 using reverse_iterator = typename data_type::reverse_iterator;
54 using const_reverse_iterator = typename data_type::const_reverse_iterator;
55
56 public: // ctors
57 vector() = default;
58 vector(const T& element) { data.fill(element); }
59 vector(const vector&) = default;
60 vector(vector&&) = default;
61 explicit vector(const T* ptr)
62 {
63 for (unsigned int i = 0; i < N; ++i) data[i] = ptr[i];
64 }
65 template <typename T2> vector(const vector<T2, N>& other)
66 {
67 for (unsigned int i = 0; i < N; ++i) data[i] = static_cast<T>(other.data[i]);
68 }
69 vector(const std::array<T, N>& _data) : data(_data) {}
70 vector(std::array<T, N>&& _data) : data(std::move(_data)) {}
71
72 vector& operator=(const vector&) & = default;
73 vector& operator=(vector&&) & = default;
74 vector& operator=(const T& element) &
75 {
76 data.fill(element);
77 return *this;
78 }
79
80 public: // static member functions
81 static constexpr std::size_t size() { return N; }
82
83 public: // member functions
84 reference operator[](size_type pos) { return data[pos]; }
85 const_reference operator[](size_type pos) const { return data[pos]; }
86
88 const_reference operator()(size_type i) const { return data[i]; }
89
90 reference front() { return data.front(); }
91 const_reference front() const { return data.front(); }
92 reference back() { return data.back(); }
93 const_reference back() const { return data.back(); }
94 reference x() { return data[0]; }
95 const_reference x() const { return data[0]; }
96 reference y() { return data[1]; }
97 const_reference y() const { return data[1]; }
98 reference z() { return data[2]; }
99 const_reference z() const { return data[2]; }
100 reference w() { return data[3]; }
101 const_reference w() const { return data[3]; }
102
103 friend std::ostream& operator<<(std::ostream& os, const vector& v)
104 {
105 os << "";
106 for (unsigned int i = 0; i < N; ++i) {
107 os << v.data[i];
108 if (i < N - 1) os << " ";
109 }
110 os << "";
111 return os;
112 }
113
114 public: // iterators
115 iterator begin() { return data.begin(); }
116 const_iterator begin() const { return data.begin(); }
117 const_iterator cbegin() const { return data.cbegin(); }
118 iterator end() { return data.end(); }
119 const_iterator end() const { return data.end(); }
120 const_iterator cend() const { return data.cend(); }
121 reverse_iterator rbegin() { return data.rbegin(); }
122 const_reverse_iterator rbegin() const { return data.rbegin(); }
123 const_reverse_iterator crbegin() const { return data.crbegin(); }
124 reverse_iterator rend() { return data.rend(); }
125 const_reverse_iterator rend() const { return data.rend(); }
126 const_reverse_iterator crend() const { return data.crend(); }
127
128 public: // arithmetic member functions
129 vector& operator+=(const vector& other)
130 {
131 for (unsigned int i = 0; i < N; ++i) data[i] += other[i];
132 return *this;
133 }
134 vector& operator+=(const T& element)
135 {
136 for (unsigned int i = 0; i < N; ++i) data[i] += element;
137 return *this;
138 }
139 vector& operator-=(const vector& other)
140 {
141 for (unsigned int i = 0; i < N; ++i) data[i] -= other[i];
142 return *this;
143 }
144 vector& operator-=(const T& element)
145 {
146 for (unsigned int i = 0; i < N; ++i) data[i] -= element;
147 return *this;
148 }
149 vector& operator*=(const vector& other)
150 {
151 for (unsigned int i = 0; i < N; ++i) data[i] *= other[i];
152 return *this;
153 }
154 vector& operator*=(const T& element)
155 {
156 for (unsigned int i = 0; i < N; ++i) data[i] *= element;
157 return *this;
158 }
159 vector& operator/=(const vector& other)
160 {
161 for (unsigned int i = 0; i < N; ++i) data[i] /= other[i];
162 return *this;
163 }
164 vector& operator/=(const T& element)
165 {
166 for (unsigned int i = 0; i < N; ++i) data[i] /= element;
167 return *this;
168 }
169
170 public: // members
172};
173
174template <class T, std::size_t N> bool operator==(const math::vector<T, N>& lhs, const math::vector<T, N>& rhs) { return lhs.data == rhs.data; }
175
176template <class T, std::size_t N> bool operator!=(const math::vector<T, N>& lhs, const math::vector<T, N>& rhs) { return lhs.data != rhs.data; }
177
178template <class T, std::size_t N> bool operator<(const math::vector<T, N>& lhs, const math::vector<T, N>& rhs) { return lhs.data < rhs.data; }
179
180template <class T, std::size_t N> bool operator<=(const math::vector<T, N>& lhs, const math::vector<T, N>& rhs) { return lhs.data <= rhs.data; }
181
182template <class T, std::size_t N> bool operator>(const math::vector<T, N>& lhs, const math::vector<T, N>& rhs) { return lhs.data > rhs.data; }
183
184template <class T, std::size_t N> bool operator>=(const math::vector<T, N>& lhs, const math::vector<T, N>& rhs) { return lhs.data >= rhs.data; }
185
186template <typename T, std::size_t N> math::vector<T, N> operator-(math::vector<T, N> v)
187{
188 for (unsigned int i = 0; i < N; ++i) v.data[i] = -v.data[i];
189 return std::move(v);
190}
191
192template <typename U, typename V, std::size_t N>
194{
196 for (unsigned int i = 0; i < N; ++i) res[i] += rhs[i];
197 return res;
198}
199
200template <typename U, typename V, std::size_t N>
202{
204 for (unsigned int i = 0; i < N; ++i) res[i] += rhs;
205 return std::move(res);
206}
207
208template <typename U, typename V, std::size_t N>
210{
212 for (unsigned int i = 0; i < N; ++i) res[i] += lhs;
213 return std::move(res);
214}
215
216template <typename U, typename V, std::size_t N>
218{
220 for (unsigned int i = 0; i < N; ++i) res[i] -= rhs[i];
221 return res;
222}
223
224template <typename U, typename V, std::size_t N>
226{
228 for (unsigned int i = 0; i < N; ++i) res[i] -= rhs;
229 return std::move(res);
230}
231
232template <typename U, typename V, std::size_t N>
234{
236 for (unsigned int i = 0; i < N; ++i) res[i] -= lhs;
237 return std::move(res);
238}
239
240template <typename U, typename V, std::size_t N>
242{
244 for (unsigned int i = 0; i < N; ++i) res[i] *= rhs[i];
245 return std::move(res);
246}
247
248template <typename U, typename V, std::size_t N>
250{
252 for (unsigned int i = 0; i < N; ++i) res[i] *= rhs;
253 return std::move(res);
254}
255
256template <typename U, typename V, std::size_t N>
258{
260 for (unsigned int i = 0; i < N; ++i) res[i] *= lhs;
261 return std::move(res);
262}
263
264template <typename U, typename V, std::size_t N>
266{
268 for (unsigned int i = 0; i < N; ++i) res[i] /= rhs[i];
269 return std::move(res);
270}
271
272template <typename U, typename V, std::size_t N>
274{
276 for (unsigned int i = 0; i < N; ++i) res[i] /= rhs;
277 return std::move(res);
278}
279
280template <typename U, typename V, std::size_t N>
282{
284 for (unsigned int i = 0; i < N; ++i) res[i] = lhs / res[i];
285 return std::move(res);
286}
287
288template <typename U, typename V, std::size_t N>
289typename std::common_type<U, V>::type dot(const math::vector<U, N>& lhs, const math::vector<V, N>& rhs)
290{
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);
294}
295
296template <typename U, std::size_t N> U norm2(const math::vector<U, N>& v) { return dot(v, v); }
297
298template <typename U, std::size_t N> U norm_inf(const math::vector<U, N>& v)
299{
300 using namespace std;
301 auto m = std::fabs(v[0]);
302 for (unsigned int i = 1; i < N; ++i) m = max(m, std::fabs(v[i]));
303 return m;
304}
305
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,
308 const math::vector<V, N>& rhs)
309{
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()});
312}
313
314template <typename U, typename V, std::size_t N>
315typename std::enable_if<N == 2, typename std::common_type<U, V>::type>::type cross(const math::vector<U, N>& lhs, const math::vector<V, N>& rhs)
316{
317 return lhs.x() * rhs.y() - lhs.y() * rhs.x();
318}
319
320} // namespace math
321
322#endif // INCLUDED_SIMPLE_VECTOR_HPP
@ U
Definition Tools.h:126
Definition vector.hpp:41
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
vector()=default
Definition vector.hpp:38
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