ECOGEN 4.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>
41class vector
42{
43public: // member types
44
45 using data_type = std::array<T,N>;
46 using value_type = typename data_type::value_type;
47 using size_type = typename data_type::size_type;
48 using difference_type = typename data_type::difference_type;
49 using reference = typename data_type::reference;
50 using const_reference = typename data_type::const_reference;
51 using pointer = typename data_type::pointer;
52 using const_pointer = typename data_type::const_pointer;
53 using iterator = typename data_type::iterator;
54 using const_iterator = typename data_type::const_iterator;
55 using reverse_iterator = typename data_type::reverse_iterator;
56 using const_reverse_iterator = typename data_type::const_reverse_iterator;
57
58public: // ctors
59
60 vector() = default;
61 vector(const T& element) { data.fill(element); }
62 vector(const vector&) = default;
63 vector(vector&&) = default;
64 explicit vector(const T* ptr) { for(unsigned int i=0; i<N; ++i) data[i] = ptr[i]; }
65 template<typename T2>
67 vector(const std::array<T,N>& _data) : data(_data) {}
68 vector(std::array<T,N>&& _data) : data(std::move(_data)) {}
69
70 vector& operator=(const vector&) & = default;
71 vector& operator=(vector&&) & = default;
72 vector& operator=(const T& element) & { data.fill(element); return *this; }
73
74public: // static member functions
75
76 static constexpr std::size_t size() { return N; }
77
78public: // member functions
79
82
85
86 reference front() { return data.front(); }
87 const_reference front() const { return data.front(); }
88 reference back() { return data.back(); }
89 const_reference back() const { return data.back(); }
90 reference x() { return data[0]; }
91 const_reference x() const { return data[0]; }
92 reference y() { return data[1]; }
93 const_reference y() const { return data[1]; }
94 reference z() { return data[2]; }
95 const_reference z() const { return data[2]; }
96 reference w() { return data[3]; }
97 const_reference w() const { return data[3]; }
98
99
100 friend std::ostream& operator<<(std::ostream& os, const vector& v)
101 {
102 os << "";
103 for (unsigned int i=0; i<N; ++i)
104 {
105 os << v.data[i];
106 if (i<N-1) os << " ";
107 }
108 os << "";
109 return os;
110 }
111
112public: // iterators
113
114 iterator begin() { return data.begin(); }
115 const_iterator begin() const { return data.begin(); }
116 const_iterator cbegin() const { return data.cbegin(); }
117 iterator end() { return data.end(); }
118 const_iterator end() const { return data.end(); }
119 const_iterator cend() const { return data.cend(); }
120 reverse_iterator rbegin() { return data.rbegin(); }
121 const_reverse_iterator rbegin() const { return data.rbegin(); }
122 const_reverse_iterator crbegin() const { return data.crbegin(); }
123 reverse_iterator rend() { return data.rend(); }
124 const_reverse_iterator rend() const { return data.rend(); }
125 const_reverse_iterator crend() const { return data.crend(); }
126
127public: // arithmetic member functions
128
129 vector& operator+=(const vector& other) { for (unsigned int i=0; i<N; ++i) data[i]+=other[i]; return *this; }
130 vector& operator+=(const T& element) { for (unsigned int i=0; i<N; ++i) data[i]+=element; return *this; }
131 vector& operator-=(const vector& other) { for (unsigned int i=0; i<N; ++i) data[i]-=other[i]; return *this; }
132 vector& operator-=(const T& element) { for (unsigned int i=0; i<N; ++i) data[i]-=element; return *this; }
133 vector& operator*=(const vector& other) { for (unsigned int i=0; i<N; ++i) data[i]*=other[i]; return *this; }
134 vector& operator*=(const T& element) { for (unsigned int i=0; i<N; ++i) data[i]*=element; return *this; }
135 vector& operator/=(const vector& other) { for (unsigned int i=0; i<N; ++i) data[i]/=other[i]; return *this; }
136 vector& operator/=(const T& element) { for (unsigned int i=0; i<N; ++i) data[i]/=element; return *this; }
137
138public: // members
139
141};
142
143
144template< class T, std::size_t N >
145bool operator==( const math::vector<T,N>& lhs, const math::vector<T,N>& rhs ) { return lhs.data == rhs.data; }
146
147template< class T, std::size_t N >
148bool operator!=( const math::vector<T,N>& lhs, const math::vector<T,N>& rhs ) { return lhs.data != rhs.data; }
149
150template< class T, std::size_t N >
151bool operator<( const math::vector<T,N>& lhs, const math::vector<T,N>& rhs ) { return lhs.data < rhs.data; }
152
153template< class T, std::size_t N >
154bool operator<=( const math::vector<T,N>& lhs, const math::vector<T,N>& rhs ) { return lhs.data <= rhs.data; }
155
156template< class T, std::size_t N >
157bool operator>( const math::vector<T,N>& lhs, const math::vector<T,N>& rhs ) { return lhs.data > rhs.data; }
158
159template< class T, std::size_t N >
160bool operator>=( const math::vector<T,N>& lhs, const math::vector<T,N>& rhs ) { return lhs.data >= rhs.data; }
161
162
163template<typename T, std::size_t N>
165{
166 for (unsigned int i=0; i<N; ++i) v.data[i] = -v.data[i];
167 return std::move(v);
168}
169
170template<typename U, typename V, std::size_t N>
177
178template<typename U, typename V, std::size_t N>
180{
182 for(unsigned int i=0; i<N; ++i) res[i] += rhs;
183 return std::move(res);
184}
185
186template<typename U, typename V, std::size_t N>
188{
190 for(unsigned int i=0; i<N; ++i) res[i] += lhs;
191 return std::move(res);
192}
193
194template<typename U, typename V, std::size_t N>
201
202template<typename U, typename V, std::size_t N>
204{
206 for(unsigned int i=0; i<N; ++i) res[i] -= rhs;
207 return std::move(res);
208}
209
210template<typename U, typename V, std::size_t N>
212{
214 for(unsigned int i=0; i<N; ++i) res[i] -= lhs;
215 return std::move(res);
216}
217
218template<typename U, typename V, std::size_t N>
225
226template<typename U, typename V, std::size_t N>
228{
230 for(unsigned int i=0; i<N; ++i) res[i] *= rhs;
231 return std::move(res);
232}
233
234template<typename U, typename V, std::size_t N>
236{
238 for(unsigned int i=0; i<N; ++i) res[i] *= lhs;
239 return std::move(res);
240}
241
242template<typename U, typename V, std::size_t N>
249
250template<typename U, typename V, std::size_t N>
252{
254 for(unsigned int i=0; i<N; ++i) res[i] /= rhs;
255 return std::move(res);
256}
257
258template<typename U, typename V, std::size_t N>
260{
262 for(unsigned int i=0; i<N; ++i) res[i] = lhs/res[i];
263 return std::move(res);
264}
265
266
267template<typename U, typename V, std::size_t N>
268typename std::common_type<U,V>::type dot(const math::vector<U,N>& lhs, const math::vector<V,N>& rhs)
269{
270 typename std::common_type<U,V>::type res(lhs[0]*rhs[0]);
271 for (unsigned int i=1; i<N; ++i)
272 res+=lhs[i]*rhs[i];
273 return std::move(res);
274}
275
276template<typename U, std::size_t N>
277U norm2(const math::vector<U,N>& v) { return dot(v,v); }
278
279template<typename U, std::size_t N>
281{
282 using namespace std;
283 auto m = std::fabs(v[0]);
284 for (unsigned int i=1; i<N; ++i) m = max(m,std::fabs(v[i]));
285 return m;
286}
287
288
289template<typename U, typename V, std::size_t N>
290typename std::enable_if<N==3,math::vector<typename std::common_type<U,V>::type,N>>::type cross(const math::vector<U,N>& lhs, const math::vector<V,N>& rhs)
291{
292 return math::vector<typename std::common_type<U,V>::type,N>({lhs.y()*rhs.z()-lhs.z()*rhs.y(), lhs.z()*rhs.x()-lhs.x()*rhs.z(), lhs.x()*rhs.y()-lhs.y()*rhs.x()});
293}
294
295template<typename U, typename V, std::size_t N>
296typename 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)
297{
298 return lhs.x()*rhs.y()-lhs.y()*rhs.x();
299}
300
301
302} // namespace math
303
304
305#endif // INCLUDED_SIMPLE_VECTOR_HPP
Definition vector.hpp:42
const_iterator begin() const
Definition vector.hpp:115
reverse_iterator rbegin()
Definition vector.hpp:120
const_reference front() const
Definition vector.hpp:87
vector & operator*=(const vector &other)
Definition vector.hpp:133
typename data_type::reference reference
Definition vector.hpp:49
typename data_type::iterator iterator
Definition vector.hpp:53
const_reverse_iterator rbegin() const
Definition vector.hpp:121
reference operator[](size_type pos)
Definition vector.hpp:80
const_reference operator[](size_type pos) const
Definition vector.hpp:81
const_reference y() const
Definition vector.hpp:93
vector & operator+=(const T &element)
Definition vector.hpp:130
const_iterator cend() const
Definition vector.hpp:119
vector & operator=(vector &&) &=default
reference w()
Definition vector.hpp:96
typename data_type::value_type value_type
Definition vector.hpp:46
typename data_type::pointer pointer
Definition vector.hpp:51
typename data_type::size_type size_type
Definition vector.hpp:47
typename data_type::const_iterator const_iterator
Definition vector.hpp:54
reference x()
Definition vector.hpp:90
const_reference w() const
Definition vector.hpp:97
const_reference z() const
Definition vector.hpp:95
vector & operator-=(const T &element)
Definition vector.hpp:132
typename data_type::reverse_iterator reverse_iterator
Definition vector.hpp:55
vector & operator+=(const vector &other)
Definition vector.hpp:129
vector(const vector &)=default
data_type data
Definition vector.hpp:140
static constexpr std::size_t size()
Definition vector.hpp:76
iterator end()
Definition vector.hpp:117
reverse_iterator rend()
Definition vector.hpp:123
const_reverse_iterator rend() const
Definition vector.hpp:124
typename data_type::const_reverse_iterator const_reverse_iterator
Definition vector.hpp:56
vector(std::array< T, N > &&_data)
Definition vector.hpp:68
vector & operator-=(const vector &other)
Definition vector.hpp:131
const_reverse_iterator crend() const
Definition vector.hpp:125
iterator begin()
Definition vector.hpp:114
vector(const T &element)
Definition vector.hpp:61
vector & operator/=(const T &element)
Definition vector.hpp:136
vector(const vector< T2, N > &other)
Definition vector.hpp:66
const_reference operator()(size_type i) const
Definition vector.hpp:84
reference z()
Definition vector.hpp:94
const_reference x() const
Definition vector.hpp:91
reference operator()(size_type i)
Definition vector.hpp:83
const_reverse_iterator crbegin() const
Definition vector.hpp:122
const_reference back() const
Definition vector.hpp:89
vector(const T *ptr)
Definition vector.hpp:64
vector(const std::array< T, N > &_data)
Definition vector.hpp:67
typename data_type::const_pointer const_pointer
Definition vector.hpp:52
vector & operator*=(const T &element)
Definition vector.hpp:134
std::array< T, N > data_type
Definition vector.hpp:45
reference back()
Definition vector.hpp:88
reference y()
Definition vector.hpp:92
vector & operator/=(const vector &other)
Definition vector.hpp:135
vector & operator=(const T &element) &
Definition vector.hpp:72
reference front()
Definition vector.hpp:86
const_iterator end() const
Definition vector.hpp:118
typename data_type::const_reference const_reference
Definition vector.hpp:50
vector & operator=(const vector &) &=default
const_iterator cbegin() const
Definition vector.hpp:116
vector(vector &&)=default
friend std::ostream & operator<<(std::ostream &os, const vector &v)
Definition vector.hpp:100
typename data_type::difference_type difference_type
Definition vector.hpp:48
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:219
math::vector< T, N > operator-(math::vector< T, N > v)
Definition vector.hpp:164
U norm_inf(const math::vector< U, N > &v)
Definition vector.hpp:280
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:243
bool operator>(const math::vector< T, N > &lhs, const math::vector< T, N > &rhs)
Definition vector.hpp:157
std::common_type< U, V >::type dot(const math::vector< U, N > &lhs, const math::vector< V, N > &rhs)
Definition vector.hpp:268
bool operator<=(const math::vector< T, N > &lhs, const math::vector< T, N > &rhs)
Definition vector.hpp:154
bool operator<(const math::vector< T, N > &lhs, const math::vector< T, N > &rhs)
Definition vector.hpp:151
bool operator>=(const math::vector< T, N > &lhs, const math::vector< T, N > &rhs)
Definition vector.hpp:160
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:290
bool operator!=(const math::vector< T, N > &lhs, const math::vector< T, N > &rhs)
Definition vector.hpp:148
U norm2(const math::vector< U, N > &v)
Definition vector.hpp:277
bool operator==(const math::vector< T, N > &lhs, const math::vector< T, N > &rhs)
Definition vector.hpp:145
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:171