Cycles: svn merge -r41225:41232 ^/trunk/blender
[blender.git] / extern / Eigen2 / Eigen / src / Core / util / Macros.h
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra. Eigen itself is part of the KDE project.
3 //
4 // Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>
5 // Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>
6 //
7 // Eigen is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU Lesser General Public
9 // License as published by the Free Software Foundation; either
10 // version 3 of the License, or (at your option) any later version.
11 //
12 // Alternatively, you can redistribute it and/or
13 // modify it under the terms of the GNU General Public License as
14 // published by the Free Software Foundation; either version 2 of
15 // the License, or (at your option) any later version.
16 //
17 // Eigen is distributed in the hope that it will be useful, but WITHOUT ANY
18 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
19 // FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the
20 // GNU General Public License for more details.
21 //
22 // You should have received a copy of the GNU Lesser General Public
23 // License and a copy of the GNU General Public License along with
24 // Eigen. If not, see <http://www.gnu.org/licenses/>.
25
26 #ifndef EIGEN_MACROS_H
27 #define EIGEN_MACROS_H
28
29 #undef minor
30
31 #define EIGEN_WORLD_VERSION 2
32 #define EIGEN_MAJOR_VERSION 0
33 #define EIGEN_MINOR_VERSION 6
34
35 #define EIGEN_VERSION_AT_LEAST(x,y,z) (EIGEN_WORLD_VERSION>x || (EIGEN_WORLD_VERSION>=x && \
36                                       (EIGEN_MAJOR_VERSION>y || (EIGEN_MAJOR_VERSION>=y && \
37                                                                  EIGEN_MINOR_VERSION>=z))))
38
39 // 16 byte alignment is only useful for vectorization. Since it affects the ABI, we need to enable 16 byte alignment on all
40 // platforms where vectorization might be enabled. In theory we could always enable alignment, but it can be a cause of problems
41 // on some platforms, so we just disable it in certain common platform (compiler+architecture combinations) to avoid these problems.
42 #if defined(__GNUC__) && !(defined(__i386__) || defined(__x86_64__) || defined(__powerpc__) || defined(__ia64__) || defined(__ppc__))
43 #define EIGEN_GCC_AND_ARCH_DOESNT_WANT_ALIGNMENT 1
44 #else
45 #define EIGEN_GCC_AND_ARCH_DOESNT_WANT_ALIGNMENT 0
46 #endif
47
48 #if defined(__GNUC__) && (__GNUC__ <= 3)
49 #define EIGEN_GCC3_OR_OLDER 1
50 #else
51 #define EIGEN_GCC3_OR_OLDER 0
52 #endif
53
54 // FIXME vectorization + alignment is completely disabled with sun studio
55 #if !EIGEN_GCC_AND_ARCH_DOESNT_WANT_ALIGNMENT && !EIGEN_GCC3_OR_OLDER && !defined(__SUNPRO_CC)
56   #define EIGEN_ARCH_WANTS_ALIGNMENT 1
57 #else
58   #define EIGEN_ARCH_WANTS_ALIGNMENT 0
59 #endif
60
61 // EIGEN_ALIGN is the true test whether we want to align or not. It takes into account both the user choice to explicitly disable
62 // alignment (EIGEN_DONT_ALIGN) and the architecture config (EIGEN_ARCH_WANTS_ALIGNMENT). Henceforth, only EIGEN_ALIGN should be used.
63 #if EIGEN_ARCH_WANTS_ALIGNMENT && !defined(EIGEN_DONT_ALIGN)
64   #define EIGEN_ALIGN 1
65 #else
66   #define EIGEN_ALIGN 0
67   #ifdef EIGEN_VECTORIZE
68     #error "Vectorization enabled, but our platform checks say that we don't do 16 byte alignment on this platform. If you added vectorization for another architecture, you also need to edit this platform check."
69   #endif
70   #ifndef EIGEN_DISABLE_UNALIGNED_ARRAY_ASSERT
71     #define EIGEN_DISABLE_UNALIGNED_ARRAY_ASSERT
72   #endif
73 #endif
74
75 #ifdef EIGEN_DEFAULT_TO_ROW_MAJOR
76 #define EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION RowMajor
77 #else
78 #define EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION ColMajor
79 #endif
80
81 /** \internal  Defines the maximal loop size to enable meta unrolling of loops.
82   *            Note that the value here is expressed in Eigen's own notion of "number of FLOPS",
83   *            it does not correspond to the number of iterations or the number of instructions
84   */
85 #ifndef EIGEN_UNROLLING_LIMIT
86 #define EIGEN_UNROLLING_LIMIT 100
87 #endif
88
89 /** \internal Define the maximal size in Bytes of blocks fitting in CPU cache.
90   * The current value is set to generate blocks of 256x256 for float
91   *
92   * Typically for a single-threaded application you would set that to 25% of the size of your CPU caches in bytes
93   */
94 #ifndef EIGEN_TUNE_FOR_CPU_CACHE_SIZE
95 #define EIGEN_TUNE_FOR_CPU_CACHE_SIZE (sizeof(float)*256*256)
96 #endif
97
98 // FIXME this should go away quickly
99 #ifdef EIGEN_TUNE_FOR_L2_CACHE_SIZE
100 #error EIGEN_TUNE_FOR_L2_CACHE_SIZE is now called EIGEN_TUNE_FOR_CPU_CACHE_SIZE.
101 #endif
102
103 #define USING_PART_OF_NAMESPACE_EIGEN \
104 EIGEN_USING_MATRIX_TYPEDEFS \
105 using Eigen::Matrix; \
106 using Eigen::MatrixBase; \
107 using Eigen::ei_random; \
108 using Eigen::ei_real; \
109 using Eigen::ei_imag; \
110 using Eigen::ei_conj; \
111 using Eigen::ei_abs; \
112 using Eigen::ei_abs2; \
113 using Eigen::ei_sqrt; \
114 using Eigen::ei_exp; \
115 using Eigen::ei_log; \
116 using Eigen::ei_sin; \
117 using Eigen::ei_cos;
118
119 #ifdef NDEBUG
120 # ifndef EIGEN_NO_DEBUG
121 #  define EIGEN_NO_DEBUG
122 # endif
123 #endif
124
125 #ifndef ei_assert
126 #ifdef EIGEN_NO_DEBUG
127 #define ei_assert(x)
128 #else
129 #define ei_assert(x) assert(x)
130 #endif
131 #endif
132
133 #ifdef EIGEN_INTERNAL_DEBUGGING
134 #define ei_internal_assert(x) ei_assert(x)
135 #else
136 #define ei_internal_assert(x)
137 #endif
138
139 #ifdef EIGEN_NO_DEBUG
140 #define EIGEN_ONLY_USED_FOR_DEBUG(x) (void)x
141 #else
142 #define EIGEN_ONLY_USED_FOR_DEBUG(x)
143 #endif
144
145 // EIGEN_ALWAYS_INLINE_ATTRIB should be use in the declaration of function
146 // which should be inlined even in debug mode.
147 // FIXME with the always_inline attribute,
148 // gcc 3.4.x reports the following compilation error:
149 //   Eval.h:91: sorry, unimplemented: inlining failed in call to 'const Eigen::Eval<Derived> Eigen::MatrixBase<Scalar, Derived>::eval() const'
150 //    : function body not available
151 #if EIGEN_GNUC_AT_LEAST(4,0)
152 #define EIGEN_ALWAYS_INLINE_ATTRIB __attribute__((always_inline))
153 #else
154 #define EIGEN_ALWAYS_INLINE_ATTRIB
155 #endif
156
157 // EIGEN_FORCE_INLINE means "inline as much as possible"
158 #if (defined _MSC_VER)
159 #define EIGEN_STRONG_INLINE __forceinline
160 #else
161 #define EIGEN_STRONG_INLINE inline
162 #endif
163
164 #if (defined __GNUC__)
165 #define EIGEN_DONT_INLINE __attribute__((noinline))
166 #elif (defined _MSC_VER)
167 #define EIGEN_DONT_INLINE __declspec(noinline)
168 #else
169 #define EIGEN_DONT_INLINE
170 #endif
171
172 #if (defined __GNUC__)
173 #define EIGEN_DEPRECATED __attribute__((deprecated))
174 #elif (defined _MSC_VER)
175 #define EIGEN_DEPRECATED __declspec(deprecated)
176 #else
177 #define EIGEN_DEPRECATED
178 #endif
179
180 /* EIGEN_ALIGN_128 forces data to be 16-byte aligned, EVEN if vectorization (EIGEN_VECTORIZE) is disabled,
181  * so that vectorization doesn't affect binary compatibility.
182  *
183  * If we made alignment depend on whether or not EIGEN_VECTORIZE is defined, it would be impossible to link
184  * vectorized and non-vectorized code.
185  */
186 #if !EIGEN_ALIGN
187 #define EIGEN_ALIGN_128
188 #elif (defined __GNUC__)
189 #define EIGEN_ALIGN_128 __attribute__((aligned(16)))
190 #elif (defined _MSC_VER)
191 #define EIGEN_ALIGN_128 __declspec(align(16))
192 #else
193 #error Please tell me what is the equivalent of __attribute__((aligned(16))) for your compiler
194 #endif
195
196 #ifdef EIGEN_DONT_USE_RESTRICT_KEYWORD
197   #define EIGEN_RESTRICT
198 #endif
199 #ifndef EIGEN_RESTRICT
200   #define EIGEN_RESTRICT __restrict
201 #endif
202
203 #ifndef EIGEN_STACK_ALLOCATION_LIMIT
204 #define EIGEN_STACK_ALLOCATION_LIMIT 1000000
205 #endif
206
207 #ifndef EIGEN_DEFAULT_IO_FORMAT
208 #define EIGEN_DEFAULT_IO_FORMAT Eigen::IOFormat()
209 #endif
210
211 // format used in Eigen's documentation
212 // needed to define it here as escaping characters in CMake add_definition's argument seems very problematic.
213 #define EIGEN_DOCS_IO_FORMAT IOFormat(3, AlignCols, " ", "\n", "", "")
214
215 #define EIGEN_INHERIT_ASSIGNMENT_OPERATOR(Derived, Op) \
216 template<typename OtherDerived> \
217 EIGEN_STRONG_INLINE Derived& operator Op(const Eigen::MatrixBase<OtherDerived>& other) \
218 { \
219   return Base::operator Op(other.derived()); \
220 } \
221 EIGEN_STRONG_INLINE Derived& operator Op(const Derived& other) \
222 { \
223   return Base::operator Op(other); \
224 }
225
226 #define EIGEN_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(Derived, Op) \
227 template<typename Other> \
228 EIGEN_STRONG_INLINE Derived& operator Op(const Other& scalar) \
229 { \
230   return Base::operator Op(scalar); \
231 }
232
233 #define EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Derived) \
234 EIGEN_INHERIT_ASSIGNMENT_OPERATOR(Derived, =) \
235 EIGEN_INHERIT_ASSIGNMENT_OPERATOR(Derived, +=) \
236 EIGEN_INHERIT_ASSIGNMENT_OPERATOR(Derived, -=) \
237 EIGEN_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(Derived, *=) \
238 EIGEN_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(Derived, /=)
239
240 #define _EIGEN_GENERIC_PUBLIC_INTERFACE(Derived, BaseClass) \
241 typedef BaseClass Base; \
242 typedef typename Eigen::ei_traits<Derived>::Scalar Scalar; \
243 typedef typename Eigen::NumTraits<Scalar>::Real RealScalar; \
244 typedef typename Base::PacketScalar PacketScalar; \
245 typedef typename Eigen::ei_nested<Derived>::type Nested; \
246 enum { RowsAtCompileTime = Eigen::ei_traits<Derived>::RowsAtCompileTime, \
247        ColsAtCompileTime = Eigen::ei_traits<Derived>::ColsAtCompileTime, \
248        MaxRowsAtCompileTime = Eigen::ei_traits<Derived>::MaxRowsAtCompileTime, \
249        MaxColsAtCompileTime = Eigen::ei_traits<Derived>::MaxColsAtCompileTime, \
250        Flags = Eigen::ei_traits<Derived>::Flags, \
251        CoeffReadCost = Eigen::ei_traits<Derived>::CoeffReadCost, \
252        SizeAtCompileTime = Base::SizeAtCompileTime, \
253        MaxSizeAtCompileTime = Base::MaxSizeAtCompileTime, \
254        IsVectorAtCompileTime = Base::IsVectorAtCompileTime };
255
256 #define EIGEN_GENERIC_PUBLIC_INTERFACE(Derived) \
257 _EIGEN_GENERIC_PUBLIC_INTERFACE(Derived, Eigen::MatrixBase<Derived>)
258
259 #define EIGEN_ENUM_MIN(a,b) (((int)a <= (int)b) ? (int)a : (int)b)
260 #define EIGEN_ENUM_MAX(a,b) (((int)a >= (int)b) ? (int)a : (int)b)
261
262 // just an empty macro !
263 #define EIGEN_EMPTY
264
265 // concatenate two tokens
266 #define EIGEN_CAT2(a,b) a ## b
267 #define EIGEN_CAT(a,b) EIGEN_CAT2(a,b)
268
269 // convert a token to a string
270 #define EIGEN_MAKESTRING2(a) #a
271 #define EIGEN_MAKESTRING(a) EIGEN_MAKESTRING2(a)
272
273 #endif // EIGEN_MACROS_H