PeriDyno 1.0.0
Loading...
Searching...
No Matches
VectorND.h
Go to the documentation of this file.
1#pragma once
2#include <cstddef>
3#include <stdexcept>
4#include <iterator>
5#include <algorithm>
6#include <cmath>
7#include <cassert>
8#include "Platform.h"
9
10namespace dyno
11{
12 template<class T, unsigned int N>
14 {
15 public:
16 // type definitions
17 typedef T value_type;
18 typedef T* iterator;
19 typedef const T* const_iterator;
20 typedef T& reference;
21 typedef const T& const_reference;
22 typedef unsigned int size_type;
23
24 DYN_FUNC VectorND()
25 {
26 }
27
29 template<int NN = N, typename std::enable_if<NN == 1, int>::type = 0>
30 DYN_FUNC explicit VectorND(value_type r1)
31 {
32 static_assert(N == 1, "");
33 this->data[0] = r1;
34 }
35
37 template<int NN = N, typename std::enable_if<NN == 2, int>::type = 0>
39 {
40 static_assert(N == 2, "");
41 this->data[0] = r1;
42 this->data[1] = r2;
43 }
44
46 template<int NN = N, typename std::enable_if<NN == 3, int>::type = 0>
48 {
49 static_assert(N == 3, "");
50 this->data[0] = r1;
51 this->data[1] = r2;
52 this->data[2] = r3;
53 }
54
56 template<int NN = N, typename std::enable_if<NN == 4, int>::type = 0>
58 {
59 static_assert(N == 4, "");
60 this->data[0] = r1;
61 this->data[1] = r2;
62 this->data[2] = r3;
63 this->data[3] = r4;
64 }
65
67 template<int NN = N, typename std::enable_if<NN == 5, int>::type = 0>
69 {
70 static_assert(N == 5, "");
71 this->data[0] = r1;
72 this->data[1] = r2;
73 this->data[2] = r3;
74 this->data[3] = r4;
75 this->data[4] = r5;
76 }
77
79 template<int NN = N, typename std::enable_if<NN == 6, int>::type = 0>
81 {
82 static_assert(N == 6, "");
83 this->data[0] = r1;
84 this->data[1] = r2;
85 this->data[2] = r3;
86 this->data[3] = r4;
87 this->data[4] = r5;
88 this->data[5] = r6;
89 }
90
92 template<int NN = N, typename std::enable_if<NN == 7, int>::type = 0>
94 {
95 static_assert(N == 7, "");
96 this->data[0] = r1;
97 this->data[1] = r2;
98 this->data[2] = r3;
99 this->data[3] = r4;
100 this->data[4] = r5;
101 this->data[5] = r6;
102 this->data[6] = r7;
103 }
104
106 template<int NN = N, typename std::enable_if<NN == 8, int>::type = 0>
108 {
109 static_assert(N == 8, "");
110 this->data[0] = r1;
111 this->data[1] = r2;
112 this->data[2] = r3;
113 this->data[3] = r4;
114 this->data[4] = r5;
115 this->data[5] = r6;
116 this->data[6] = r7;
117 this->data[7] = r8;
118 }
119
121 template<int NN = N, typename std::enable_if<NN == 9, int>::type = 0>
123 {
124 static_assert(N == 9, "");
125 this->data[0] = r1;
126 this->data[1] = r2;
127 this->data[2] = r3;
128 this->data[3] = r4;
129 this->data[4] = r5;
130 this->data[5] = r6;
131 this->data[6] = r7;
132 this->data[7] = r8;
133 this->data[8] = r9;
134 }
135
137 template<int NN = N, typename std::enable_if<NN == 10, int>::type = 0>
139 {
140 static_assert(N == 10, "");
141 this->data[0] = r1;
142 this->data[1] = r2;
143 this->data[2] = r3;
144 this->data[3] = r4;
145 this->data[4] = r5;
146 this->data[5] = r6;
147 this->data[6] = r7;
148 this->data[7] = r8;
149 this->data[8] = r9;
150 this->data[9] = r10;
151 }
152
153
154 // iterator support
155 DYN_FUNC iterator begin()
156 {
157 return data;
158 }
159 DYN_FUNC const_iterator begin() const
160 {
161 return data;
162 }
163 DYN_FUNC iterator end()
164 {
165 return data + N;
166 }
167 DYN_FUNC const_iterator end() const
168 {
169 return data + N;
170 }
171
172 // operator[]
174 {
175#ifndef NDEBUG
176 assert(i < N && "index in fixed_array must be smaller than size");
177#endif
178 return data[i];
179 }
181 {
182#ifndef NDEBUG
183 assert(i < N && "index in fixed_array must be smaller than size");
184#endif
185 return data[i];
186 }
187
188 // front() and back()
189 DYN_FUNC reference front()
190 {
191 return data[0];
192 }
193 DYN_FUNC const_reference front() const
194 {
195 return data[0];
196 }
197 DYN_FUNC reference back()
198 {
199 return data[N - 1];
200 }
201 DYN_FUNC const_reference back() const
202 {
203 return data[N - 1];
204 }
205
206 // size is constant
207 DYN_FUNC static size_type size()
208 {
209 return N;
210 }
211 DYN_FUNC static bool empty()
212 {
213 return N == 0;
214 }
215 DYN_FUNC static size_type max_size()
216 {
217 return N;
218 }
219
220 // direct access to data
221 DYN_FUNC const T* getDataPtr() const
222 {
223 return data;
224 }
225
226 // assignment with type conversion
227 template <typename T2>
229 {
230 //std::copy(rhs.begin(),rhs.end(), begin());
231 for (size_type i = 0; i < N; i++)
232 data[i] = rhs[i];
233 return *this;
234 }
235
236 // assign one value to all elements
237 DYN_FUNC inline void assign(const T& value)
238 {
239 //std::fill_n(begin(),size(),value);
240 for (size_type i = 0; i < N; i++)
241 data[i] = value;
242 }
243
244 //template<int NN = N, typename std::enable_if<NN>0,int>::type = 0>
245 CPU_FUNC inline friend std::ostream& operator << (std::ostream& out, const VectorND<T, N>& a)
246 {
247 static_assert(N > 0, "Cannot create a zero size arrays");
248 for (size_type i = 0; i < N - 1; i++)
249 out << a.elems[i] << " ";
250 out << a.elems[N - 1];
251 return out;
252 }
253
254 CPU_FUNC inline friend std::istream& operator >> (std::istream& in, VectorND<T, N>& a)
255 {
256 for (size_type i = 0; i < N; i++)
257 in >> a.elems[i];
258 return in;
259 }
260
261 DYN_FUNC inline bool operator < (const VectorND& v) const
262 {
263 for (size_type i = 0; i < N; i++)
264 {
265 if (data[i] < v[i])
266 return true; // (*this)<v
267 else if (data[i] > v[i])
268 return false; // (*this)>v
269 }
270 return false; // (*this)==v
271 }
272
273 public:
275
276 };
277
278 template<class T>
279 DYN_FUNC inline VectorND<T, 2> makeFixedVector(const T& v0, const T& v1)
280 {
282 v[0] = v0;
283 v[1] = v1;
284 return v;
285 }
286
287 template<class T>
288 DYN_FUNC inline VectorND<T, 3> makeFixedVector(const T& v0, const T& v1, const T& v2)
289 {
291 v[0] = v0;
292 v[1] = v1;
293 v[2] = v2;
294 return v;
295 }
296
297 template<class T>
298 DYN_FUNC inline VectorND<T, 4> makeFixedVector(const T& v0, const T& v1, const T& v2, const T& v3)
299 {
301 v[0] = v0;
302 v[1] = v1;
303 v[2] = v2;
304 v[3] = v3;
305 return v;
306 }
307
308 template<class T>
309 DYN_FUNC inline VectorND<T, 5> makeFixedVector(const T& v0, const T& v1, const T& v2, const T& v3, const T& v4)
310 {
312 v[0] = v0;
313 v[1] = v1;
314 v[2] = v2;
315 v[3] = v3;
316 v[4] = v4;
317 return v;
318 }
319
320 template<class T>
321 DYN_FUNC inline VectorND<T, 6> makeFixedVector(const T& v0, const T& v1, const T& v2, const T& v3, const T& v4, const T& v5)
322 {
324 v[0] = v0;
325 v[1] = v1;
326 v[2] = v2;
327 v[3] = v3;
328 v[4] = v4;
329 v[5] = v5;
330 return v;
331 }
332
333 template<class T>
334 DYN_FUNC inline VectorND<T, 7> makeFixedVector(const T& v0, const T& v1, const T& v2, const T& v3, const T& v4, const T& v5, const T& v6)
335 {
337 v[0] = v0;
338 v[1] = v1;
339 v[2] = v2;
340 v[3] = v3;
341 v[4] = v4;
342 v[5] = v5;
343 v[6] = v6;
344 return v;
345 }
346
347 template<class T>
348 DYN_FUNC inline VectorND<T, 8> makeFixedVector(const T& v0, const T& v1, const T& v2, const T& v3, const T& v4, const T& v5, const T& v6, const T& v7)
349 {
351 v[0] = v0;
352 v[1] = v1;
353 v[2] = v2;
354 v[3] = v3;
355 v[4] = v4;
356 v[5] = v5;
357 v[6] = v6;
358 v[7] = v7;
359 return v;
360 }
361
362 template<class T>
363 DYN_FUNC inline VectorND<T, 9> makeFixedVector(const T& v0, const T& v1, const T& v2, const T& v3, const T& v4, const T& v5, const T& v6, const T& v7, const T& v8)
364 {
366 v[0] = v0;
367 v[1] = v1;
368 v[2] = v2;
369 v[3] = v3;
370 v[4] = v4;
371 v[5] = v5;
372 v[6] = v6;
373 v[7] = v7;
374 v[8] = v8;
375 return v;
376 }
377
378 template<class T>
379 DYN_FUNC inline VectorND<T, 10> makeFixedVector(const T& v0, const T& v1, const T& v2, const T& v3, const T& v4, const T& v5, const T& v6, const T& v7, const T& v8, const T& v9)
380 {
382 v[0] = v0;
383 v[1] = v1;
384 v[2] = v2;
385 v[3] = v3;
386 v[4] = v4;
387 v[5] = v5;
388 v[6] = v6;
389 v[7] = v7;
390 v[8] = v8;
391 v[9] = v9;
392 return v;
393 }
394} // namespace helper
assert(queueCount >=1)
DYN_FUNC reference front()
Definition VectorND.h:189
DYN_FUNC const_iterator begin() const
Definition VectorND.h:159
DYN_FUNC VectorND(value_type r1, value_type r2, value_type r3, value_type r4, value_type r5, value_type r6, value_type r7)
Specific constructor for 7-elements vectors.
Definition VectorND.h:93
static DYN_FUNC size_type size()
Definition VectorND.h:207
DYN_FUNC VectorND(value_type r1, value_type r2, value_type r3, value_type r4, value_type r5, value_type r6, value_type r7, value_type r8)
Specific constructor for 8-elements vectors.
Definition VectorND.h:107
unsigned int size_type
Definition VectorND.h:22
DYN_FUNC iterator begin()
Definition VectorND.h:155
static DYN_FUNC size_type max_size()
Definition VectorND.h:215
CPU_FUNC friend std::ostream & operator<<(std::ostream &out, const VectorND< T, N > &a)
Definition VectorND.h:245
const T * const_iterator
Definition VectorND.h:19
DYN_FUNC VectorND(value_type r1)
Specific constructor for 1-element vectors.
Definition VectorND.h:30
DYN_FUNC iterator end()
Definition VectorND.h:163
static DYN_FUNC bool empty()
Definition VectorND.h:211
DYN_FUNC reference operator[](size_type i)
Definition VectorND.h:173
DYN_FUNC void assign(const T &value)
Definition VectorND.h:237
DYN_FUNC const_reference operator[](size_type i) const
Definition VectorND.h:180
DYN_FUNC VectorND(value_type r1, value_type r2, value_type r3, value_type r4, value_type r5, value_type r6)
Specific constructor for 6-elements vectors.
Definition VectorND.h:80
DYN_FUNC VectorND(value_type r1, value_type r2, value_type r3, value_type r4, value_type r5)
Specific constructor for 5-elements vectors.
Definition VectorND.h:68
const T & const_reference
Definition VectorND.h:21
DYN_FUNC VectorND(value_type r1, value_type r2, value_type r3)
Specific constructor for 3-elements vectors.
Definition VectorND.h:47
DYN_FUNC VectorND< T, N > & operator=(const VectorND< T2, N > &rhs)
Definition VectorND.h:228
DYN_FUNC VectorND(value_type r1, value_type r2, value_type r3, value_type r4, value_type r5, value_type r6, value_type r7, value_type r8, value_type r9, value_type r10)
Specific constructor for 10-elements vectors.
Definition VectorND.h:138
DYN_FUNC VectorND()
Definition VectorND.h:24
DYN_FUNC VectorND(value_type r1, value_type r2, value_type r3, value_type r4)
Specific constructor for 4-elements vectors.
Definition VectorND.h:57
DYN_FUNC const_reference back() const
Definition VectorND.h:201
CPU_FUNC friend std::istream & operator>>(std::istream &in, VectorND< T, N > &a)
Definition VectorND.h:254
DYN_FUNC bool operator<(const VectorND &v) const
Definition VectorND.h:261
DYN_FUNC const_iterator end() const
Definition VectorND.h:167
DYN_FUNC const T * getDataPtr() const
Definition VectorND.h:221
DYN_FUNC reference back()
Definition VectorND.h:197
DYN_FUNC VectorND(value_type r1, value_type r2)
Specific constructor for 2-elements vectors.
Definition VectorND.h:38
DYN_FUNC const_reference front() const
Definition VectorND.h:193
DYN_FUNC VectorND(value_type r1, value_type r2, value_type r3, value_type r4, value_type r5, value_type r6, value_type r7, value_type r8, value_type r9)
Specific constructor for 9-elements vectors.
Definition VectorND.h:122
#define T(t)
#define N(x, y, z)
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25
DYN_FUNC VectorND< T, 2 > makeFixedVector(const T &v0, const T &v1)
Definition VectorND.h:279