ROOT  6.07/01
Reference Guide
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
unittest.h
Go to the documentation of this file.
1 /* This file is part of the Vc library.
2 
3  Copyright (C) 2009-2012 Matthias Kretz <kretz@kde.org>
4 
5  Vc is free software: you can redistribute it and/or modify
6  it under the terms of the GNU Lesser General Public License as
7  published by the Free Software Foundation, either version 3 of
8  the License, or (at your option) any later version.
9 
10  Vc is distributed in the hope that it will be useful, but
11  WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU Lesser General Public License for more details.
14 
15  You should have received a copy of the GNU Lesser General Public
16  License along with Vc. If not, see <http://www.gnu.org/licenses/>.
17 
18 */
19 
20 #ifndef UNITTEST_H
21 #define UNITTEST_H
22 
23 #ifdef VC_ASSERT
24 #error "include unittest.h before any Vc header"
25 #endif
26 inline void unittest_assert(bool cond, const char *code, const char *file, int line);
27 #define VC_ASSERT(cond) unittest_assert(cond, #cond, __FILE__, __LINE__);
28 
29 #include <Vc/Vc>
30 #include <iostream>
31 #include <iomanip>
32 #include <fstream>
33 #include <cstdlib>
34 #include <cstring>
35 #include <cmath>
36 #include <Vc/support.h>
37 #include "ulp.h"
38 #include <typeinfo>
39 #include <Vc/common/macros.h>
40 
41 #define _expand(name) #name
42 #define runTest(name) _unit_test_global.runTestInt(&name, _expand(name))
43 #define testAllTypes(name) \
44  _unit_test_global.runTestInt(&name<float_v>, #name "<float_v>"); \
45  _unit_test_global.runTestInt(&name<short_v>, #name "<short_v>"); \
46  _unit_test_global.runTestInt(&name<sfloat_v>, #name "<sfloat_v>"); \
47  _unit_test_global.runTestInt(&name<ushort_v>, #name "<ushort_v>"); \
48  _unit_test_global.runTestInt(&name<int_v>, #name "<int_v>"); \
49  _unit_test_global.runTestInt(&name<double_v>, #name "<double_v>"); \
50  _unit_test_global.runTestInt(&name<uint_v>, #name "<uint_v>")
51 #define testRealTypes(name) \
52  _unit_test_global.runTestInt(&name<float_v>, #name "<float_v>"); \
53  _unit_test_global.runTestInt(&name<double_v>, #name "<double_v>"); \
54  _unit_test_global.runTestInt(&name<sfloat_v>, #name "<sfloat_v>");
55 
56 template<typename A, typename B> struct isEqualType
57 {
58  operator bool() const { return false; }
59 };
60 
61 template<typename T> struct isEqualType<T, T>
62 {
63  operator bool() const { return true; }
64 };
65 
66 inline void printPass()
67 {
68  std::cout << AnsiColor::green << " PASS: " << AnsiColor::normal;
69 }
70 
72 {
74  if (!s) {
75  std::cerr << "CPU or OS requirements not met for the compiled in vector unit!\n";
76  exit(-1);
77  }
78  return s;
79 }
80 
82 
84 {
85 };
86 
87 typedef void (*testFunction)();
89 {
90  public:
92  : status(true),
94  assert_failure(0),
96  float_fuzzyness( 1.f ),
97  double_fuzzyness( 1. ),
98  only_name(0),
100  failedTests(0), passedTests(0),
102  maximumDistance(0),
103  meanDistance(0),
104  meanCount(0)
105  {
106  }
107 
109  {
110  if (m_finalized) {
111  // on windows std::exit will call the dtor again, leading to infinite recursion
112  return;
113  }
114  if (plotFile.is_open()) {
115  plotFile.flush();
116  plotFile.close();
117  }
118  std::cout << "\n Testing done. " << passedTests << " tests passed. " << failedTests << " tests failed." << std::endl;
119  m_finalized = true;
120  std::exit(failedTests);
121  }
122 
123  void runTestInt(testFunction fun, const char *name);
124 
125  bool status;
131  const char *only_name;
132  std::fstream plotFile;
133  private:
136  public:
140  double meanDistance;
142 };
143 
145 
147 {
148  _unit_test_global.expect_failure = true;
149 }
150 
151 inline const char *_unittest_fail()
152 {
153  if (_unit_test_global.expect_failure) {
154  return "XFAIL: ";
155  }
156  static const char *str = 0;
157  if (str == 0) {
158  if (mayUseColor(std::cout)) {
159  static const char *fail = " \033[1;40;31mFAIL:\033[0m ";
160  str = fail;
161  } else {
162  static const char *fail = " FAIL: ";
163  str = fail;
164  }
165  }
166  return str;
167 }
168 
169 void initTest(int argc, char **argv)
170 {
171  for (int i = 1; i < argc; ++i) {
172  if (0 == std::strcmp(argv[i], "--help") || 0 == std::strcmp(argv[i], "-h")) {
173  std::cout <<
174  "Usage: " << argv[0] << " [-h|--help] [--only <testname>] [--maxdist] [--plotdist <plot.dat>]\n";
175  exit(0);
176  }
177  if (0 == std::strcmp(argv[i], "--only") && i + 1 < argc) {
178  _unit_test_global.only_name = argv[i + 1];
179  } else if (0 == std::strcmp(argv[i], "--maxdist")) {
180  _unit_test_global.findMaximumDistance = true;
181  } else if (0 == std::strcmp(argv[i], "--plotdist") && i + 1 < argc) {
182  _unit_test_global.plotFile.open(argv[i + 1], std::ios_base::out);
183  _unit_test_global.plotFile << "# reference\tdistance\n";
184  }
185  }
186 }
187 
188 template<typename T> inline void setFuzzyness( T );
189 template<> inline void setFuzzyness<float>( float fuzz ) { _unit_test_global.float_fuzzyness = fuzz; }
190 template<> inline void setFuzzyness<double>( double fuzz ) { _unit_test_global.double_fuzzyness = fuzz; }
191 
193 {
194  if (_unit_test_global.only_name && 0 != std::strcmp(name, _unit_test_global.only_name)) {
195  return;
196  }
197  _unit_test_global.status = true;
198  _unit_test_global.expect_failure = false;
199  try {
202  maximumDistance = 0.;
203  meanDistance = 0.;
204  meanCount = 0;
205  fun();
206  } catch(_UnitTest_Failure) {
207  }
208  if (_unit_test_global.expect_failure) {
209  if (!_unit_test_global.status) {
210  std::cout << "XFAIL: " << name << std::endl;
211  } else {
212  std::cout << "unexpected PASS: " << name <<
213  "\n This test should have failed but didn't. Check the code!" << std::endl;
214  ++failedTests;
215  }
216  } else {
217  if (!_unit_test_global.status) {
218  if (findMaximumDistance) {
219  std::cout << _unittest_fail() << "│ with a maximal distance of " << maximumDistance << " to the reference (mean: " << meanDistance / meanCount << ").\n";
220  }
221  std::cout << _unittest_fail() << "┕ " << name << std::endl;
222  ++failedTests;
223  } else {
224  printPass();
225  std::cout << name;
226  if (findMaximumDistance) {
227  if (maximumDistance > 0.) {
228  std::cout << " with a maximal distance of " << maximumDistance << " to the reference (mean: " << meanDistance / meanCount << ").";
229  } else {
230  std::cout << " all values matched the reference precisely.";
231  }
232  }
233  std::cout << std::endl;
234  ++passedTests;
235  }
236  }
237 }
238 
239 template<typename T1, typename T2> inline bool unittest_compareHelper( const T1 &a, const T2 &b ) { return a == b; }
240 template<> inline bool unittest_compareHelper<Vc::int_v, Vc::int_v>( const Vc::int_v &a, const Vc::int_v &b ) { return (a == b).isFull(); }
241 template<> inline bool unittest_compareHelper<Vc::uint_v, Vc::uint_v>( const Vc::uint_v &a, const Vc::uint_v &b ) { return (a == b).isFull(); }
242 template<> inline bool unittest_compareHelper<Vc::float_v, Vc::float_v>( const Vc::float_v &a, const Vc::float_v &b ) { return (a == b).isFull(); }
243 template<> inline bool unittest_compareHelper<Vc::sfloat_v, Vc::sfloat_v>( const Vc::sfloat_v &a, const Vc::sfloat_v &b ) { return (a == b).isFull(); }
244 template<> inline bool unittest_compareHelper<Vc::double_v, Vc::double_v>( const Vc::double_v &a, const Vc::double_v &b ) { return (a == b).isFull(); }
245 template<> inline bool unittest_compareHelper<Vc::ushort_v, Vc::ushort_v>( const Vc::ushort_v &a, const Vc::ushort_v &b ) { return (a == b).isFull(); }
246 template<> inline bool unittest_compareHelper<Vc::short_v, Vc::short_v>( const Vc::short_v &a, const Vc::short_v &b ) { return (a == b).isFull(); }
247 template<> inline bool unittest_compareHelper<std::type_info, std::type_info>(const std::type_info &a, const std::type_info &b ) { return &a == &b; }
248 
249 template<typename T> T ulpDiffToReferenceWrapper(T a, T b) {
250  const T diff = ulpDiffToReference(a, b);
251  if (VC_IS_UNLIKELY(_unit_test_global.findMaximumDistance)) {
252  _unit_test_global.maximumDistance = std::max<double>(std::abs(diff), _unit_test_global.maximumDistance);
253  _unit_test_global.meanDistance += std::abs(diff);
254  ++_unit_test_global.meanCount;
255  }
256  return diff;
257 }
258 template<typename T> Vc::Vector<T> ulpDiffToReferenceWrapper(VC_ALIGNED_PARAMETER(Vc::Vector<T>) a, VC_ALIGNED_PARAMETER(Vc::Vector<T>) b) {
259  const Vc::Vector<T> diff = ulpDiffToReference(a, b);
260  if (VC_IS_UNLIKELY(_unit_test_global.findMaximumDistance)) {
261  _unit_test_global.maximumDistance = std::max<double>(Vc::abs(diff).max(), _unit_test_global.maximumDistance);
262  _unit_test_global.meanDistance += Vc::abs(diff).sum();
263  _unit_test_global.meanCount += Vc::Vector<T>::Size;
264  }
265  return diff;
266 }
267 template<typename T> inline bool unittest_fuzzyCompareHelper( const T &a, const T &b ) { return a == b; }
268 template<> inline bool unittest_fuzzyCompareHelper<float>( const float &a, const float &b ) {
269  return ulpDiffToReferenceWrapper(a, b) <= _unit_test_global.float_fuzzyness;
270 }
271 template<> inline bool unittest_fuzzyCompareHelper<Vc::float_v>( const Vc::float_v &a, const Vc::float_v &b ) {
272  return (ulpDiffToReferenceWrapper(a, b) <= _unit_test_global.float_fuzzyness).isFull();
273 }
274 template<> inline bool unittest_fuzzyCompareHelper<Vc::sfloat_v>( const Vc::sfloat_v &a, const Vc::sfloat_v &b ) {
275  return (ulpDiffToReferenceWrapper(a, b) <= _unit_test_global.float_fuzzyness).isFull();
276 }
277 template<> inline bool unittest_fuzzyCompareHelper<double>( const double &a, const double &b ) {
278  return ulpDiffToReferenceWrapper(a, b) <= _unit_test_global.double_fuzzyness;
279 }
280 template<> inline bool unittest_fuzzyCompareHelper<Vc::double_v>( const Vc::double_v &a, const Vc::double_v &b ) {
281  return (ulpDiffToReferenceWrapper(a, b) <= _unit_test_global.double_fuzzyness).isFull();
282 }
283 
284 template<typename T1, typename T2, typename M> inline void unitttest_comparePrintHelper(const T1 &a, const T2 &b, const M &m, const char *aa, const char *bb, const char *file, int line, double fuzzyness = 0.) {
285  std::cout << " " << aa << " (" << std::setprecision(10) << a << std::setprecision(6) << ") == " << bb << " (" << std::setprecision(10) << b << std::setprecision(6) << ") -> " << m;
286  if (fuzzyness > 0.) {
287  std::cout << " with fuzzyness " << fuzzyness;
288  }
289  std::cout << " at " << file << ":" << line << " failed.\n";
290 }
291 
292 template<typename T> inline double unittest_fuzzynessHelper(const T &) { return 0.; }
293 template<> inline double unittest_fuzzynessHelper<float>(const float &) { return _unit_test_global.float_fuzzyness; }
294 template<> inline double unittest_fuzzynessHelper<Vc::float_v>(const Vc::float_v &) { return _unit_test_global.float_fuzzyness; }
295 template<> inline double unittest_fuzzynessHelper<double>(const double &) { return _unit_test_global.double_fuzzyness; }
296 template<> inline double unittest_fuzzynessHelper<Vc::double_v>(const Vc::double_v &) { return _unit_test_global.double_fuzzyness; }
297 
299 {
300  public:
301  enum OptionFuzzy { Fuzzy };
302  enum OptionNoEq { NoEq };
303 
304  template<typename T1, typename T2>
305  Vc_ALWAYS_INLINE _UnitTest_Compare(const T1 &a, const T2 &b, const char *_a, const char *_b, const char *_file, int _line)
307  {
308  if (VC_IS_UNLIKELY(m_failed)) {
309  printFirst();
310  printPosition(_file, _line); print(":\n");
311  print(_a); print(" ("); print(std::setprecision(10)); print(a); print(") == ");
312  print(_b); print(" ("); print(std::setprecision(10)); print(b); print(std::setprecision(6));
313  print(") -> "); print(a == b);
314  }
315  }
316 
317  template<typename T1, typename T2>
318  Vc_ALWAYS_INLINE _UnitTest_Compare(const T1 &a, const T2 &b, const char *_a, const char *_b, const char *_file, int _line, OptionNoEq)
320  {
321  if (VC_IS_UNLIKELY(m_failed)) {
322  printFirst();
323  printPosition(_file, _line); print(":\n");
324  print(_a); print(" ("); print(std::setprecision(10)); print(a); print(") == ");
325  print(_b); print(" ("); print(std::setprecision(10)); print(b); print(std::setprecision(6));
326  print(')');
327  }
328  }
329 
330  template<typename T>
331  Vc_ALWAYS_INLINE _UnitTest_Compare(const T &a, const T &b, const char *_a, const char *_b, const char *_file, int _line, OptionFuzzy)
333  {
334  if (VC_IS_UNLIKELY(m_failed)) {
335  printFirst();
336  printPosition(_file, _line); print(":\n");
337  print(_a); print(" ("); print(std::setprecision(10)); print(a); print(") ≈ ");
338  print(_b); print(" ("); print(std::setprecision(10)); print(b); print(std::setprecision(6));
339  print(") -> "); print(a == b);
340  printFuzzyInfo(a, b);
341  }
342  if (_unit_test_global.plotFile.is_open()) {
343  writePlotData(_unit_test_global.plotFile, a, b);
344  }
345  }
346 
347  Vc_ALWAYS_INLINE _UnitTest_Compare(bool good, const char *cond, const char *_file, int _line)
348  : m_ip(getIp()), m_failed(!good)
349  {
350  if (VC_IS_UNLIKELY(m_failed)) {
351  printFirst();
352  printPosition(_file, _line);
353  print(": "); print(cond);
354  }
355  }
356 
357  Vc_ALWAYS_INLINE _UnitTest_Compare(const char *_file, int _line)
358  : m_ip(getIp()), m_failed(true)
359  {
360  printFirst();
361  printPosition(_file, _line);
362  print(":\n");
363  }
364 
365  template<typename T> Vc_ALWAYS_INLINE const _UnitTest_Compare &operator<<(const T &x) const {
366  if (VC_IS_UNLIKELY(m_failed)) {
367  print(x);
368  }
369  return *this;
370  }
371 
372  Vc_ALWAYS_INLINE const _UnitTest_Compare &operator<<(const char *str) const {
373  if (VC_IS_UNLIKELY(m_failed)) {
374  print(str);
375  }
376  return *this;
377  }
378 
379  Vc_ALWAYS_INLINE const _UnitTest_Compare &operator<<(const char ch) const {
380  if (VC_IS_UNLIKELY(m_failed)) {
381  print(ch);
382  }
383  return *this;
384  }
385 
387  if (VC_IS_UNLIKELY(m_failed)) {
388  print(b);
389  }
390  return *this;
391  }
392 
394  {
395  if (VC_IS_UNLIKELY(m_failed)) {
396  printLast();
397  }
398  }
399 
400  private:
401  static Vc_ALWAYS_INLINE size_t getIp() {
402  size_t _ip;
403 #if defined(__x86_64__) && defined(VC_GNU_ASM)
404  asm("lea 0(%%rip),%0" : "=r"(_ip));
405 #else
406  _ip = 0;
407 #endif
408  return _ip;
409  }
410  static void printFirst() { std::cout << _unittest_fail() << "┍ "; }
411  template<typename T> static void print(const T &x) { std::cout << x; }
412  static void print(const std::type_info &x) { std::cout << x.name(); }
413  static void print(const char *str) {
414  const char *pos = 0;
415  if (0 != (pos = std::strchr(str, '\n'))) {
416  if (pos == str) {
417  std::cout << '\n' << _unittest_fail() << "│ " << &str[1];
418  } else {
419  char *left = strdup(str);
420  left[pos - str] = '\0';
421  std::cout << left << '\n' << _unittest_fail() << "│ " << &pos[1];
422  free(left);
423  }
424  } else {
425  std::cout << str;
426  }
427  }
428  static void print(const char ch) {
429  if (ch == '\n') {
430  std::cout << '\n' << _unittest_fail() << "│ ";
431  } else {
432  std::cout << ch;
433  }
434  }
435  static void print(bool b) {
436  std::cout << (b ? "true" : "false");
437  }
438  static void printLast() {
439  std::cout << std::endl;
440  _unit_test_global.status = false;
441  //if (!_unit_test_global.plotFile.is_open()) {
442  throw _UnitTest_Failure();
443  //}
444  }
445  void printPosition(const char *_file, int _line) {
446  std::cout << "at " << _file << ':' << _line << " (0x" << std::hex << m_ip << std::dec << ')';
447  }
448  template<typename T> static inline void writePlotData(std::fstream &file, VC_ALIGNED_PARAMETER(T) a, VC_ALIGNED_PARAMETER(T) b);
449  template<typename T> static inline void printFuzzyInfo(VC_ALIGNED_PARAMETER(T) a, VC_ALIGNED_PARAMETER(T) b);
450  template<typename T> static inline void printFuzzyInfoImpl(VC_ALIGNED_PARAMETER(T) a, VC_ALIGNED_PARAMETER(T) b, double fuzzyness) {
451  print("\ndistance: ");
453  print(", allowed distance: ");
454  print(fuzzyness);
455  }
456  const size_t m_ip;
457  const bool m_failed;
458 };
461  printFuzzyInfoImpl(a, b, _unit_test_global.float_fuzzyness);
462 }
464  printFuzzyInfoImpl(a, b, _unit_test_global.double_fuzzyness);
465 }
467  printFuzzyInfoImpl(a, b, _unit_test_global.float_fuzzyness);
468 }
470  printFuzzyInfoImpl(a, b, _unit_test_global.double_fuzzyness);
471 }
473  printFuzzyInfoImpl(a, b, _unit_test_global.float_fuzzyness);
474 }
475 template<typename T> inline void _UnitTest_Compare::writePlotData(std::fstream &, VC_ALIGNED_PARAMETER(T), VC_ALIGNED_PARAMETER(T)) {}
476 template<> inline void _UnitTest_Compare::writePlotData(std::fstream &file, VC_ALIGNED_PARAMETER(float) a, VC_ALIGNED_PARAMETER(float) b) {
477  file << std::setprecision(12) << b << "\t" << ulpDiffToReferenceSigned(a, b) << "\n";
478 }
479 template<> inline void _UnitTest_Compare::writePlotData(std::fstream &file, VC_ALIGNED_PARAMETER(double) a, VC_ALIGNED_PARAMETER(double) b) {
480  file << std::setprecision(12) << b << "\t" << ulpDiffToReferenceSigned(a, b) << "\n";
481 }
483  const Vc::float_v ref = b;
485  for (int i = 0; i < Vc::float_v::Size; ++i) {
486  file << std::setprecision(12) << ref[i] << "\t" << dist[i] << "\n";
487  }
488 }
490  const Vc::double_v ref = b;
492  for (int i = 0; i < Vc::double_v::Size; ++i) {
493  file << std::setprecision(12) << ref[i] << "\t" << dist[i] << "\n";
494  }
495 }
497  const Vc::sfloat_v ref = b;
499  for (int i = 0; i < Vc::sfloat_v::Size; ++i) {
500  file << std::setprecision(12) << ref[i] << "\t" << dist[i] << "\n";
501  }
502 }
503 
504 // Workaround for clang: The "<< ' '" is only added to silence the warnings about unused return
505 // values.
506 #define FUZZY_COMPARE( a, b ) \
507  _UnitTest_Compare(a, b, #a, #b, __FILE__, __LINE__, _UnitTest_Compare::Fuzzy) << ' '
508 
509 #define COMPARE( a, b ) \
510  _UnitTest_Compare(a, b, #a, #b, __FILE__, __LINE__) << ' '
511 
512 #define COMPARE_NOEQ( a, b ) \
513  _UnitTest_Compare(a, b, #a, #b, __FILE__, __LINE__, _UnitTest_Compare::NoEq) << ' '
514 
515 #define VERIFY(cond) \
516  _UnitTest_Compare(cond, #cond, __FILE__, __LINE__) << ' '
517 
518 #define FAIL() \
519  _UnitTest_Compare(__FILE__, __LINE__) << ' '
520 
521 class ADD_PASS
522 {
523  public:
524  ADD_PASS() { ++_unit_test_global.passedTests; printPass(); }
525  ~ADD_PASS() { std::cout << std::endl; }
526  template<typename T> ADD_PASS &operator<<(const T &x) { std::cout << x; return *this; }
527 };
528 
529 inline void unittest_assert(bool cond, const char *code, const char *file, int line)
530 {
531  if (!cond) {
532  if (_unit_test_global.expect_assert_failure) {
533  ++_unit_test_global.assert_failure;
534  } else {
535  _UnitTest_Compare(file, line) << "assert(" << code << ") failed.";
536  }
537  }
538 }
539 #ifdef assert
540 #undef assert
541 #endif
542 #define assert(cond) unittest_assert(cond, #cond, __FILE__, __LINE__)
543 
544 #define EXPECT_ASSERT_FAILURE(code) \
545  _unit_test_global.expect_assert_failure = true; \
546  _unit_test_global.assert_failure = 0; \
547  code; \
548  if (_unit_test_global.assert_failure == 0) { \
549  /* failure expected but it didn't fail */ \
550  std::cout << " " << #code << " at " << __FILE__ << ":" << __LINE__ << \
551  " did not fail as was expected.\n"; \
552  _unit_test_global.status = false; \
553  throw _UnitTest_Failure(); \
554  return; \
555  } \
556  _unit_test_global.expect_assert_failure = false
557 
558 template<typename Vec> inline typename Vec::Mask allMasks(int i)
559 {
560  typedef typename Vec::IndexType I;
561  typedef typename Vec::Mask M;
562 
563  if (i == 0) {
564  return M(true);
565  }
566  --i;
567  if (i < Vec::Size) {
568  return M (I(Vc::IndexesFromZero) == i);
569  }
570  i -= Vec::Size;
571  if (Vec::Size < 3) {
572  return M(false);
573  }
574  for (int a = 0; a < Vec::Size - 1; ++a) {
575  for (int b = a + 1; b < Vec::Size; ++b) {
576  if (i == 0) {
577  I indexes(Vc::IndexesFromZero);
578  return M(indexes == a || indexes == b);
579  }
580  --i;
581  }
582  }
583  if (Vec::Size < 4) {
584  return M(false);
585  }
586  for (int a = 0; a < Vec::Size - 1; ++a) {
587  for (int b = a + 1; b < Vec::Size; ++b) {
588  for (int c = b + 1; c < Vec::Size; ++c) {
589  if (i == 0) {
590  I indexes(Vc::IndexesFromZero);
591  return M(indexes == a || indexes == b || indexes == c);
592  }
593  --i;
594  }
595  }
596  }
597  if (Vec::Size < 5) {
598  return M(false);
599  }
600  for (int a = 0; a < Vec::Size - 1; ++a) {
601  for (int b = a + 1; b < Vec::Size; ++b) {
602  for (int c = b + 1; c < Vec::Size; ++c) {
603  for (int d = c + 1; d < Vec::Size; ++d) {
604  if (i == 0) {
605  I indexes(Vc::IndexesFromZero);
606  return M(indexes == a || indexes == b || indexes == c || indexes == d);
607  }
608  --i;
609  }
610  }
611  }
612  }
613  if (Vec::Size < 6) {
614  return M(false);
615  }
616  for (int a = 0; a < Vec::Size - 1; ++a) {
617  for (int b = a + 1; b < Vec::Size; ++b) {
618  for (int c = b + 1; c < Vec::Size; ++c) {
619  for (int d = c + 1; d < Vec::Size; ++d) {
620  for (int e = d + 1; e < Vec::Size; ++e) {
621  if (i == 0) {
622  I indexes(Vc::IndexesFromZero);
623  return M(indexes == a || indexes == b || indexes == c || indexes == d || indexes == e);
624  }
625  --i;
626  }
627  }
628  }
629  }
630  }
631  if (Vec::Size < 7) {
632  return M(false);
633  }
634  for (int a = 0; a < Vec::Size - 1; ++a) {
635  for (int b = a + 1; b < Vec::Size; ++b) {
636  for (int c = b + 1; c < Vec::Size; ++c) {
637  for (int d = c + 1; d < Vec::Size; ++d) {
638  for (int e = d + 1; e < Vec::Size; ++e) {
639  for (int f = e + 1; f < Vec::Size; ++f) {
640  if (i == 0) {
641  I indexes(Vc::IndexesFromZero);
642  return M(indexes == a || indexes == b || indexes == c || indexes == d || indexes == e || indexes == f);
643  }
644  --i;
645  }
646  }
647  }
648  }
649  }
650  }
651  if (Vec::Size < 8) {
652  return M(false);
653  }
654  for (int a = 0; a < Vec::Size - 1; ++a) {
655  for (int b = a + 1; b < Vec::Size; ++b) {
656  for (int c = b + 1; c < Vec::Size; ++c) {
657  for (int d = c + 1; d < Vec::Size; ++d) {
658  for (int e = d + 1; e < Vec::Size; ++e) {
659  for (int f = e + 1; f < Vec::Size; ++f) {
660  for (int g = f + 1; g < Vec::Size; ++g) {
661  if (i == 0) {
662  I indexes(Vc::IndexesFromZero);
663  return M(indexes == a || indexes == b || indexes == c || indexes == d
664  || indexes == e || indexes == f || indexes == g);
665  }
666  --i;
667  }
668  }
669  }
670  }
671  }
672  }
673  }
674  return M(false);
675 }
676 
677 #define for_all_masks(VecType, _mask_) \
678  for (int _Vc_for_all_masks_i = 0; _Vc_for_all_masks_i == 0; ++_Vc_for_all_masks_i) \
679  for (typename VecType::Mask _mask_ = allMasks<VecType>(_Vc_for_all_masks_i++); !_mask_.isEmpty(); _mask_ = allMasks<VecType>(_Vc_for_all_masks_i++))
680 
681 #endif // UNITTEST_H
double dist(Rotation3D const &r1, Rotation3D const &r2)
Definition: 3DDistances.cxx:48
Vc_ALWAYS_INLINE _UnitTest_Compare(const T1 &a, const T2 &b, const char *_a, const char *_b, const char *_file, int _line, OptionNoEq)
Definition: unittest.h:318
const char * _unittest_fail()
Definition: unittest.h:151
VECTOR_NAMESPACE::uint_v uint_v
Definition: vector.h:88
VECTOR_NAMESPACE::sfloat_v sfloat_v
Definition: vector.h:82
Vc_ALWAYS_INLINE _UnitTest_Compare(const T1 &a, const T2 &b, const char *_a, const char *_b, const char *_file, int _line)
Definition: unittest.h:305
Vc_ALWAYS_INLINE _UnitTest_Compare(const T &a, const T &b, const char *_a, const char *_b, const char *_file, int _line, OptionFuzzy)
Definition: unittest.h:331
Vec::Mask allMasks(int i)
Definition: unittest.h:558
unsigned int hex
Definition: math.cpp:442
void initTest(int argc, char **argv)
Definition: unittest.h:169
TLine * line
void setFuzzyness< double >(double fuzz)
Definition: unittest.h:190
return c
void unitttest_comparePrintHelper(const T1 &a, const T2 &b, const M &m, const char *aa, const char *bb, const char *file, int line, double fuzzyness=0.)
Definition: unittest.h:284
void unittest_assert(bool cond, const char *code, const char *file, int line)
Definition: unittest.h:529
const char * Size
Definition: TXMLSetup.cxx:56
double unittest_fuzzynessHelper< float >(const float &)
Definition: unittest.h:293
Vc_ALWAYS_INLINE ~_UnitTest_Compare()
Definition: unittest.h:393
void(* testFunction)()
Definition: unittest.h:87
bool unittest_fuzzyCompareHelper(const T &a, const T &b)
Definition: unittest.h:267
TArc * a
Definition: textangle.C:12
static Vc_ALWAYS_INLINE size_t getIp()
Definition: unittest.h:401
Vc_ALWAYS_INLINE const _UnitTest_Compare & operator<<(const T &x) const
Definition: unittest.h:365
ClassImp(TIterator) Bool_t TIterator return false
Compare two iterator objects.
Definition: TIterator.cxx:21
TFile * f
bool unittest_fuzzyCompareHelper< double >(const double &a, const double &b)
Definition: unittest.h:277
VECTOR_NAMESPACE::short_v short_v
Definition: vector.h:90
void printPass()
Definition: unittest.h:66
TTree * T
T ulpDiffToReferenceWrapper(T a, T b)
Definition: unittest.h:249
Double_t x[n]
Definition: legend1.C:17
static void print(const T &x)
Definition: unittest.h:411
const char * only_name
Definition: unittest.h:131
int d
Definition: tornado.py:11
void setFuzzyness< float >(float fuzz)
Definition: unittest.h:189
static T ulpDiffToReferenceSigned(T val, T ref)
Definition: ulp.h:53
static Vc_ALWAYS_INLINE Vector< T > abs(const Vector< T > &x)
Definition: vector.h:450
static void printFirst()
Definition: unittest.h:410
VECTOR_NAMESPACE::ushort_v ushort_v
Definition: vector.h:92
ADD_PASS & operator<<(const T &x)
Definition: unittest.h:526
std::fstream plotFile
Definition: unittest.h:132
char * out
Definition: TBase64.cxx:29
Vc_ALWAYS_INLINE const _UnitTest_Compare & operator<<(const char ch) const
Definition: unittest.h:379
#define VC_ALIGNED_PARAMETER(_Type)
Definition: macros.h:368
VECTOR_NAMESPACE::int_v int_v
Definition: vector.h:86
#define VC_IS_UNLIKELY(x)
Definition: macros.h:143
~ADD_PASS()
Definition: unittest.h:525
VECTOR_NAMESPACE::double_v double_v
Definition: vector.h:80
ADD_PASS()
Definition: unittest.h:524
double unittest_fuzzynessHelper(const T &)
Definition: unittest.h:292
double unittest_fuzzynessHelper< double >(const double &)
Definition: unittest.h:295
TMarker * m
Definition: textangle.C:8
Vc_ALWAYS_INLINE _UnitTest_Compare(bool good, const char *cond, const char *_file, int _line)
Definition: unittest.h:347
bool unittest_compareHelper(const T1 &a, const T2 &b)
Definition: unittest.h:239
tuple free
Definition: fildir.py:30
void runTestInt(testFunction fun, const char *name)
Definition: unittest.h:192
void printPosition(const char *_file, int _line)
Definition: unittest.h:445
#define Vc_ALWAYS_INLINE
Definition: macros.h:130
static void print(const char ch)
Definition: unittest.h:428
static void print(bool b)
Definition: unittest.h:435
static void printLast()
Definition: unittest.h:438
static bool _UnitTest_verify_vector_unit_supported_result
Definition: unittest.h:81
void EXPECT_FAILURE()
Definition: unittest.h:146
#define T2
Definition: md5.inl:146
VECTOR_NAMESPACE::float_v float_v
Definition: vector.h:84
void setFuzzyness(T)
bool _UnitTest_verify_vector_unit_supported()
Definition: unittest.h:71
#define name(a, b)
Definition: linkTestLib0.cpp:5
static _UnitTest_Global_Object _unit_test_global
Definition: unittest.h:144
const bool m_failed
Definition: unittest.h:457
#define T1
Definition: md5.inl:145
typedef void((*Func_t)())
static void writePlotData(std::fstream &file, VC_ALIGNED_PARAMETER(T) a, VC_ALIGNED_PARAMETER(T) b)
Definition: unittest.h:475
static void printFuzzyInfoImpl(VC_ALIGNED_PARAMETER(T) a, VC_ALIGNED_PARAMETER(T) b, double fuzzyness)
Definition: unittest.h:450
static T ulpDiffToReference(T val, T ref)
Definition: ulp.h:34
bool unittest_fuzzyCompareHelper< float >(const float &a, const float &b)
Definition: unittest.h:268
static void printFuzzyInfo(VC_ALIGNED_PARAMETER(T) a, VC_ALIGNED_PARAMETER(T) b)
Definition: unittest.h:459
Vc_ALWAYS_INLINE const _UnitTest_Compare & operator<<(const char *str) const
Definition: unittest.h:372
static void print(const char *str)
Definition: unittest.h:413
Vc_ALWAYS_INLINE _UnitTest_Compare(const char *_file, int _line)
Definition: unittest.h:357
#define I(x, y, z)
static void print(const std::type_info &x)
Definition: unittest.h:412
Vc_ALWAYS_INLINE const _UnitTest_Compare & operator<<(bool b) const
Definition: unittest.h:386
static VC_TARGET_NO_SIMD bool currentImplementationSupported()
Tests that the CPU and Operating System support the vector unit which was compiled for...
Definition: support.h:138
const size_t m_ip
Definition: unittest.h:456