meta.cpp File Reference
#include "main.h"
#include <array>
#include <Eigen/src/Core/util/Meta.h>

Classes

struct  FooReturnType
 
struct  MyInterface
 
struct  MyImpl
 
struct  dummy_a
 
struct  dummy_b
 
struct  dummy_c
 
struct  dummy_d
 
struct  dummy_e
 
struct  dummy_op< dummy_a, dummy_b >
 
struct  dummy_op< dummy_b, dummy_a >
 
struct  dummy_op< dummy_b, dummy_c >
 
struct  dummy_op< dummy_c, dummy_b >
 
struct  dummy_op< dummy_c, dummy_a >
 
struct  dummy_op< dummy_a, dummy_c >
 
struct  dummy_op< dummy_a, dummy_a >
 
struct  dummy_op< dummy_b, dummy_b >
 
struct  dummy_op< dummy_c, dummy_c >
 
struct  dummy_test< A, B >
 
struct  dummy_test< dummy_a, dummy_a >
 
struct  dummy_test< dummy_b, dummy_b >
 
struct  dummy_test< dummy_c, dummy_c >
 
struct  times2_op
 
struct  dummy_inst
 

Macros

#define VERIFY_META_SQRT(X)   VERIFY(internal::meta_sqrt<X>::ret == int(std::sqrt(double(X))))
 

Functions

template<typename From , typename To >
bool check_is_convertible (const From &, const To &)
 
 EIGEN_DECLARE_TEST (meta)
 
static void test_gen_numeric_list ()
 
static void test_concat ()
 
static void test_slice ()
 
static void test_get ()
 
static void test_id_helper (dummy_a a, dummy_a b, dummy_a c)
 
template<int... ii>
static void test_id_numeric ()
 
template<typename... tt>
static void test_id_type ()
 
static void test_id ()
 
static void test_is_same_gf ()
 
static void test_apply_op ()
 
static void test_contained_in_list ()
 
static void test_arg_reductions ()
 
static void test_array_reverse_and_reduce ()
 
static void test_array_zip_and_apply ()
 
static void test_array_misc ()
 
 EIGEN_DECLARE_TEST (cxx11_meta)
 

Macro Definition Documentation

◆ VERIFY_META_SQRT

#define VERIFY_META_SQRT (   X)    VERIFY(internal::meta_sqrt<X>::ret == int(std::sqrt(double(X))))

Function Documentation

◆ check_is_convertible()

template<typename From , typename To >
bool check_is_convertible ( const From &  ,
const To &   
)
16  {
18 }
squared absolute value
Definition: GlobalFunctions.h:87

References Eigen::value.

Referenced by EIGEN_DECLARE_TEST().

◆ EIGEN_DECLARE_TEST() [1/2]

EIGEN_DECLARE_TEST ( cxx11_meta  )
520  {
533 }
#define CALL_SUBTEST(FUNC)
Definition: main.h:382
static void test_id()
Definition: meta.cpp:424
static void test_arg_reductions()
Definition: meta.cpp:468
static void test_contained_in_list()
Definition: meta.cpp:446
static void test_slice()
Definition: meta.cpp:347
static void test_array_misc()
Definition: meta.cpp:505
static void test_gen_numeric_list()
Definition: meta.cpp:255
static void test_is_same_gf()
Definition: meta.cpp:431
static void test_get()
Definition: meta.cpp:389
static void test_apply_op()
Definition: meta.cpp:438
static void test_concat()
Definition: meta.cpp:307
static void test_array_reverse_and_reduce()
Definition: meta.cpp:475
static void test_array_zip_and_apply()
Definition: meta.cpp:489

References CALL_SUBTEST, test_apply_op(), test_arg_reductions(), test_array_misc(), test_array_reverse_and_reduce(), test_array_zip_and_apply(), test_concat(), test_contained_in_list(), test_gen_numeric_list(), test_get(), test_id(), test_is_same_gf(), and test_slice().

◆ EIGEN_DECLARE_TEST() [2/2]

EIGEN_DECLARE_TEST ( meta  )
32  {
37 
38  VERIFY((internal::is_same<float, internal::remove_all_t<const float&>>::value));
39  VERIFY((internal::is_same<float, internal::remove_all_t<const float*>>::value));
40  VERIFY((internal::is_same<float, internal::remove_all_t<const float*&>>::value));
41  VERIFY((internal::is_same<float, internal::remove_all_t<float**>>::value));
42  VERIFY((internal::is_same<float, internal::remove_all_t<float**&>>::value));
43  VERIFY((internal::is_same<float, internal::remove_all_t<float* const*&>>::value));
44  VERIFY((internal::is_same<float, internal::remove_all_t<float* const>>::value));
45 
46  // test add_const_on_value_type
47  VERIFY((internal::is_same<internal::add_const_on_value_type_t<float&>, float const&>::value));
48  VERIFY((internal::is_same<internal::add_const_on_value_type_t<float*>, float const*>::value));
49 
50  VERIFY((internal::is_same<internal::add_const_on_value_type_t<float>, const float>::value));
51  VERIFY((internal::is_same<internal::add_const_on_value_type_t<const float>, const float>::value));
52 
53  VERIFY((internal::is_same<internal::add_const_on_value_type_t<const float* const>, const float* const>::value));
54  VERIFY((internal::is_same<internal::add_const_on_value_type_t<float* const>, const float* const>::value));
55 
56  // is_convertible
62  STATIC_CHECK((internal::is_convertible<double, std::complex<double>>::value));
63  STATIC_CHECK((!internal::is_convertible<std::complex<double>, double>::value));
73 
76 
77  // STATIC_CHECK((!internal::is_convertible<Matrix3f,Matrix3d>::value )); //does not even compile because the
78  // conversion is prevented by a static assertion
81  {
82  float f = 0.0f;
83  MatrixXf A, B;
84  VectorXf a, b;
85  VERIFY((check_is_convertible(a.dot(b), f)));
86  VERIFY((check_is_convertible(a.transpose() * b, f)));
89  }
90 
91 #if (EIGEN_COMP_GNUC_STRICT && EIGEN_COMP_GNUC <= 990) || (EIGEN_COMP_CLANG_STRICT && EIGEN_COMP_CLANG <= 990) || \
92  (EIGEN_COMP_MSVC && EIGEN_COMP_MSVC <= 1914)
93  // See http://eigen.tuxfamily.org/bz/show_bug.cgi?id=1752,
94  // basically, a fix in the c++ standard breaks our c++98 implementation
95  // of is_convertible for abstract classes.
96  // So the following tests are expected to fail with recent compilers.
97 
101 
102 #endif
103 
104  {
105  int i = 0;
106  VERIFY((check_is_convertible(fix<3>(), i)));
107  VERIFY((!check_is_convertible(i, fix<DynamicIndex>())));
108  }
109 
111  VERIFY((internal::has_ReturnType<ScalarBinaryOpTraits<int, int>>::value));
114 
116 #define VERIFY_META_SQRT(X) VERIFY(internal::meta_sqrt<X>::ret == int(std::sqrt(double(X))))
117  VERIFY_META_SQRT(2);
118  VERIFY_META_SQRT(3);
119  VERIFY_META_SQRT(4);
120  VERIFY_META_SQRT(5);
121  VERIFY_META_SQRT(6);
122  VERIFY_META_SQRT(8);
123  VERIFY_META_SQRT(9);
124  VERIFY_META_SQRT(15);
125  VERIFY_META_SQRT(16);
126  VERIFY_META_SQRT(17);
127  VERIFY_META_SQRT(255);
128  VERIFY_META_SQRT(256);
129  VERIFY_META_SQRT(257);
130  VERIFY_META_SQRT(1023);
131  VERIFY_META_SQRT(1024);
132  VERIFY_META_SQRT(1025);
133 }
int i
Definition: BiCGSTAB_step_by_step.cpp:9
Scalar * b
Definition: benchVecAdd.cpp:17
Matrix< SCALARA, Dynamic, Dynamic, opt_A > A
Definition: bench_gemm.cpp:47
Matrix< SCALARB, Dynamic, Dynamic, opt_B > B
Definition: bench_gemm.cpp:48
The matrix class, also used for vectors and row-vectors.
Definition: Eigen/Eigen/src/Core/Matrix.h:186
Definition: matrices.h:74
static int f(const TensorMap< Tensor< int, 3 > > &tensor)
Definition: cxx11_tensor_map.cpp:237
Eigen::DenseIndex ret
Definition: level1_cplx_impl.h:43
const Scalar * a
Definition: level2_cplx_impl.h:32
#define VERIFY(a)
Definition: main.h:362
#define STATIC_CHECK(COND)
Definition: main.h:380
bool check_is_convertible(const From &, const To &)
Definition: meta.cpp:16
#define VERIFY_META_SQRT(X)
Determines whether the given binary operation of two numeric types is allowed and what the scalar ret...
Definition: XprHelper.h:1043

References a, b, check_is_convertible(), f(), i, ret, STATIC_CHECK, Eigen::value, VERIFY, and VERIFY_META_SQRT.

◆ test_apply_op()

static void test_apply_op ( )
static

◆ test_arg_reductions()

static void test_arg_reductions ( )
static
468  {
469  VERIFY_IS_EQUAL(arg_sum(1, 2, 3, 4), 10);
470  VERIFY_IS_EQUAL(arg_prod(1, 2, 3, 4), 24);
471  VERIFY_IS_APPROX(arg_sum(0.5, 2, 5), 7.5);
472  VERIFY_IS_APPROX(arg_prod(0.5, 2, 5), 5.0);
473 }
#define VERIFY_IS_APPROX(a, b)
Definition: integer_types.cpp:13
#define VERIFY_IS_EQUAL(a, b)
Definition: main.h:367
constexpr EIGEN_DEVICE_FUNCdecltype(reduce< product_op, Ts... >::run((*((Ts *) 0))...)) EIGEN_STRONG_INLIN arg_prod)(Ts... ts)
Definition: MoreMeta.h:435
constexpr decltype(reduce< sum_op, Ts... >::run((*((Ts *) 0))...)) EIGEN_STRONG_INLIN arg_sum)(Ts... ts)
Definition: MoreMeta.h:441

References Eigen::internal::arg_prod, Eigen::internal::arg_sum, VERIFY_IS_APPROX, and VERIFY_IS_EQUAL.

Referenced by EIGEN_DECLARE_TEST().

◆ test_array_misc()

static void test_array_misc ( )
static
505  {
506  array<int, 3> a3{{1, 1, 1}};
507  array<int, 6> a6{{2, 2, 2, 2, 2, 2}};
508  VERIFY((repeat<3, int>(1) == a3));
509  VERIFY((repeat<6, int>(2) == a6));
510 
511  int data[5] = {0, 1, 2, 3, 4};
512  VERIFY_IS_EQUAL((instantiate_by_c_array<dummy_inst, int, 0>(data).c), 0);
513  VERIFY_IS_EQUAL((instantiate_by_c_array<dummy_inst, int, 1>(data).c), 1);
514  VERIFY_IS_EQUAL((instantiate_by_c_array<dummy_inst, int, 2>(data).c), 2);
515  VERIFY_IS_EQUAL((instantiate_by_c_array<dummy_inst, int, 3>(data).c), 3);
516  VERIFY_IS_EQUAL((instantiate_by_c_array<dummy_inst, int, 4>(data).c), 4);
517  VERIFY_IS_EQUAL((instantiate_by_c_array<dummy_inst, int, 5>(data).c), 5);
518 }
int data[]
Definition: Map_placement_new.cpp:1
std::array< T, N > array
Definition: EmulateArray.h:231
int c
Definition: calibrate.py:100

References calibrate::c, data, VERIFY, and VERIFY_IS_EQUAL.

Referenced by EIGEN_DECLARE_TEST().

◆ test_array_reverse_and_reduce()

static void test_array_reverse_and_reduce ( )
static
475  {
476  array<int, 6> a{{4, 8, 15, 16, 23, 42}};
477  array<int, 6> b{{42, 23, 16, 15, 8, 4}};
478 
479  // there is no operator<< for std::array, so VERIFY_IS_EQUAL will
480  // not compile
481  VERIFY((array_reverse(a) == b));
482  VERIFY((array_reverse(b) == a));
483  VERIFY_IS_EQUAL((array_sum(a)), 108);
484  VERIFY_IS_EQUAL((array_sum(b)), 108);
485  VERIFY_IS_EQUAL((array_prod(a)), 7418880);
486  VERIFY_IS_EQUAL((array_prod(b)), 7418880);
487 }
constexpr EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE auto array_prod(const array< T, N > &arr) -> decltype(array_reduce< product_op, T, N >(arr, static_cast< T >(1)))
Definition: MoreMeta.h:497
constexpr EIGEN_STRONG_INLINE array< T, N > array_reverse(array< T, N > arr)
Definition: MoreMeta.h:453
constexpr EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE auto array_sum(const array< T, N > &arr) -> decltype(array_reduce< sum_op, T, N >(arr, static_cast< T >(0)))
Definition: MoreMeta.h:491

References a, Eigen::internal::array_prod(), Eigen::internal::array_reverse(), Eigen::internal::array_sum(), b, VERIFY, and VERIFY_IS_EQUAL.

Referenced by EIGEN_DECLARE_TEST().

◆ test_array_zip_and_apply()

static void test_array_zip_and_apply ( )
static
489  {
490  array<int, 6> a{{4, 8, 15, 16, 23, 42}};
491  array<int, 6> b{{0, 1, 2, 3, 4, 5}};
492  array<int, 6> c{{4, 9, 17, 19, 27, 47}};
493  array<int, 6> d{{0, 8, 30, 48, 92, 210}};
494  array<int, 6> e{{0, 2, 4, 6, 8, 10}};
495 
496  VERIFY((array_zip<sum_op>(a, b) == c));
497  VERIFY((array_zip<product_op>(a, b) == d));
498  VERIFY((array_apply<times2_op>(b) == e));
499  VERIFY_IS_EQUAL((array_apply_and_reduce<sum_op, times2_op>(a)), 216);
500  VERIFY_IS_EQUAL((array_apply_and_reduce<sum_op, times2_op>(b)), 30);
501  VERIFY_IS_EQUAL((array_zip_and_reduce<product_op, sum_op>(a, b)), 14755932);
502  VERIFY_IS_EQUAL((array_zip_and_reduce<sum_op, product_op>(a, b)), 388);
503 }
Array< double, 1, 3 > e(1./3., 0.5, 2.)

References a, b, calibrate::c, e(), VERIFY, and VERIFY_IS_EQUAL.

Referenced by EIGEN_DECLARE_TEST().

◆ test_concat()

static void test_concat ( )
static
307  {
308  VERIFY(
310  VERIFY(
318 
327 
336 
345 }
type
Definition: compute_granudrum_aor.py:141
Definition: MoreMeta.h:87
Definition: MoreMeta.h:99
Definition: MoreMeta.h:33

References compute_granudrum_aor::type, Eigen::value, and VERIFY.

Referenced by EIGEN_DECLARE_TEST().

◆ test_contained_in_list()

◆ test_gen_numeric_list()

static void test_gen_numeric_list ( )
static
255  {
261 
268 
275 
282 
286  VERIFY(
290 
298 
305 }
Definition: MoreMeta.h:55

References Eigen::value, and VERIFY.

Referenced by EIGEN_DECLARE_TEST().

◆ test_get()

static void test_get ( )
static
389  {
392 
399 
406 }
Definition: MoreMeta.h:202
Definition: meta.cpp:170
Definition: meta.cpp:171
Definition: meta.cpp:172

References Eigen::value, VERIFY, and VERIFY_IS_EQUAL.

Referenced by EIGEN_DECLARE_TEST().

◆ test_id()

static void test_id ( )
static
424  {
425  // don't call VERIFY here, just assume it works if it compiles
426  // (otherwise it will complain that it can't find the function)
427  test_id_numeric<1, 4, 6>();
428  test_id_type<dummy_a, dummy_b, dummy_c>();
429 }

Referenced by EIGEN_DECLARE_TEST().

◆ test_id_helper()

static void test_id_helper ( dummy_a  a,
dummy_a  b,
dummy_a  c 
)
static
408  {
409  (void)a;
410  (void)b;
411  (void)c;
412 }

References a, b, and calibrate::c.

Referenced by test_id_numeric(), and test_id_type().

◆ test_id_numeric()

template<int... ii>
static void test_id_numeric ( )
static
415  {
417 }
static void test_id_helper(dummy_a a, dummy_a b, dummy_a c)
Definition: meta.cpp:408
Definition: MoreMeta.h:226

References test_id_helper().

◆ test_id_type()

template<typename... tt>
static void test_id_type ( )
static
420  {
422 }
Definition: MoreMeta.h:230

References test_id_helper().

◆ test_is_same_gf()

static void test_is_same_gf ( )
static

◆ test_slice()

static void test_slice ( )
static
347  {
350 
358 
366 
374 
382 
387 }
Definition: MoreMeta.h:192
Definition: MoreMeta.h:197
Definition: MoreMeta.h:112

References Eigen::value, and VERIFY.

Referenced by EIGEN_DECLARE_TEST().