// This file is part of Eigen, a lightweight C++ template library // for linear algebra. Eigen itself is part of the KDE project. // // Copyright (C) 2008 Gael Guennebaud // Copyright (C) 2006-2008 Benoit Jacob // // Eigen is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 3 of the License, or (at your option) any later version. // // Alternatively, you can redistribute it and/or // modify it under the terms of the GNU General Public License as // published by the Free Software Foundation; either version 2 of // the License, or (at your option) any later version. // // Eigen is distributed in the hope that it will be useful, but WITHOUT ANY // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS // FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the // GNU General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License and a copy of the GNU General Public License along with // Eigen. If not, see . #ifndef EIGEN_MACROS_H #define EIGEN_MACROS_H #undef minor /** \internal Defines the maximal loop size to enable meta unrolling of loops */ #ifndef EIGEN_UNROLLING_LIMIT #define EIGEN_UNROLLING_LIMIT 100 #endif /** \internal Define the maximal size in Bytes of L2 blocks. * The current value is set to generate blocks of 256x256 for float */ #ifndef EIGEN_TUNE_FOR_L2_CACHE_SIZE #define EIGEN_TUNE_FOR_L2_CACHE_SIZE (1024*256) #endif #define USING_PART_OF_NAMESPACE_EIGEN \ EIGEN_USING_MATRIX_TYPEDEFS \ using Eigen::Matrix; \ using Eigen::MatrixBase; \ using Eigen::ei_random; \ using Eigen::ei_real; \ using Eigen::ei_imag; \ using Eigen::ei_conj; \ using Eigen::ei_abs; \ using Eigen::ei_abs2; \ using Eigen::ei_sqrt; \ using Eigen::ei_exp; \ using Eigen::ei_log; \ using Eigen::ei_sin; \ using Eigen::ei_cos; #ifdef NDEBUG # ifndef EIGEN_NO_DEBUG # define EIGEN_NO_DEBUG # endif #endif #ifndef ei_assert #ifdef EIGEN_NO_DEBUG #define ei_assert(x) #else #define ei_assert(x) assert(x) #endif #endif #ifdef EIGEN_INTERNAL_DEBUGGING #define ei_internal_assert(x) ei_assert(x); #else #define ei_internal_assert(x) #endif #ifdef EIGEN_NO_DEBUG #define EIGEN_ONLY_USED_FOR_DEBUG(x) (void)x #else #define EIGEN_ONLY_USED_FOR_DEBUG(x) #endif // FIXME with the always_inline attribute, // gcc 3.4.x reports the following compilation error: // Eval.h:91: sorry, unimplemented: inlining failed in call to 'const Eigen::Eval Eigen::MatrixBase::eval() const' // : function body not available #if EIGEN_GNUC_AT_LEAST(4,0) #define EIGEN_ALWAYS_INLINE __attribute__((always_inline)) inline #else #define EIGEN_ALWAYS_INLINE inline #endif #if (defined __GNUC__) #define EIGEN_DONT_INLINE __attribute__((noinline)) #else #define EIGEN_DONT_INLINE #endif #if (defined __GNUC__) #define EIGEN_ALIGN_128 __attribute__ ((aligned(16))) #else #define EIGEN_ALIGN_128 #endif #define EIGEN_RESTRICT __restrict #define EIGEN_INHERIT_ASSIGNMENT_OPERATOR(Derived, Op) \ template \ Derived& operator Op(const MatrixBase& other) \ { \ return Eigen::MatrixBase::operator Op(other.derived()); \ } \ Derived& operator Op(const Derived& other) \ { \ return Eigen::MatrixBase::operator Op(other); \ } #define EIGEN_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(Derived, Op) \ template \ Derived& operator Op(const Other& scalar) \ { \ return Eigen::MatrixBase::operator Op(scalar); \ } #define EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Derived) \ EIGEN_INHERIT_ASSIGNMENT_OPERATOR(Derived, =) \ EIGEN_INHERIT_ASSIGNMENT_OPERATOR(Derived, +=) \ EIGEN_INHERIT_ASSIGNMENT_OPERATOR(Derived, -=) \ EIGEN_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(Derived, *=) \ EIGEN_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(Derived, /=) #define _EIGEN_GENERIC_PUBLIC_INTERFACE(Derived, BaseClass) \ typedef BaseClass Base; \ typedef typename Eigen::ei_traits::Scalar Scalar; \ typedef typename Eigen::NumTraits::Real RealScalar; \ typedef typename Base::PacketScalar PacketScalar; \ typedef typename Eigen::ei_nested::type Nested; \ typedef typename Eigen::ei_eval::type Eval; \ enum { RowsAtCompileTime = Eigen::ei_traits::RowsAtCompileTime, \ ColsAtCompileTime = Eigen::ei_traits::ColsAtCompileTime, \ MaxRowsAtCompileTime = Eigen::ei_traits::MaxRowsAtCompileTime, \ MaxColsAtCompileTime = Eigen::ei_traits::MaxColsAtCompileTime, \ Flags = Eigen::ei_traits::Flags, \ CoeffReadCost = Eigen::ei_traits::CoeffReadCost, \ SizeAtCompileTime = Base::SizeAtCompileTime, \ MaxSizeAtCompileTime = Base::MaxSizeAtCompileTime, \ IsVectorAtCompileTime = Base::IsVectorAtCompileTime }; #define EIGEN_GENERIC_PUBLIC_INTERFACE(Derived) \ _EIGEN_GENERIC_PUBLIC_INTERFACE(Derived, Eigen::MatrixBase) #define EIGEN_ENUM_MIN(a,b) (((int)a <= (int)b) ? (int)a : (int)b) #define EIGEN_ENUM_MAX(a,b) (((int)a >= (int)b) ? (int)a : (int)b) #endif // EIGEN_MACROS_H