meta.cpp
Go to the documentation of this file.
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
5 //
6 // This Source Code Form is subject to the terms of the Mozilla
7 // Public License v. 2.0. If a copy of the MPL was not distributed
8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 
10 #include "main.h"
11 
12 template<typename From, typename To>
13 bool check_is_convertible(const From&, const To&)
14 {
16 }
17 
18 struct FooReturnType {
19  typedef int ReturnType;
20 };
21 
22 struct MyInterface {
23  virtual void func() = 0;
24  virtual ~MyInterface() {}
25 };
26 struct MyImpl : public MyInterface {
27  void func() {}
28 };
29 
31 {
32  VERIFY((internal::conditional<(3<4),internal::true_type, internal::false_type>::type::value));
37 
38  VERIFY(( internal::is_same<float,internal::remove_all<const float&>::type >::value));
39  VERIFY(( internal::is_same<float,internal::remove_all<const float*>::type >::value));
40  VERIFY(( internal::is_same<float,internal::remove_all<const float*&>::type >::value));
41  VERIFY(( internal::is_same<float,internal::remove_all<float**>::type >::value));
42  VERIFY(( internal::is_same<float,internal::remove_all<float**&>::type >::value));
43  VERIFY(( internal::is_same<float,internal::remove_all<float* const *&>::type >::value));
44  VERIFY(( internal::is_same<float,internal::remove_all<float* const>::type >::value));
45 
46  // test add_const
47  VERIFY(( internal::is_same< internal::add_const<float>::type, const float >::value));
48  VERIFY(( internal::is_same< internal::add_const<float*>::type, float* const>::value));
49  VERIFY(( internal::is_same< internal::add_const<float const*>::type, float const* const>::value));
50  VERIFY(( internal::is_same< internal::add_const<float&>::type, float& >::value));
51 
52  // test remove_const
53  VERIFY(( internal::is_same< internal::remove_const<float const* const>::type, float const* >::value));
54  VERIFY(( internal::is_same< internal::remove_const<float const*>::type, float const* >::value));
55  VERIFY(( internal::is_same< internal::remove_const<float* const>::type, float* >::value));
56 
57  // test add_const_on_value_type
58  VERIFY(( internal::is_same< internal::add_const_on_value_type<float&>::type, float const& >::value));
59  VERIFY(( internal::is_same< internal::add_const_on_value_type<float*>::type, float const* >::value));
60 
61  VERIFY(( internal::is_same< internal::add_const_on_value_type<float>::type, const float >::value));
62  VERIFY(( internal::is_same< internal::add_const_on_value_type<const float>::type, const float >::value));
63 
64  VERIFY(( internal::is_same< internal::add_const_on_value_type<const float* const>::type, const float* const>::value));
65  VERIFY(( internal::is_same< internal::add_const_on_value_type<float* const>::type, const float* const>::value));
66 
67  VERIFY(( internal::is_same<float,internal::remove_reference<float&>::type >::value));
68  VERIFY(( internal::is_same<const float,internal::remove_reference<const float&>::type >::value));
69  VERIFY(( internal::is_same<float,internal::remove_pointer<float*>::type >::value));
70  VERIFY(( internal::is_same<const float,internal::remove_pointer<const float*>::type >::value));
71  VERIFY(( internal::is_same<float,internal::remove_pointer<float* const >::type >::value));
72 
73 
74  // is_convertible
80  STATIC_CHECK(( internal::is_convertible<double,std::complex<double> >::value ));
81  STATIC_CHECK((!internal::is_convertible<std::complex<double>,double>::value ));
91 
94 
95  //STATIC_CHECK((!internal::is_convertible<Matrix3f,Matrix3d>::value )); //does not even compile because the conversion is prevented by a static assertion
98  {
99  float f = 0.0f;
100  MatrixXf A, B;
101  VectorXf a, b;
102  VERIFY(( check_is_convertible(a.dot(b), f) ));
103  VERIFY(( check_is_convertible(a.transpose()*b, f) ));
106  }
107 
108  #if (EIGEN_COMP_GNUC && EIGEN_COMP_GNUC <= 99) \
109  || (EIGEN_COMP_CLANG && EIGEN_COMP_CLANG <= 909) \
110  || (EIGEN_COMP_MSVC && EIGEN_COMP_MSVC <=1914)
111  // See http://eigen.tuxfamily.org/bz/show_bug.cgi?id=1752,
112  // basically, a fix in the c++ standard breaks our c++98 implementation
113  // of is_convertible for abstract classes.
114  // So the following tests are expected to fail with recent compilers.
115 
117  #if (!EIGEN_COMP_GNUC_STRICT) || (EIGEN_GNUC_AT_LEAST(4,8))
118  // GCC prior to 4.8 fails to compile this test:
119  // error: cannot allocate an object of abstract type 'MyInterface'
120  // In other word, it does not obey SFINAE.
121  // Nevertheless, we don't really care about supporting abstract type as scalar type!
123  #endif
125 
126  #endif
127 
128  {
129  int i = 0;
130  VERIFY(( check_is_convertible(fix<3>(), i) ));
131  VERIFY((!check_is_convertible(i, fix<DynamicIndex>()) ));
132  }
133 
134 
136  VERIFY(( internal::has_ReturnType<ScalarBinaryOpTraits<int,int> >::value ));
139 
141  #define VERIFY_META_SQRT(X) VERIFY(internal::meta_sqrt<X>::ret == int(std::sqrt(double(X))))
142  VERIFY_META_SQRT(2);
143  VERIFY_META_SQRT(3);
144  VERIFY_META_SQRT(4);
145  VERIFY_META_SQRT(5);
146  VERIFY_META_SQRT(6);
147  VERIFY_META_SQRT(8);
148  VERIFY_META_SQRT(9);
149  VERIFY_META_SQRT(15);
150  VERIFY_META_SQRT(16);
151  VERIFY_META_SQRT(17);
152  VERIFY_META_SQRT(255);
153  VERIFY_META_SQRT(256);
154  VERIFY_META_SQRT(257);
155  VERIFY_META_SQRT(1023);
156  VERIFY_META_SQRT(1024);
157  VERIFY_META_SQRT(1025);
158 }
MyInterface::func
virtual void func()=0
B
Matrix< SCALARB, Dynamic, Dynamic, opt_B > B
Definition: bench_gemm.cpp:49
gtsam.examples.DogLegOptimizerExample.type
type
Definition: DogLegOptimizerExample.py:111
MyInterface
Definition: meta.cpp:22
b
Scalar * b
Definition: benchVecAdd.cpp:17
ret
DenseIndex ret
Definition: level1_cplx_impl.h:44
Eigen::ScalarBinaryOpTraits
Determines whether the given binary operation of two numeric types is allowed and what the scalar ret...
Definition: XprHelper.h:801
A
Matrix< SCALARA, Dynamic, Dynamic, opt_A > A
Definition: bench_gemm.cpp:48
FooReturnType
Definition: meta.cpp:18
FooReturnType::ReturnType
int ReturnType
Definition: meta.cpp:19
MyInterface::~MyInterface
virtual ~MyInterface()
Definition: meta.cpp:24
EIGEN_DECLARE_TEST
EIGEN_DECLARE_TEST(meta)
Definition: meta.cpp:30
Eigen::Triplet< double >
check_is_convertible
bool check_is_convertible(const From &, const To &)
Definition: meta.cpp:13
MyImpl::func
void func()
Definition: meta.cpp:27
VERIFY_META_SQRT
#define VERIFY_META_SQRT(X)
tree::f
Point2(* f)(const Point3 &, OptionalJacobian< 2, 3 >)
Definition: testExpression.cpp:218
a
ArrayXXi a
Definition: Array_initializer_list_23_cxx11.cpp:1
main.h
Eigen::internal::remove_pointer::type
T type
Definition: Meta.h:117
MyImpl
Definition: meta.cpp:26
test_callbacks.value
value
Definition: test_callbacks.py:160
i
int i
Definition: BiCGSTAB_step_by_step.cpp:9
STATIC_CHECK
#define STATIC_CHECK(COND)
Definition: main.h:397
VERIFY
#define VERIFY(a)
Definition: main.h:380


gtsam
Author(s):
autogenerated on Sat Nov 16 2024 04:03:10