mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-08-12 11:49:02 +08:00
Fix nesting type and complete reflection methods of Block expressions.
This commit is contained in:
parent
f3643eec57
commit
6f0992c05b
@ -173,6 +173,7 @@ template<typename XprType, int BlockRows, int BlockCols, bool InnerPanel, bool H
|
|||||||
: public internal::dense_xpr_base<Block<XprType, BlockRows, BlockCols, InnerPanel> >::type
|
: public internal::dense_xpr_base<Block<XprType, BlockRows, BlockCols, InnerPanel> >::type
|
||||||
{
|
{
|
||||||
typedef Block<XprType, BlockRows, BlockCols, InnerPanel> BlockType;
|
typedef Block<XprType, BlockRows, BlockCols, InnerPanel> BlockType;
|
||||||
|
typedef typename internal::ref_selector<XprType>::non_const_type XprTypeNested;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
typedef typename internal::dense_xpr_base<BlockType>::type Base;
|
typedef typename internal::dense_xpr_base<BlockType>::type Base;
|
||||||
@ -294,11 +295,14 @@ template<typename XprType, int BlockRows, int BlockCols, bool InnerPanel, bool H
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
const typename internal::remove_all<typename XprType::Nested>::type& nestedExpression() const
|
const typename internal::remove_all<XprTypeNested>::type& nestedExpression() const
|
||||||
{
|
{
|
||||||
return m_xpr;
|
return m_xpr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EIGEN_DEVICE_FUNC
|
||||||
|
XprType& nestedExpression() { return m_xpr; }
|
||||||
|
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
StorageIndex startRow() const
|
StorageIndex startRow() const
|
||||||
{
|
{
|
||||||
@ -313,7 +317,7 @@ template<typename XprType, int BlockRows, int BlockCols, bool InnerPanel, bool H
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
typename XprType::Nested m_xpr;
|
XprTypeNested m_xpr;
|
||||||
const internal::variable_if_dynamic<StorageIndex, XprType::RowsAtCompileTime == 1 ? 0 : Dynamic> m_startRow;
|
const internal::variable_if_dynamic<StorageIndex, XprType::RowsAtCompileTime == 1 ? 0 : Dynamic> m_startRow;
|
||||||
const internal::variable_if_dynamic<StorageIndex, XprType::ColsAtCompileTime == 1 ? 0 : Dynamic> m_startCol;
|
const internal::variable_if_dynamic<StorageIndex, XprType::ColsAtCompileTime == 1 ? 0 : Dynamic> m_startCol;
|
||||||
const internal::variable_if_dynamic<StorageIndex, RowsAtCompileTime> m_blockRows;
|
const internal::variable_if_dynamic<StorageIndex, RowsAtCompileTime> m_blockRows;
|
||||||
@ -326,6 +330,7 @@ class BlockImpl_dense<XprType,BlockRows,BlockCols, InnerPanel,true>
|
|||||||
: public MapBase<Block<XprType, BlockRows, BlockCols, InnerPanel> >
|
: public MapBase<Block<XprType, BlockRows, BlockCols, InnerPanel> >
|
||||||
{
|
{
|
||||||
typedef Block<XprType, BlockRows, BlockCols, InnerPanel> BlockType;
|
typedef Block<XprType, BlockRows, BlockCols, InnerPanel> BlockType;
|
||||||
|
typedef typename internal::ref_selector<XprType>::non_const_type XprTypeNested;
|
||||||
enum {
|
enum {
|
||||||
XprTypeIsRowMajor = (int(traits<XprType>::Flags)&RowMajorBit) != 0
|
XprTypeIsRowMajor = (int(traits<XprType>::Flags)&RowMajorBit) != 0
|
||||||
};
|
};
|
||||||
@ -371,11 +376,14 @@ class BlockImpl_dense<XprType,BlockRows,BlockCols, InnerPanel,true>
|
|||||||
}
|
}
|
||||||
|
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
const typename internal::remove_all<typename XprType::Nested>::type& nestedExpression() const
|
const typename internal::remove_all<XprTypeNested>::type& nestedExpression() const
|
||||||
{
|
{
|
||||||
return m_xpr;
|
return m_xpr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EIGEN_DEVICE_FUNC
|
||||||
|
XprType& nestedExpression() { return m_xpr; }
|
||||||
|
|
||||||
/** \sa MapBase::innerStride() */
|
/** \sa MapBase::innerStride() */
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
inline Index innerStride() const
|
inline Index innerStride() const
|
||||||
@ -392,6 +400,20 @@ class BlockImpl_dense<XprType,BlockRows,BlockCols, InnerPanel,true>
|
|||||||
return m_outerStride;
|
return m_outerStride;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EIGEN_DEVICE_FUNC
|
||||||
|
StorageIndex startRow() const
|
||||||
|
{
|
||||||
|
std::ptrdiff_t diff = Base::data() - m_xpr.data();
|
||||||
|
return XprType::IsRowMajor ? (diff/m_xpr.outerStride()) : (diff%m_xpr.outerStride());
|
||||||
|
}
|
||||||
|
|
||||||
|
EIGEN_DEVICE_FUNC
|
||||||
|
StorageIndex startCol() const
|
||||||
|
{
|
||||||
|
std::ptrdiff_t diff = Base::data() - m_xpr.data();
|
||||||
|
return XprType::IsRowMajor ? (diff%m_xpr.outerStride()) : (diff/m_xpr.outerStride());
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef __SUNPRO_CC
|
#ifndef __SUNPRO_CC
|
||||||
// FIXME sunstudio is not friendly with the above friend...
|
// FIXME sunstudio is not friendly with the above friend...
|
||||||
// META-FIXME there is no 'friend' keyword around here. Is this obsolete?
|
// META-FIXME there is no 'friend' keyword around here. Is this obsolete?
|
||||||
@ -417,7 +439,7 @@ class BlockImpl_dense<XprType,BlockRows,BlockCols, InnerPanel,true>
|
|||||||
: m_xpr.innerStride();
|
: m_xpr.innerStride();
|
||||||
}
|
}
|
||||||
|
|
||||||
typename XprType::Nested m_xpr;
|
XprTypeNested m_xpr;
|
||||||
Index m_outerStride;
|
Index m_outerStride;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -28,11 +28,11 @@ protected:
|
|||||||
public:
|
public:
|
||||||
EIGEN_SPARSE_PUBLIC_INTERFACE(BlockType)
|
EIGEN_SPARSE_PUBLIC_INTERFACE(BlockType)
|
||||||
|
|
||||||
inline BlockImpl(const XprType& xpr, Index i)
|
inline BlockImpl(XprType& xpr, Index i)
|
||||||
: m_matrix(xpr), m_outerStart(convert_index(i)), m_outerSize(OuterSize)
|
: m_matrix(xpr), m_outerStart(convert_index(i)), m_outerSize(OuterSize)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
inline BlockImpl(const XprType& xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
|
inline BlockImpl(XprType& xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
|
||||||
: m_matrix(xpr), m_outerStart(convert_index(IsRowMajor ? startRow : startCol)), m_outerSize(convert_index(IsRowMajor ? blockRows : blockCols))
|
: m_matrix(xpr), m_outerStart(convert_index(IsRowMajor ? startRow : startCol)), m_outerSize(convert_index(IsRowMajor ? blockRows : blockCols))
|
||||||
{}
|
{}
|
||||||
|
|
||||||
@ -61,7 +61,8 @@ public:
|
|||||||
return m_matrix.coeff(IsRowMajor ? m_outerStart : index, IsRowMajor ? index : m_outerStart);
|
return m_matrix.coeff(IsRowMajor ? m_outerStart : index, IsRowMajor ? index : m_outerStart);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline const _MatrixTypeNested& nestedExpression() const { return m_matrix; }
|
inline const XprType& nestedExpression() const { return m_matrix; }
|
||||||
|
inline XprType& nestedExpression() { return m_matrix; }
|
||||||
Index startRow() const { return IsRowMajor ? m_outerStart : 0; }
|
Index startRow() const { return IsRowMajor ? m_outerStart : 0; }
|
||||||
Index startCol() const { return IsRowMajor ? 0 : m_outerStart; }
|
Index startCol() const { return IsRowMajor ? 0 : m_outerStart; }
|
||||||
Index blockRows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
|
Index blockRows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
|
||||||
@ -69,7 +70,7 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
typename XprType::Nested m_matrix;
|
typename internal::ref_selector<XprType>::non_const_type m_matrix;
|
||||||
Index m_outerStart;
|
Index m_outerStart;
|
||||||
const internal::variable_if_dynamic<Index, OuterSize> m_outerSize;
|
const internal::variable_if_dynamic<Index, OuterSize> m_outerSize;
|
||||||
|
|
||||||
@ -263,7 +264,8 @@ public:
|
|||||||
EIGEN_STRONG_INLINE Index rows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
|
EIGEN_STRONG_INLINE Index rows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
|
||||||
EIGEN_STRONG_INLINE Index cols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }
|
EIGEN_STRONG_INLINE Index cols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }
|
||||||
|
|
||||||
inline const _MatrixTypeNested& nestedExpression() const { return m_matrix; }
|
inline const SparseMatrixType& nestedExpression() const { return m_matrix; }
|
||||||
|
inline SparseMatrixType& nestedExpression() { return m_matrix; }
|
||||||
Index startRow() const { return IsRowMajor ? m_outerStart : 0; }
|
Index startRow() const { return IsRowMajor ? m_outerStart : 0; }
|
||||||
Index startCol() const { return IsRowMajor ? 0 : m_outerStart; }
|
Index startCol() const { return IsRowMajor ? 0 : m_outerStart; }
|
||||||
Index blockRows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
|
Index blockRows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
|
||||||
@ -419,7 +421,8 @@ public:
|
|||||||
m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
|
m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
inline const _MatrixTypeNested& nestedExpression() const { return m_matrix; }
|
inline const XprType& nestedExpression() const { return m_matrix; }
|
||||||
|
inline XprType& nestedExpression() { return m_matrix; }
|
||||||
Index startRow() const { return m_startRow.value(); }
|
Index startRow() const { return m_startRow.value(); }
|
||||||
Index startCol() const { return m_startCol.value(); }
|
Index startCol() const { return m_startCol.value(); }
|
||||||
Index blockRows() const { return m_blockRows.value(); }
|
Index blockRows() const { return m_blockRows.value(); }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user