mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-05-02 16:54:10 +08:00
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 remove_reference<MatrixTypeNested>::type _MatrixTypeNested;
|
||||||
typedef typename MatrixType::StorageKind StorageKind;
|
typedef typename MatrixType::StorageKind StorageKind;
|
||||||
enum {
|
enum {
|
||||||
RowsAtCompileTime = (int(DiagIndex) == Dynamic || int(MatrixType::SizeAtCompileTime) == Dynamic) ? Dynamic
|
RowsAtCompileTime = (int(DiagIndex) == DynamicIndex || int(MatrixType::SizeAtCompileTime) == Dynamic) ? Dynamic
|
||||||
: (EIGEN_PLAIN_ENUM_MIN(MatrixType::RowsAtCompileTime - EIGEN_PLAIN_ENUM_MAX(-DiagIndex, 0),
|
: (EIGEN_PLAIN_ENUM_MIN(MatrixType::RowsAtCompileTime - EIGEN_PLAIN_ENUM_MAX(-DiagIndex, 0),
|
||||||
MatrixType::ColsAtCompileTime - EIGEN_PLAIN_ENUM_MAX( DiagIndex, 0))),
|
MatrixType::ColsAtCompileTime - EIGEN_PLAIN_ENUM_MAX( DiagIndex, 0))),
|
||||||
ColsAtCompileTime = 1,
|
ColsAtCompileTime = 1,
|
||||||
MaxRowsAtCompileTime = int(MatrixType::MaxSizeAtCompileTime) == Dynamic ? Dynamic
|
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)
|
MatrixType::MaxColsAtCompileTime)
|
||||||
: (EIGEN_PLAIN_ENUM_MIN(MatrixType::MaxRowsAtCompileTime - EIGEN_PLAIN_ENUM_MAX(-DiagIndex, 0),
|
: (EIGEN_PLAIN_ENUM_MIN(MatrixType::MaxRowsAtCompileTime - EIGEN_PLAIN_ENUM_MAX(-DiagIndex, 0),
|
||||||
MatrixType::MaxColsAtCompileTime - 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:
|
protected:
|
||||||
typename MatrixType::Nested m_matrix;
|
typename MatrixType::Nested m_matrix;
|
||||||
const internal::variable_if_dynamic<Index, DiagIndex> m_index;
|
const internal::variable_if_dynamicindex<Index, DiagIndex> m_index;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// some compilers may fail to optimize std::max etc in case of compile-time constants...
|
// 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 */
|
* \sa MatrixBase::diagonal(), class Diagonal */
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
inline typename MatrixBase<Derived>::template DiagonalIndexReturnType<Dynamic>::Type
|
inline typename MatrixBase<Derived>::template DiagonalIndexReturnType<DynamicIndex>::Type
|
||||||
MatrixBase<Derived>::diagonal(Index index)
|
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). */
|
/** This is the const version of diagonal(Index). */
|
||||||
template<typename Derived>
|
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
|
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
|
/** \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.
|
// Note: The "MatrixBase::" prefixes are added to help MSVC9 to match these declarations with the later implementations.
|
||||||
// On the other hand they confuse MSVC8...
|
// On the other hand they confuse MSVC8...
|
||||||
#if (defined _MSC_VER) && (_MSC_VER >= 1500) // 2008 or later
|
#if (defined _MSC_VER) && (_MSC_VER >= 1500) // 2008 or later
|
||||||
typename MatrixBase::template DiagonalIndexReturnType<Dynamic>::Type diagonal(Index index);
|
typename MatrixBase::template DiagonalIndexReturnType<DynamicIndex>::Type diagonal(Index index);
|
||||||
typename MatrixBase::template ConstDiagonalIndexReturnType<Dynamic>::Type diagonal(Index index) const;
|
typename MatrixBase::template ConstDiagonalIndexReturnType<DynamicIndex>::Type diagonal(Index index) const;
|
||||||
#else
|
#else
|
||||||
typename DiagonalIndexReturnType<Dynamic>::Type diagonal(Index index);
|
typename DiagonalIndexReturnType<DynamicIndex>::Type diagonal(Index index);
|
||||||
typename ConstDiagonalIndexReturnType<Dynamic>::Type diagonal(Index index) const;
|
typename ConstDiagonalIndexReturnType<DynamicIndex>::Type diagonal(Index index) const;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef EIGEN2_SUPPORT
|
#ifdef EIGEN2_SUPPORT
|
||||||
|
@ -28,13 +28,18 @@
|
|||||||
|
|
||||||
namespace Eigen {
|
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.
|
* stored in some runtime variable.
|
||||||
*
|
*
|
||||||
* Changing the value of Dynamic breaks the ABI, as Dynamic is often used as a template parameter for Matrix.
|
* Changing the value of Dynamic breaks the ABI, as Dynamic is often used as a template parameter for Matrix.
|
||||||
*/
|
*/
|
||||||
const int Dynamic = -1;
|
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>().
|
/** 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.
|
* 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; }
|
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
|
template<typename T> struct functor_traits
|
||||||
{
|
{
|
||||||
enum
|
enum
|
||||||
|
@ -46,17 +46,14 @@ template<typename MatrixType> void diagonal(const MatrixType& m)
|
|||||||
if (rows>2)
|
if (rows>2)
|
||||||
{
|
{
|
||||||
enum {
|
enum {
|
||||||
N1 = MatrixType::RowsAtCompileTime>1 ? 1 : 0,
|
N1 = MatrixType::RowsAtCompileTime>2 ? 2 : 0,
|
||||||
N2 = MatrixType::RowsAtCompileTime>2 ? -2 : 0
|
N2 = MatrixType::RowsAtCompileTime>1 ? -1 : 0
|
||||||
};
|
};
|
||||||
|
|
||||||
// check sub/super diagonal
|
// 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());
|
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());
|
VERIFY(m1.template diagonal<N2>().RowsAtCompileTime == m1.diagonal(N2).size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user