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>
This commit is contained in:
		
							parent
							
								
									3e6329a0d9
								
							
						
					
					
						commit
						904ecdf9d8
					
				| @ -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
 | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -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. | ||||
|   */ | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -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()); | ||||
|     } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Gael Guennebaud
						Gael Guennebaud