diff options
author | Gael Guennebaud <g.gael@free.fr> | 2012-07-10 23:04:17 +0200 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2012-07-10 23:04:17 +0200 |
commit | 904ecdf9d8b9742ed6f59249d999e176587a695d (patch) | |
tree | 7807ad932d8bec0369805c1db7cbb3cc1613432a | |
parent | 3e6329a0d92a951523d1d0f5e4f4565a87a52a45 (diff) |
Add a DynamicIndex constant for signed quantities and use it to fix the conflict
between Diagonal<S,-1> (the first sub diagonal) and a runtime super/sub diagonal which is now:
Diagonal<S,DynamicIndex>
-rw-r--r-- | Eigen/src/Core/Diagonal.h | 18 | ||||
-rw-r--r-- | Eigen/src/Core/MatrixBase.h | 8 | ||||
-rw-r--r-- | Eigen/src/Core/util/Constants.h | 7 | ||||
-rw-r--r-- | Eigen/src/Core/util/XprHelper.h | 21 | ||||
-rw-r--r-- | test/diagonal.cpp | 9 |
5 files changed, 43 insertions, 20 deletions
diff --git a/Eigen/src/Core/Diagonal.h b/Eigen/src/Core/Diagonal.h index 3af3c694f..3ed4c5364 100644 --- a/Eigen/src/Core/Diagonal.h +++ b/Eigen/src/Core/Diagonal.h @@ -56,12 +56,12 @@ struct traits<Diagonal<MatrixType,DiagIndex> > typedef typename remove_reference<MatrixTypeNested>::type _MatrixTypeNested; typedef typename MatrixType::StorageKind StorageKind; enum { - RowsAtCompileTime = (int(DiagIndex) == Dynamic || int(MatrixType::SizeAtCompileTime) == Dynamic) ? Dynamic - : (EIGEN_PLAIN_ENUM_MIN(MatrixType::RowsAtCompileTime - EIGEN_PLAIN_ENUM_MAX(-DiagIndex, 0), - MatrixType::ColsAtCompileTime - EIGEN_PLAIN_ENUM_MAX( DiagIndex, 0))), + RowsAtCompileTime = (int(DiagIndex) == DynamicIndex || int(MatrixType::SizeAtCompileTime) == Dynamic) ? Dynamic + : (EIGEN_PLAIN_ENUM_MIN(MatrixType::RowsAtCompileTime - EIGEN_PLAIN_ENUM_MAX(-DiagIndex, 0), + MatrixType::ColsAtCompileTime - EIGEN_PLAIN_ENUM_MAX( DiagIndex, 0))), ColsAtCompileTime = 1, MaxRowsAtCompileTime = int(MatrixType::MaxSizeAtCompileTime) == Dynamic ? Dynamic - : DiagIndex == Dynamic ? EIGEN_SIZE_MIN_PREFER_FIXED(MatrixType::MaxRowsAtCompileTime, + : DiagIndex == DynamicIndex ? EIGEN_SIZE_MIN_PREFER_FIXED(MatrixType::MaxRowsAtCompileTime, MatrixType::MaxColsAtCompileTime) : (EIGEN_PLAIN_ENUM_MIN(MatrixType::MaxRowsAtCompileTime - EIGEN_PLAIN_ENUM_MAX(-DiagIndex, 0), MatrixType::MaxColsAtCompileTime - EIGEN_PLAIN_ENUM_MAX( DiagIndex, 0))), @@ -158,7 +158,7 @@ template<typename MatrixType, int _DiagIndex> class Diagonal protected: typename MatrixType::Nested m_matrix; - const internal::variable_if_dynamic<Index, DiagIndex> m_index; + const internal::variable_if_dynamicindex<Index, DiagIndex> m_index; private: // some compilers may fail to optimize std::max etc in case of compile-time constants... @@ -205,18 +205,18 @@ MatrixBase<Derived>::diagonal() const * * \sa MatrixBase::diagonal(), class Diagonal */ template<typename Derived> -inline typename MatrixBase<Derived>::template DiagonalIndexReturnType<Dynamic>::Type +inline typename MatrixBase<Derived>::template DiagonalIndexReturnType<DynamicIndex>::Type MatrixBase<Derived>::diagonal(Index index) { - return typename DiagonalIndexReturnType<Dynamic>::Type(derived(), index); + return typename DiagonalIndexReturnType<DynamicIndex>::Type(derived(), index); } /** This is the const version of diagonal(Index). */ template<typename Derived> -inline typename MatrixBase<Derived>::template ConstDiagonalIndexReturnType<Dynamic>::Type +inline typename MatrixBase<Derived>::template ConstDiagonalIndexReturnType<DynamicIndex>::Type MatrixBase<Derived>::diagonal(Index index) const { - return typename ConstDiagonalIndexReturnType<Dynamic>::Type(derived(), index); + return typename ConstDiagonalIndexReturnType<DynamicIndex>::Type(derived(), index); } /** \returns an expression of the \a DiagIndex-th sub or super diagonal of the matrix \c *this diff --git a/Eigen/src/Core/MatrixBase.h b/Eigen/src/Core/MatrixBase.h index cdaedb92f..396e0e2f1 100644 --- a/Eigen/src/Core/MatrixBase.h +++ b/Eigen/src/Core/MatrixBase.h @@ -239,11 +239,11 @@ template<typename Derived> class MatrixBase // Note: The "MatrixBase::" prefixes are added to help MSVC9 to match these declarations with the later implementations. // On the other hand they confuse MSVC8... #if (defined _MSC_VER) && (_MSC_VER >= 1500) // 2008 or later - typename MatrixBase::template DiagonalIndexReturnType<Dynamic>::Type diagonal(Index index); - typename MatrixBase::template ConstDiagonalIndexReturnType<Dynamic>::Type diagonal(Index index) const; + typename MatrixBase::template DiagonalIndexReturnType<DynamicIndex>::Type diagonal(Index index); + typename MatrixBase::template ConstDiagonalIndexReturnType<DynamicIndex>::Type diagonal(Index index) const; #else - typename DiagonalIndexReturnType<Dynamic>::Type diagonal(Index index); - typename ConstDiagonalIndexReturnType<Dynamic>::Type diagonal(Index index) const; + typename DiagonalIndexReturnType<DynamicIndex>::Type diagonal(Index index); + typename ConstDiagonalIndexReturnType<DynamicIndex>::Type diagonal(Index index) const; #endif #ifdef EIGEN2_SUPPORT diff --git a/Eigen/src/Core/util/Constants.h b/Eigen/src/Core/util/Constants.h index e8aa9aa40..e9c71a7a0 100644 --- a/Eigen/src/Core/util/Constants.h +++ b/Eigen/src/Core/util/Constants.h @@ -28,13 +28,18 @@ namespace Eigen { -/** This value means that a quantity is not known at compile-time, and that instead the value is +/** This value means that a positive quantity (e.g., a size) is not known at compile-time, and that instead the value is * stored in some runtime variable. * * Changing the value of Dynamic breaks the ABI, as Dynamic is often used as a template parameter for Matrix. */ const int Dynamic = -1; +/** This value means that a signed quantity (e.g., a signed index) is not known at compile-time, and that instead its value + * has to be specified at runtime. + */ +const int DynamicIndex = 0xffffff; + /** This value means +Infinity; it is currently used only as the p parameter to MatrixBase::lpNorm<int>(). * The value Infinity there means the L-infinity norm. */ diff --git a/Eigen/src/Core/util/XprHelper.h b/Eigen/src/Core/util/XprHelper.h index 5bb0a624f..764a6b63f 100644 --- a/Eigen/src/Core/util/XprHelper.h +++ b/Eigen/src/Core/util/XprHelper.h @@ -80,6 +80,27 @@ template<typename T> class variable_if_dynamic<T, Dynamic> void setValue(T value) { m_value = value; } }; +/** \internal like variable_if_dynamic but for DynamicIndex + */ +template<typename T, int Value> class variable_if_dynamicindex +{ + public: + EIGEN_EMPTY_STRUCT_CTOR(variable_if_dynamicindex) + explicit variable_if_dynamicindex(T v) { EIGEN_ONLY_USED_FOR_DEBUG(v); assert(v == T(Value)); } + static T value() { return T(Value); } + void setValue(T) {} +}; + +template<typename T> class variable_if_dynamicindex<T, DynamicIndex> +{ + T m_value; + variable_if_dynamicindex() { assert(false); } + public: + explicit variable_if_dynamicindex(T value) : m_value(value) {} + T value() const { return m_value; } + void setValue(T value) { m_value = value; } +}; + template<typename T> struct functor_traits { enum diff --git a/test/diagonal.cpp b/test/diagonal.cpp index 191a91bae..9246d1233 100644 --- a/test/diagonal.cpp +++ b/test/diagonal.cpp @@ -46,17 +46,14 @@ template<typename MatrixType> void diagonal(const MatrixType& m) if (rows>2) { enum { - N1 = MatrixType::RowsAtCompileTime>1 ? 1 : 0, - N2 = MatrixType::RowsAtCompileTime>2 ? -2 : 0 + N1 = MatrixType::RowsAtCompileTime>2 ? 2 : 0, + N2 = MatrixType::RowsAtCompileTime>1 ? -1 : 0 }; // check sub/super diagonal - if(m1.template diagonal<N1>().RowsAtCompileTime!=Dynamic) + if(MatrixType::SizeAtCompileTime!=Dynamic) { VERIFY(m1.template diagonal<N1>().RowsAtCompileTime == m1.diagonal(N1).size()); - } - if(m1.template diagonal<N2>().RowsAtCompileTime!=Dynamic) - { VERIFY(m1.template diagonal<N2>().RowsAtCompileTime == m1.diagonal(N2).size()); } |