18 #include "Kokkos_Core.hpp"
19 #include "Kokkos_Complex.hpp"
29 template <
typename VectorType>
54 for (
int i=0; i<
sz; i++) {
55 x.fastAccessCoeff(i) = 0.1*i;
56 y.fastAccessCoeff(i) = 0.25*i;
65 #define UNARY_UNIT_TEST(VEC, SCALAR_T, OP, OPNAME, USING_OP) \
66 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, OPNAME) { \
68 UTS::vec_type u = OP(setup.x); \
69 UTS::vec_type v(setup.sz, 0.0); \
70 for (int i=0; i<setup.sz; i++) \
73 v.fastAccessCoeff(i) = OP(setup.x.fastAccessCoeff(i)); \
75 success = compareVecs(u, "u",v, "v", \
76 setup.rtol, setup.atol, out); \
78 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, OPNAME##_const) { \
80 UTS::vec_type u = OP(setup.cx); \
81 UTS::vec_type v(1, 0.0); \
82 for (int i=0; i<v.size(); i++) \
85 v.fastAccessCoeff(i) = OP(setup.cx.fastAccessCoeff(0)); \
87 success = compareVecs(u, "u",v, "v", \
88 setup.rtol, setup.atol, out); \
90 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, OPNAME##_resize) { \
94 UTS::vec_type v(setup.sz, 0.0); \
95 for (int i=0; i<setup.sz; i++) \
98 v.fastAccessCoeff(i) = OP(setup.x.fastAccessCoeff(i)); \
100 success = compareVecs(u, "u",v, "v", \
101 setup.rtol, setup.atol, out); \
104 #define BINARY_UNIT_TEST(VEC, SCALAR_T, OP, OPNAME) \
105 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, OPNAME) { \
107 UTS::vec_type u = setup.x OP setup.y; \
108 UTS::vec_type v(setup.sz, 0.0); \
109 for (int i=0; i<setup.sz; i++) \
110 v.fastAccessCoeff(i) = setup.x.fastAccessCoeff(i) OP \
111 setup.y.fastAccessCoeff(i); \
112 success = compareVecs(u, "u",v, "v", \
113 setup.rtol, setup.atol, out); \
115 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, OPNAME##_left_const) { \
117 UTS::vec_type u = setup.a OP setup.y; \
118 UTS::vec_type v(setup.sz, 0.0); \
119 for (int i=0; i<setup.sz; i++) \
120 v.fastAccessCoeff(i) = setup.a OP setup.y.fastAccessCoeff(i); \
121 success = compareVecs(u, "u",v, "v", \
122 setup.rtol, setup.atol, out); \
124 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, OPNAME##_right_const) { \
126 UTS::vec_type u = setup.x OP setup.a ; \
127 UTS::vec_type v(setup.sz, 0.0); \
128 for (int i=0; i<setup.sz; i++) \
129 v.fastAccessCoeff(i) = setup.x.fastAccessCoeff(i) OP \
131 success = compareVecs(u, "u",v, "v", \
132 setup.rtol, setup.atol, out); \
134 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, OPNAME##_both_const) { \
136 UTS::vec_type u = setup.cx OP setup.cx; \
137 UTS::vec_type v(1, 0.0); \
138 for (int i=0; i<v.size(); i++) \
139 v.fastAccessCoeff(i) = setup.cx.fastAccessCoeff(0) OP \
140 setup.cx.fastAccessCoeff(0); \
141 success = compareVecs(u, "u",v, "v", \
142 setup.rtol, setup.atol, out); \
144 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, OPNAME##_left_const2) { \
146 UTS::vec_type u = setup.cx OP setup.x; \
147 UTS::vec_type v(setup.sz, 0.0); \
148 for (int i=0; i<setup.sz; i++) \
149 v.fastAccessCoeff(i) = setup.cx.fastAccessCoeff(0) OP \
150 setup.x.fastAccessCoeff(i); \
151 success = compareVecs(u, "u",v, "v", \
152 setup.rtol, setup.atol, out); \
154 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, OPNAME##_right_const2) { \
156 UTS::vec_type u = setup.x OP setup.cx; \
157 UTS::vec_type v(setup.sz, 0.0); \
158 for (int i=0; i<setup.sz; i++) \
159 v.fastAccessCoeff(i) = setup.x.fastAccessCoeff(i) OP \
160 setup.cx.fastAccessCoeff(0); \
161 success = compareVecs(u, "u",v, "v", \
162 setup.rtol, setup.atol, out); \
164 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, OPNAME##_resize) { \
167 u = setup.x OP setup.y; \
168 UTS::vec_type v(setup.sz, 0.0); \
169 for (int i=0; i<setup.sz; i++) \
170 v.fastAccessCoeff(i) = setup.x.fastAccessCoeff(i) OP \
171 setup.y.fastAccessCoeff(i); \
172 success = compareVecs(u, "u",v, "v", \
173 setup.rtol, setup.atol, out); \
175 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, OPNAME##_left_const_resize) { \
178 u = setup.a OP setup.y; \
179 UTS::vec_type v(setup.sz, 0.0); \
180 for (int i=0; i<setup.sz; i++) \
181 v.fastAccessCoeff(i) = setup.a OP \
182 setup.y.fastAccessCoeff(i); \
183 success = compareVecs(u, "u",v, "v", \
184 setup.rtol, setup.atol, out); \
186 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, OPNAME##_right_const_resize) { \
189 u = setup.x OP setup.a; \
190 UTS::vec_type v(setup.sz, 0.0); \
191 for (int i=0; i<setup.sz; i++) \
192 v.fastAccessCoeff(i) = setup.x.fastAccessCoeff(i) OP \
194 success = compareVecs(u, "u",v, "v", \
195 setup.rtol, setup.atol, out); \
198 #define BINARYFUNC_UNIT_TEST(VEC, SCALAR_T, OP, SOP, USING_SOP, OPNAME) \
199 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, OPNAME) { \
201 UTS::vec_type u = OP(setup.x,setup.y); \
202 UTS::vec_type v(setup.sz, 0.0); \
203 for (int i=0; i<setup.sz; i++) \
206 v.fastAccessCoeff(i) = SOP(setup.x.fastAccessCoeff(i), \
207 setup.y.fastAccessCoeff(i)); \
209 success = compareVecs(u, "u",v, "v", \
210 setup.rtol, setup.atol, out); \
212 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, OPNAME##_left_const) { \
214 UTS::vec_type u = OP(setup.a,setup.y); \
215 UTS::vec_type v(setup.sz, 0.0); \
216 for (int i=0; i<setup.sz; i++) \
219 v.fastAccessCoeff(i) = SOP(setup.a, \
220 setup.y.fastAccessCoeff(i)); \
222 success = compareVecs(u, "u",v, "v", \
223 setup.rtol, setup.atol, out); \
225 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, OPNAME##_right_const) { \
227 UTS::vec_type u = OP(setup.x,setup.a); \
228 UTS::vec_type v(setup.sz, 0.0); \
229 for (int i=0; i<setup.sz; i++) \
232 v.fastAccessCoeff(i) = SOP(setup.x.fastAccessCoeff(i), \
235 success = compareVecs(u, "u",v, "v", \
236 setup.rtol, setup.atol, out); \
238 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, OPNAME##_both_const) { \
240 UTS::vec_type u = OP(setup.cx,setup.cx); \
241 UTS::vec_type v(1, 0.0); \
242 for (int i=0; i<v.size(); i++) \
245 v.fastAccessCoeff(i) = SOP(setup.cx.fastAccessCoeff(0), \
246 setup.cx.fastAccessCoeff(0)); \
248 success = compareVecs(u, "u",v, "v", \
249 setup.rtol, setup.atol, out); \
251 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, OPNAME##_left_const2) { \
253 UTS::vec_type u = OP(setup.cx,setup.x); \
254 UTS::vec_type v(setup.sz, 0.0); \
255 for (int i=0; i<setup.sz; i++) \
258 v.fastAccessCoeff(i) = SOP(setup.cx.fastAccessCoeff(0), \
259 setup.x.fastAccessCoeff(i)); \
261 success = compareVecs(u, "u",v, "v", \
262 setup.rtol, setup.atol, out); \
264 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, OPNAME##_right_const2) { \
266 UTS::vec_type u = OP(setup.x,setup.cx); \
267 UTS::vec_type v(setup.sz, 0.0); \
268 for (int i=0; i<setup.sz; i++) \
271 v.fastAccessCoeff(i) = SOP(setup.x.fastAccessCoeff(i), \
272 setup.cx.fastAccessCoeff(0)); \
274 success = compareVecs(u, "u",v, "v", \
275 setup.rtol, setup.atol, out); \
277 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, OPNAME##_resize) { \
280 u = OP(setup.x,setup.y); \
281 UTS::vec_type v(setup.sz, 0.0); \
282 for (int i=0; i<setup.sz; i++) \
285 v.fastAccessCoeff(i) = SOP(setup.x.fastAccessCoeff(i), \
286 setup.y.fastAccessCoeff(i)); \
288 success = compareVecs(u, "u",v, "v", \
289 setup.rtol, setup.atol, out); \
291 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, OPNAME##_left_const_resize) { \
294 u = OP(setup.a,setup.y); \
295 UTS::vec_type v(setup.sz, 0.0); \
296 for (int i=0; i<setup.sz; i++) \
299 v.fastAccessCoeff(i) = SOP(setup.a, \
300 setup.y.fastAccessCoeff(i)); \
302 success = compareVecs(u, "u",v, "v", \
303 setup.rtol, setup.atol, out); \
305 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, OPNAME##_right_const_resize) { \
308 u = OP(setup.x,setup.a); \
309 UTS::vec_type v(setup.sz, 0.0); \
310 for (int i=0; i<setup.sz; i++) \
313 v.fastAccessCoeff(i) = SOP(setup.x.fastAccessCoeff(i), \
316 success = compareVecs(u, "u",v, "v", \
317 setup.rtol, setup.atol, out); \
320 #define OPASSIGN_UNIT_TEST(VEC, SCALAR_T, OP, OPNAME) \
321 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, OPNAME) { \
323 UTS::vec_type u = std::sin(setup.x); \
324 UTS::vec_type v = std::sin(setup.x); \
326 for (int i=0; i<setup.sz; i++) \
327 v.fastAccessCoeff(i) OP setup.x.fastAccessCoeff(i); \
328 success = compareVecs(u, "u",v, "v", \
329 setup.rtol, setup.atol, out); \
331 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, OPNAME##_const) { \
333 UTS::vec_type u = std::sin(setup.x); \
334 UTS::vec_type v = std::sin(setup.x); \
336 for (int i=0; i<setup.sz; i++) \
337 v.fastAccessCoeff(i) OP setup.a; \
338 success = compareVecs(u, "u",v, "v", \
339 setup.rtol, setup.atol, out); \
341 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, OPNAME##_const2) { \
343 UTS::vec_type u = std::sin(setup.x); \
344 UTS::vec_type v = std::sin(setup.x); \
346 for (int i=0; i<setup.sz; i++) \
347 v.fastAccessCoeff(i) OP setup.cx.fastAccessCoeff(0); \
348 success = compareVecs(u, "u",v, "v", \
349 setup.rtol, setup.atol, out); \
351 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, OPNAME##_resize) { \
353 UTS::vec_type u = setup.a; \
354 UTS::vec_type v(setup.sz, 0.0); \
356 for (int i=0; i<setup.sz; i++) { \
357 v.fastAccessCoeff(i) = setup.a; \
358 v.fastAccessCoeff(i) OP setup.x.fastAccessCoeff(i); \
360 success = compareVecs(u, "u",v, "v", \
361 setup.rtol, setup.atol, out); \
364 #define SAXPY_UNIT_TEST(VEC, SCALAR_T) \
365 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, saxpy) { \
367 UTS::vec_type u = std::sin(setup.x); \
368 UTS::vec_type v = std::sin(setup.x); \
369 u += setup.x*setup.y; \
370 for (int i=0; i<setup.sz; i++) \
371 v.fastAccessCoeff(i) += \
372 setup.x.fastAccessCoeff(i)*setup.y.fastAccessCoeff(i); \
373 success = compareVecs(u, "u",v, "v", \
374 setup.rtol, setup.atol, out); \
376 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, saxpy_resize) { \
378 UTS::vec_type u = setup.cx; \
379 UTS::vec_type v(setup.sz, 0.0); \
380 u += setup.x*setup.y; \
381 for (int i=0; i<setup.sz; i++) \
382 v.fastAccessCoeff(i) = setup.cx.fastAccessCoeff(0) + \
383 setup.x.fastAccessCoeff(i)*setup.y.fastAccessCoeff(i); \
384 success = compareVecs(u, "u",v, "v", \
385 setup.rtol, setup.atol, out); \
387 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, saxpy_const) { \
389 UTS::vec_type u = std::sin(setup.x); \
390 UTS::vec_type v = std::sin(setup.x); \
391 u += setup.a*setup.y; \
392 for (int i=0; i<setup.sz; i++) \
393 v.fastAccessCoeff(i) += \
394 setup.a*setup.y.fastAccessCoeff(i); \
395 success = compareVecs(u, "u",v, "v", \
396 setup.rtol, setup.atol, out); \
398 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, saxpy_const2) { \
400 UTS::vec_type u = std::sin(setup.x); \
401 UTS::vec_type v = std::sin(setup.x); \
402 u += setup.cx*setup.y; \
403 for (int i=0; i<setup.sz; i++) \
404 v.fastAccessCoeff(i) += \
405 setup.cx.fastAccessCoeff(0)*setup.y.fastAccessCoeff(i); \
406 success = compareVecs(u, "u",v, "v", \
407 setup.rtol, setup.atol, out); \
410 #define TERNARY_UNIT_TEST(VEC, SCALAR_T) \
411 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, ternay) { \
413 UTS::vec_type u = std::sin(setup.x); \
414 UTS::vec_type v = -std::sin(setup.x); \
415 u = u >= 0 ? -u : u; \
416 success = compareVecs(u, "u", v, "v", \
417 setup.rtol, setup.atol, out); \
424 #define VECTOR_UNIT_TESTS_ANY_TYPE(VEC,SCALAR_T) \
425 UNARY_UNIT_TEST(VEC, SCALAR_T, + , UnaryPlus ,) \
426 UNARY_UNIT_TEST(VEC, SCALAR_T, - , UnaryMinus,) \
427 UNARY_UNIT_TEST(VEC, SCALAR_T, exp , Exp , using std::exp; ) \
428 UNARY_UNIT_TEST(VEC, SCALAR_T, log , Log , using std::log; ) \
429 UNARY_UNIT_TEST(VEC, SCALAR_T, log10, Log10 , using std::log10;) \
430 UNARY_UNIT_TEST(VEC, SCALAR_T, sqrt , Sqrt , using std::sqrt; ) \
431 UNARY_UNIT_TEST(VEC, SCALAR_T, sin , Sin , using std::sin; ) \
432 UNARY_UNIT_TEST(VEC, SCALAR_T, cos , Cos , using std::cos; ) \
433 UNARY_UNIT_TEST(VEC, SCALAR_T, tan , Tan , using std::tan; ) \
434 UNARY_UNIT_TEST(VEC, SCALAR_T, sinh , Sinh , using std::sinh; ) \
435 UNARY_UNIT_TEST(VEC, SCALAR_T, cosh , Cosh , using std::cosh; ) \
436 UNARY_UNIT_TEST(VEC, SCALAR_T, tanh , Tanh , using std::tanh; ) \
437 UNARY_UNIT_TEST(VEC, SCALAR_T, asin , ASin , using std::asin; ) \
438 UNARY_UNIT_TEST(VEC, SCALAR_T, acos , ACos , using std::acos; ) \
439 UNARY_UNIT_TEST(VEC, SCALAR_T, atan , ATan , using std::atan; ) \
440 UNARY_UNIT_TEST(VEC, SCALAR_T, asinh, ASinh , using std::asinh;) \
441 UNARY_UNIT_TEST(VEC, SCALAR_T, acosh, ACosh , using std::acosh;) \
442 UNARY_UNIT_TEST(VEC, SCALAR_T, atanh, ATanh , using std::atanh;) \
444 BINARY_UNIT_TEST(VEC, SCALAR_T, +, Plus) \
445 BINARY_UNIT_TEST(VEC, SCALAR_T, -, Minus) \
446 BINARY_UNIT_TEST(VEC, SCALAR_T, *, Times) \
447 BINARY_UNIT_TEST(VEC, SCALAR_T, /, Divide) \
449 BINARYFUNC_UNIT_TEST(VEC, SCALAR_T, pow, pow, using std::pow;, Pow) \
451 OPASSIGN_UNIT_TEST(VEC, SCALAR_T, +=, PlusEqual) \
452 OPASSIGN_UNIT_TEST(VEC, SCALAR_T, -=, MinusEqual) \
453 OPASSIGN_UNIT_TEST(VEC, SCALAR_T, *=, TimesEqual) \
454 OPASSIGN_UNIT_TEST(VEC, SCALAR_T, /=, DivideEqual) \
456 SAXPY_UNIT_TEST(VEC, SCALAR_T) \
458 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, initializer_list_constructor ) { \
460 UTS::vec_type u{ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 }; \
461 UTS::vec_type v(setup.sz, 0.0); \
462 for (int i=0; i<setup.sz; i++) \
463 v.fastAccessCoeff(i) = i+1; \
464 success = compareVecs(u, "u", v, "v", \
465 setup.rtol, setup.atol, out); \
467 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, initializer_list_copy ) { \
469 UTS::vec_type u = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 }; \
470 UTS::vec_type v(setup.sz, 0.0); \
471 for (int i=0; i<setup.sz; i++) \
472 v.fastAccessCoeff(i) = i+1; \
473 success = compareVecs(u, "u", v, "v", \
474 setup.rtol, setup.atol, out); \
476 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, initializer_list_assign ) { \
479 u = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 }; \
480 UTS::vec_type v(setup.sz, 0.0); \
481 for (int i=0; i<setup.sz; i++) \
482 v.fastAccessCoeff(i) = i+1; \
483 success = compareVecs(u, "u", v, "v", \
484 setup.rtol, setup.atol, out); \
486 TEUCHOS_UNIT_TEST( VEC##_##SCALAR_T, range_based_for ) { \
488 UTS::vec_type u(setup.sz, 0.0); \
489 for (auto& z : u) { z = 3.0; } \
490 UTS::vec_type v(setup.sz, 3.0); \
491 success = compareVecs(u, "u", v, "v", \
492 setup.rtol, setup.atol, out); \
498 #define VECTOR_UNIT_TESTS_SFS_ANY_VALUE_TYPE(SCALAR_T) \
499 TEUCHOS_UNIT_TEST( StaticFixedVector##_##SCALAR_T, initializer_list_constructor_partial ) {\
501 UTS::vec_type u{ 1.0}; \
502 UTS::vec_type v(setup.sz, 1.0); \
503 success = compareVecs(u, "u", v, "v", \
504 setup.rtol, setup.atol, out); \
506 TEUCHOS_UNIT_TEST( StaticFixedVector##_##SCALAR_T, initializer_list_constructor_empty ) { \
508 UTS::vec_type u{ std::initializer_list<typename UTS::value_type>()}; \
509 UTS::vec_type v(setup.sz, 0.0); \
510 success = compareVecs(u, "u", v, "v", \
511 setup.rtol, setup.atol, out); \
517 #define VECTOR_UNIT_TESTS_COMPLEX_TYPE(VEC,SCALAR_T) \
519 VECTOR_UNIT_TESTS_ANY_TYPE(VEC,SCALAR_T)
526 #define VECTOR_UNIT_TESTS_REAL_TYPE(VEC,SCALAR_T) \
528 VECTOR_UNIT_TESTS_ANY_TYPE(VEC,SCALAR_T) \
530 UNARY_UNIT_TEST(VEC, SCALAR_T, cbrt , Cbrt, using std::cbrt;) \
532 BINARYFUNC_UNIT_TEST(VEC, SCALAR_T, atan2, atan2, using std::atan2;, ATan2) \
534 BINARYFUNC_UNIT_TEST(VEC, SCALAR_T, max , max , using std::max ;, Max) \
535 BINARYFUNC_UNIT_TEST(VEC, SCALAR_T, min , min , using std::min ;, Min) \
537 BINARYFUNC_UNIT_TEST(VEC, SCALAR_T, fmax , fmax , using std::fmax ;, FMax) \
538 BINARYFUNC_UNIT_TEST(VEC, SCALAR_T, fmin , fmin , using std::fmin ;, FMin) \
540 TERNARY_UNIT_TEST(VEC, SCALAR_T)
545 #define TEST_DYNAMIC_STORAGE(__storage_type__,__vec_type__,__scalar_type__,__macro_for_tests__)\
546 typedef Kokkos::DefaultExecutionSpace execution_space; \
547 typedef Stokhos::__storage_type__<int,__scalar_type__,execution_space> storage_type; \
548 typedef Sacado::MP::Vector<storage_type> vec_type; \
549 typedef UnitTestSetup<vec_type> UTS; \
550 __macro_for_tests__(__vec_type__,__scalar_type__)
552 namespace DynamicVecTest
557 namespace DynamicStridedVecTest
565 #define TEST_STATIC_STORAGE(__storage_type__,__vec_type__,__scalar_type__,__scalar_type_name__,__storage_size__,__macro_for_tests__) \
566 typedef ::Kokkos::DefaultExecutionSpace execution_space; \
567 typedef ::Stokhos::__storage_type__<int,__scalar_type__,__storage_size__,execution_space> storage_type; \
568 typedef ::Sacado::MP::Vector<storage_type> vec_type; \
569 typedef UnitTestSetup<vec_type> UTS; \
570 __macro_for_tests__(__vec_type__,__scalar_type_name__)
572 namespace StaticVecTest
580 #define TEST_STATIC_FIXED_STORAGE(__storage_type__,__vec_type__,__scalar_type__,__scalar_type_name__,__storage_size__,__macro_for_tests__) \
581 TEST_STATIC_STORAGE(__storage_type__,__vec_type__,__scalar_type__,__scalar_type_name__,__storage_size__,__macro_for_tests__) \
582 VECTOR_UNIT_TESTS_SFS_ANY_VALUE_TYPE(__scalar_type_name__)
585 namespace StaticFixedVecTest
592 #if !defined(KOKKOS_ENABLE_CUDA) && !defined(KOKKOS_ENABLE_HIP)
#define VECTOR_UNIT_TESTS_REAL_TYPE(VEC, SCALAR_T)
#define TEST_DYNAMIC_STORAGE(__storage_type__, __vec_type__, __scalar_type__, __macro_for_tests__)
#define TEST_STATIC_STORAGE(__storage_type__, __vec_type__, __scalar_type__, __scalar_type_name__, __storage_size__, __macro_for_tests__)
#define TEST_STATIC_FIXED_STORAGE(__storage_type__, __vec_type__, __scalar_type__, __scalar_type_name__, __storage_size__, __macro_for_tests__)
#define VECTOR_UNIT_TESTS_COMPLEX_TYPE(VEC, SCALAR_T)
vec_type::value_type value_type