Main Page
Related Pages
Modules
Namespaces
Classes
Files
File List
File Members
external_packages
eigen3
Eigen
src
Core
util
StaticAssert.h
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
// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>
6
//
7
// This Source Code Form is subject to the terms of the Mozilla
8
// Public License v. 2.0. If a copy of the MPL was not distributed
9
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10
11
#ifndef EIGEN_STATIC_ASSERT_H
12
#define EIGEN_STATIC_ASSERT_H
13
14
/* Some notes on Eigen's static assertion mechanism:
15
*
16
* - in EIGEN_STATIC_ASSERT(CONDITION,MSG) the parameter CONDITION must be a compile time boolean
17
* expression, and MSG an enum listed in struct internal::static_assertion<true>
18
*
19
* - define EIGEN_NO_STATIC_ASSERT to disable them (and save compilation time)
20
* in that case, the static assertion is converted to the following runtime assert:
21
* eigen_assert(CONDITION && "MSG")
22
*
23
* - currently EIGEN_STATIC_ASSERT can only be used in function scope
24
*
25
*/
26
27
#ifndef EIGEN_NO_STATIC_ASSERT
28
29
#if defined(__GXX_EXPERIMENTAL_CXX0X__) || (defined(_MSC_VER) && (_MSC_VER >= 1600))
30
31
// if native static_assert is enabled, let's use it
32
#define EIGEN_STATIC_ASSERT(X,MSG) static_assert(X,#MSG);
33
34
#else // not CXX0X
35
36
namespace
Eigen
{
37
38
namespace
internal
{
39
40
template
<
bool
condition>
41
struct
static_assertion
{};
42
43
template
<>
44
struct
static_assertion
<true>
45
{
46
enum
{
47
YOU_TRIED_CALLING_A_VECTOR_METHOD_ON_A_MATRIX
,
48
YOU_MIXED_VECTORS_OF_DIFFERENT_SIZES
,
49
YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES
,
50
THIS_METHOD_IS_ONLY_FOR_VECTORS_OF_A_SPECIFIC_SIZE
,
51
THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE
,
52
THIS_METHOD_IS_ONLY_FOR_OBJECTS_OF_A_SPECIFIC_SIZE
,
53
YOU_MADE_A_PROGRAMMING_MISTAKE
,
54
EIGEN_INTERNAL_ERROR_PLEASE_FILE_A_BUG_REPORT
,
55
EIGEN_INTERNAL_COMPILATION_ERROR_OR_YOU_MADE_A_PROGRAMMING_MISTAKE
,
56
YOU_CALLED_A_FIXED_SIZE_METHOD_ON_A_DYNAMIC_SIZE_MATRIX_OR_VECTOR
,
57
YOU_CALLED_A_DYNAMIC_SIZE_METHOD_ON_A_FIXED_SIZE_MATRIX_OR_VECTOR
,
58
UNALIGNED_LOAD_AND_STORE_OPERATIONS_UNIMPLEMENTED_ON_ALTIVEC
,
59
THIS_FUNCTION_IS_NOT_FOR_INTEGER_NUMERIC_TYPES
,
60
FLOATING_POINT_ARGUMENT_PASSED__INTEGER_WAS_EXPECTED
,
61
NUMERIC_TYPE_MUST_BE_REAL
,
62
COEFFICIENT_WRITE_ACCESS_TO_SELFADJOINT_NOT_SUPPORTED
,
63
WRITING_TO_TRIANGULAR_PART_WITH_UNIT_DIAGONAL_IS_NOT_SUPPORTED
,
64
THIS_METHOD_IS_ONLY_FOR_FIXED_SIZE
,
65
INVALID_MATRIX_PRODUCT
,
66
INVALID_VECTOR_VECTOR_PRODUCT__IF_YOU_WANTED_A_DOT_OR_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTIONS
,
67
INVALID_MATRIX_PRODUCT__IF_YOU_WANTED_A_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTION
,
68
YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY
,
69
THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES
,
70
THIS_METHOD_IS_ONLY_FOR_ROW_MAJOR_MATRICES
,
71
INVALID_MATRIX_TEMPLATE_PARAMETERS
,
72
INVALID_MATRIXBASE_TEMPLATE_PARAMETERS
,
73
BOTH_MATRICES_MUST_HAVE_THE_SAME_STORAGE_ORDER
,
74
THIS_METHOD_IS_ONLY_FOR_DIAGONAL_MATRIX
,
75
THE_MATRIX_OR_EXPRESSION_THAT_YOU_PASSED_DOES_NOT_HAVE_THE_EXPECTED_TYPE
,
76
THIS_METHOD_IS_ONLY_FOR_EXPRESSIONS_WITH_DIRECT_MEMORY_ACCESS_SUCH_AS_MAP_OR_PLAIN_MATRICES
,
77
YOU_ALREADY_SPECIFIED_THIS_STRIDE
,
78
INVALID_STORAGE_ORDER_FOR_THIS_VECTOR_EXPRESSION
,
79
THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD
,
80
PACKET_ACCESS_REQUIRES_TO_HAVE_INNER_STRIDE_FIXED_TO_1
,
81
THIS_METHOD_IS_ONLY_FOR_SPECIFIC_TRANSFORMATIONS
,
82
YOU_CANNOT_MIX_ARRAYS_AND_MATRICES
,
83
YOU_PERFORMED_AN_INVALID_TRANSFORMATION_CONVERSION
,
84
THIS_EXPRESSION_IS_NOT_A_LVALUE__IT_IS_READ_ONLY
,
85
YOU_ARE_TRYING_TO_USE_AN_INDEX_BASED_ACCESSOR_ON_AN_EXPRESSION_THAT_DOES_NOT_SUPPORT_THAT
,
86
THIS_METHOD_IS_ONLY_FOR_1x1_EXPRESSIONS
,
87
THIS_METHOD_IS_ONLY_FOR_EXPRESSIONS_OF_BOOL
,
88
THIS_METHOD_IS_ONLY_FOR_ARRAYS_NOT_MATRICES
,
89
YOU_PASSED_A_ROW_VECTOR_BUT_A_COLUMN_VECTOR_WAS_EXPECTED
,
90
YOU_PASSED_A_COLUMN_VECTOR_BUT_A_ROW_VECTOR_WAS_EXPECTED
,
91
THE_INDEX_TYPE_MUST_BE_A_SIGNED_TYPE
,
92
THE_STORAGE_ORDER_OF_BOTH_SIDES_MUST_MATCH
,
93
OBJECT_ALLOCATED_ON_STACK_IS_TOO_BIG
94
};
95
};
96
97
}
// end namespace internal
98
99
}
// end namespace Eigen
100
101
// Specialized implementation for MSVC to avoid "conditional
102
// expression is constant" warnings. This implementation doesn't
103
// appear to work under GCC, hence the multiple implementations.
104
#ifdef _MSC_VER
105
106
#define EIGEN_STATIC_ASSERT(CONDITION,MSG) \
107
{Eigen::internal::static_assertion<bool(CONDITION)>::MSG;}
108
109
#else
110
111
#define EIGEN_STATIC_ASSERT(CONDITION,MSG) \
112
if (Eigen::internal::static_assertion<bool(CONDITION)>::MSG) {}
113
114
#endif
115
116
#endif // not CXX0X
117
118
#else // EIGEN_NO_STATIC_ASSERT
119
120
#define EIGEN_STATIC_ASSERT(CONDITION,MSG) eigen_assert((CONDITION) && #MSG);
121
122
#endif // EIGEN_NO_STATIC_ASSERT
123
124
125
// static assertion failing if the type \a TYPE is not a vector type
126
#define EIGEN_STATIC_ASSERT_VECTOR_ONLY(TYPE) \
127
EIGEN_STATIC_ASSERT(TYPE::IsVectorAtCompileTime, \
128
YOU_TRIED_CALLING_A_VECTOR_METHOD_ON_A_MATRIX)
129
130
// static assertion failing if the type \a TYPE is not fixed-size
131
#define EIGEN_STATIC_ASSERT_FIXED_SIZE(TYPE) \
132
EIGEN_STATIC_ASSERT(TYPE::SizeAtCompileTime!=Eigen::Dynamic, \
133
YOU_CALLED_A_FIXED_SIZE_METHOD_ON_A_DYNAMIC_SIZE_MATRIX_OR_VECTOR)
134
135
// static assertion failing if the type \a TYPE is not dynamic-size
136
#define EIGEN_STATIC_ASSERT_DYNAMIC_SIZE(TYPE) \
137
EIGEN_STATIC_ASSERT(TYPE::SizeAtCompileTime==Eigen::Dynamic, \
138
YOU_CALLED_A_DYNAMIC_SIZE_METHOD_ON_A_FIXED_SIZE_MATRIX_OR_VECTOR)
139
140
// static assertion failing if the type \a TYPE is not a vector type of the given size
141
#define EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(TYPE, SIZE) \
142
EIGEN_STATIC_ASSERT(TYPE::IsVectorAtCompileTime && TYPE::SizeAtCompileTime==SIZE, \
143
THIS_METHOD_IS_ONLY_FOR_VECTORS_OF_A_SPECIFIC_SIZE)
144
145
// static assertion failing if the type \a TYPE is not a vector type of the given size
146
#define EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(TYPE, ROWS, COLS) \
147
EIGEN_STATIC_ASSERT(TYPE::RowsAtCompileTime==ROWS && TYPE::ColsAtCompileTime==COLS, \
148
THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE)
149
150
// static assertion failing if the two vector expression types are not compatible (same fixed-size or dynamic size)
151
#define EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(TYPE0,TYPE1) \
152
EIGEN_STATIC_ASSERT( \
153
(int(TYPE0::SizeAtCompileTime)==Eigen::Dynamic \
154
|| int(TYPE1::SizeAtCompileTime)==Eigen::Dynamic \
155
|| int(TYPE0::SizeAtCompileTime)==int(TYPE1::SizeAtCompileTime)),\
156
YOU_MIXED_VECTORS_OF_DIFFERENT_SIZES)
157
158
#define EIGEN_PREDICATE_SAME_MATRIX_SIZE(TYPE0,TYPE1) \
159
( \
160
(int(TYPE0::SizeAtCompileTime)==0 && int(TYPE1::SizeAtCompileTime)==0) \
161
|| (\
162
(int(TYPE0::RowsAtCompileTime)==Eigen::Dynamic \
163
|| int(TYPE1::RowsAtCompileTime)==Eigen::Dynamic \
164
|| int(TYPE0::RowsAtCompileTime)==int(TYPE1::RowsAtCompileTime)) \
165
&& (int(TYPE0::ColsAtCompileTime)==Eigen::Dynamic \
166
|| int(TYPE1::ColsAtCompileTime)==Eigen::Dynamic \
167
|| int(TYPE0::ColsAtCompileTime)==int(TYPE1::ColsAtCompileTime))\
168
) \
169
)
170
171
#ifdef EIGEN2_SUPPORT
172
#define EIGEN_STATIC_ASSERT_NON_INTEGER(TYPE) \
173
eigen_assert(!NumTraits<Scalar>::IsInteger);
174
#else
175
#define EIGEN_STATIC_ASSERT_NON_INTEGER(TYPE) \
176
EIGEN_STATIC_ASSERT(!NumTraits<TYPE>::IsInteger, THIS_FUNCTION_IS_NOT_FOR_INTEGER_NUMERIC_TYPES)
177
#endif
178
179
180
// static assertion failing if it is guaranteed at compile-time that the two matrix expression types have different sizes
181
#define EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(TYPE0,TYPE1) \
182
EIGEN_STATIC_ASSERT( \
183
EIGEN_PREDICATE_SAME_MATRIX_SIZE(TYPE0,TYPE1),\
184
YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES)
185
186
#define EIGEN_STATIC_ASSERT_SIZE_1x1(TYPE) \
187
EIGEN_STATIC_ASSERT((TYPE::RowsAtCompileTime == 1 || TYPE::RowsAtCompileTime == Dynamic) && \
188
(TYPE::ColsAtCompileTime == 1 || TYPE::ColsAtCompileTime == Dynamic), \
189
THIS_METHOD_IS_ONLY_FOR_1x1_EXPRESSIONS)
190
191
#define EIGEN_STATIC_ASSERT_LVALUE(Derived) \
192
EIGEN_STATIC_ASSERT(internal::is_lvalue<Derived>::value, \
193
THIS_EXPRESSION_IS_NOT_A_LVALUE__IT_IS_READ_ONLY)
194
195
#define EIGEN_STATIC_ASSERT_ARRAYXPR(Derived) \
196
EIGEN_STATIC_ASSERT((internal::is_same<typename internal::traits<Derived>::XprKind, ArrayXpr>::value), \
197
THIS_METHOD_IS_ONLY_FOR_ARRAYS_NOT_MATRICES)
198
199
#define EIGEN_STATIC_ASSERT_SAME_XPR_KIND(Derived1, Derived2) \
200
EIGEN_STATIC_ASSERT((internal::is_same<typename internal::traits<Derived1>::XprKind, \
201
typename internal::traits<Derived2>::XprKind \
202
>::value), \
203
YOU_CANNOT_MIX_ARRAYS_AND_MATRICES)
204
205
206
#endif // EIGEN_STATIC_ASSERT_H
Eigen::internal::static_assertion< true >::THIS_METHOD_IS_ONLY_FOR_OBJECTS_OF_A_SPECIFIC_SIZE
Definition:
StaticAssert.h:52
Eigen::internal::static_assertion< true >::YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY
Definition:
StaticAssert.h:68
Eigen::internal::static_assertion< true >::UNALIGNED_LOAD_AND_STORE_OPERATIONS_UNIMPLEMENTED_ON_ALTIVEC
Definition:
StaticAssert.h:58
Eigen::internal::static_assertion< true >::YOU_MADE_A_PROGRAMMING_MISTAKE
Definition:
StaticAssert.h:53
Eigen::internal::static_assertion< true >::YOU_PASSED_A_COLUMN_VECTOR_BUT_A_ROW_VECTOR_WAS_EXPECTED
Definition:
StaticAssert.h:90
Eigen::internal::static_assertion< true >::YOU_ALREADY_SPECIFIED_THIS_STRIDE
Definition:
StaticAssert.h:77
Eigen::internal::static_assertion< true >::INVALID_STORAGE_ORDER_FOR_THIS_VECTOR_EXPRESSION
Definition:
StaticAssert.h:78
Eigen::internal::static_assertion< true >::PACKET_ACCESS_REQUIRES_TO_HAVE_INNER_STRIDE_FIXED_TO_1
Definition:
StaticAssert.h:80
Eigen::internal::static_assertion< true >::THIS_METHOD_IS_ONLY_FOR_ROW_MAJOR_MATRICES
Definition:
StaticAssert.h:70
Eigen::internal::static_assertion< true >::YOU_PASSED_A_ROW_VECTOR_BUT_A_COLUMN_VECTOR_WAS_EXPECTED
Definition:
StaticAssert.h:89
Eigen::internal::static_assertion< true >::YOU_ARE_TRYING_TO_USE_AN_INDEX_BASED_ACCESSOR_ON_AN_EXPRESSION_THAT_DOES_NOT_SUPPORT_THAT
Definition:
StaticAssert.h:85
Eigen::internal::static_assertion< true >::THE_STORAGE_ORDER_OF_BOTH_SIDES_MUST_MATCH
Definition:
StaticAssert.h:92
Eigen::internal::static_assertion< true >::BOTH_MATRICES_MUST_HAVE_THE_SAME_STORAGE_ORDER
Definition:
StaticAssert.h:73
Eigen::internal::static_assertion< true >::FLOATING_POINT_ARGUMENT_PASSED__INTEGER_WAS_EXPECTED
Definition:
StaticAssert.h:60
Eigen::internal::static_assertion
Definition:
StaticAssert.h:41
Eigen
iterative scaling algorithm to equilibrate rows and column norms in matrices
Definition:
matrix.hpp:471
Eigen::internal::static_assertion< true >::INVALID_MATRIXBASE_TEMPLATE_PARAMETERS
Definition:
StaticAssert.h:72
Eigen::internal::static_assertion< true >::THIS_METHOD_IS_ONLY_FOR_EXPRESSIONS_WITH_DIRECT_MEMORY_ACCESS_SUCH_AS_MAP_OR_PLAIN_MATRICES
Definition:
StaticAssert.h:76
Eigen::internal::static_assertion< true >::THIS_METHOD_IS_ONLY_FOR_SPECIFIC_TRANSFORMATIONS
Definition:
StaticAssert.h:81
Eigen::internal::static_assertion< true >::THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE
Definition:
StaticAssert.h:51
Eigen::internal::static_assertion< true >::YOU_MIXED_VECTORS_OF_DIFFERENT_SIZES
Definition:
StaticAssert.h:48
Eigen::internal::static_assertion< true >::INVALID_MATRIX_PRODUCT__IF_YOU_WANTED_A_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTION
Definition:
StaticAssert.h:67
Eigen::internal::static_assertion< true >::EIGEN_INTERNAL_ERROR_PLEASE_FILE_A_BUG_REPORT
Definition:
StaticAssert.h:54
Eigen::internal::static_assertion< true >::THIS_METHOD_IS_ONLY_FOR_EXPRESSIONS_OF_BOOL
Definition:
StaticAssert.h:87
Eigen::internal::static_assertion< true >::THIS_METHOD_IS_ONLY_FOR_DIAGONAL_MATRIX
Definition:
StaticAssert.h:74
Eigen::internal::static_assertion< true >::THIS_METHOD_IS_ONLY_FOR_ARRAYS_NOT_MATRICES
Definition:
StaticAssert.h:88
Eigen::internal::static_assertion< true >::THIS_EXPRESSION_IS_NOT_A_LVALUE__IT_IS_READ_ONLY
Definition:
StaticAssert.h:84
Eigen::internal::static_assertion< true >::THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD
Definition:
StaticAssert.h:79
Eigen::internal::static_assertion< true >::NUMERIC_TYPE_MUST_BE_REAL
Definition:
StaticAssert.h:61
Eigen::internal::static_assertion< true >::YOU_CALLED_A_DYNAMIC_SIZE_METHOD_ON_A_FIXED_SIZE_MATRIX_OR_VECTOR
Definition:
StaticAssert.h:57
Eigen::internal::static_assertion< true >::YOU_CALLED_A_FIXED_SIZE_METHOD_ON_A_DYNAMIC_SIZE_MATRIX_OR_VECTOR
Definition:
StaticAssert.h:56
Eigen::internal::static_assertion< true >::INVALID_MATRIX_TEMPLATE_PARAMETERS
Definition:
StaticAssert.h:71
Eigen::internal::static_assertion< true >::THIS_FUNCTION_IS_NOT_FOR_INTEGER_NUMERIC_TYPES
Definition:
StaticAssert.h:59
Eigen::internal::static_assertion< true >::INVALID_VECTOR_VECTOR_PRODUCT__IF_YOU_WANTED_A_DOT_OR_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTIONS
Definition:
StaticAssert.h:66
Eigen::internal::static_assertion< true >::YOU_CANNOT_MIX_ARRAYS_AND_MATRICES
Definition:
StaticAssert.h:82
internal
Definition:
Eigen_Colamd.h:54
Eigen::internal::static_assertion< true >::THIS_METHOD_IS_ONLY_FOR_1x1_EXPRESSIONS
Definition:
StaticAssert.h:86
Eigen::internal::static_assertion< true >::THE_INDEX_TYPE_MUST_BE_A_SIGNED_TYPE
Definition:
StaticAssert.h:91
Eigen::internal::static_assertion< true >::EIGEN_INTERNAL_COMPILATION_ERROR_OR_YOU_MADE_A_PROGRAMMING_MISTAKE
Definition:
StaticAssert.h:55
Eigen::internal::static_assertion< true >::YOU_PERFORMED_AN_INVALID_TRANSFORMATION_CONVERSION
Definition:
StaticAssert.h:83
Eigen::internal::static_assertion< true >::INVALID_MATRIX_PRODUCT
Definition:
StaticAssert.h:65
Eigen::internal::static_assertion< true >::THIS_METHOD_IS_ONLY_FOR_VECTORS_OF_A_SPECIFIC_SIZE
Definition:
StaticAssert.h:50
Eigen::internal::static_assertion< true >::WRITING_TO_TRIANGULAR_PART_WITH_UNIT_DIAGONAL_IS_NOT_SUPPORTED
Definition:
StaticAssert.h:63
Eigen::internal::static_assertion< true >::THE_MATRIX_OR_EXPRESSION_THAT_YOU_PASSED_DOES_NOT_HAVE_THE_EXPECTED_TYPE
Definition:
StaticAssert.h:75
Eigen::internal::static_assertion< true >::THIS_METHOD_IS_ONLY_FOR_FIXED_SIZE
Definition:
StaticAssert.h:64
Eigen::internal::static_assertion< true >::COEFFICIENT_WRITE_ACCESS_TO_SELFADJOINT_NOT_SUPPORTED
Definition:
StaticAssert.h:62
Eigen::internal::static_assertion< true >::THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES
Definition:
StaticAssert.h:69
Eigen::internal::static_assertion< true >::YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES
Definition:
StaticAssert.h:49
Eigen::internal::static_assertion< true >::YOU_TRIED_CALLING_A_VECTOR_METHOD_ON_A_MATRIX
Definition:
StaticAssert.h:47
acado
Author(s): Milan Vukov, Rien Quirynen
autogenerated on Mon Jun 10 2019 12:35:11