mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-04-10 11:34:33 +08:00
Add support for C++23 multidimensional subscript operator
I'm not sure where to put tests for this, assuming they're needed. They also wouldn't run in CI anyway since CI only exercises the C++17 codepaths. See merge request libeigen/eigen!2053
This commit is contained in:
committed by
Rasmus Munk Larsen
parent
b6fcddccfc
commit
f95b4698fc
@@ -113,6 +113,16 @@ class DenseCoeffsBase<Derived, ReadOnlyAccessors> : public EigenBase<Derived> {
|
|||||||
return coeff(row, col);
|
return coeff(row, col);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if __cpp_multidimensional_subscript >= 202110L
|
||||||
|
/** \returns the coefficient at given the given row and column.
|
||||||
|
*
|
||||||
|
* \sa operator[](Index,Index), operator[](Index)
|
||||||
|
*/
|
||||||
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE constexpr CoeffReturnType operator[](Index row, Index col) const {
|
||||||
|
return operator()(row, col);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/** Short version: don't use this function, use
|
/** Short version: don't use this function, use
|
||||||
* \link operator[](Index) const \endlink instead.
|
* \link operator[](Index) const \endlink instead.
|
||||||
*
|
*
|
||||||
@@ -316,12 +326,21 @@ class DenseCoeffsBase<Derived, WriteAccessors> : public DenseCoeffsBase<Derived,
|
|||||||
*
|
*
|
||||||
* \sa operator[](Index)
|
* \sa operator[](Index)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE constexpr Scalar& operator()(Index row, Index col) {
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE constexpr Scalar& operator()(Index row, Index col) {
|
||||||
eigen_assert(row >= 0 && row < rows() && col >= 0 && col < cols());
|
eigen_assert(row >= 0 && row < rows() && col >= 0 && col < cols());
|
||||||
return coeffRef(row, col);
|
return coeffRef(row, col);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if __cpp_multidimensional_subscript >= 202110L
|
||||||
|
/** \returns a reference to the coefficient at given the given row and column.
|
||||||
|
*
|
||||||
|
* \sa operator[](Index)
|
||||||
|
*/
|
||||||
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE constexpr Scalar& operator[](Index row, Index col) {
|
||||||
|
return operator()(row, col);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/** Short version: don't use this function, use
|
/** Short version: don't use this function, use
|
||||||
* \link operator[](Index) \endlink instead.
|
* \link operator[](Index) \endlink instead.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -89,6 +89,11 @@ class TriangularBase : public EigenBase<Derived> {
|
|||||||
return coeffRef(row, col);
|
return coeffRef(row, col);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if __cpp_multidimensional_subscript >= 202110L
|
||||||
|
EIGEN_DEVICE_FUNC inline Scalar operator[](Index row, Index col) const { return operator()(row, col); }
|
||||||
|
EIGEN_DEVICE_FUNC inline Scalar& operator[](Index row, Index col) { return operator()(row, col); }
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
||||||
EIGEN_DEVICE_FUNC inline const Derived& derived() const { return *static_cast<const Derived*>(this); }
|
EIGEN_DEVICE_FUNC inline const Derived& derived() const { return *static_cast<const Derived*>(this); }
|
||||||
EIGEN_DEVICE_FUNC inline Derived& derived() { return *static_cast<Derived*>(this); }
|
EIGEN_DEVICE_FUNC inline Derived& derived() { return *static_cast<Derived*>(this); }
|
||||||
|
|||||||
@@ -365,6 +365,15 @@ class Transform {
|
|||||||
* \sa MatrixBase::operator(Index,Index) */
|
* \sa MatrixBase::operator(Index,Index) */
|
||||||
EIGEN_DEVICE_FUNC inline Scalar& operator()(Index row, Index col) { return m_matrix(row, col); }
|
EIGEN_DEVICE_FUNC inline Scalar& operator()(Index row, Index col) { return m_matrix(row, col); }
|
||||||
|
|
||||||
|
#if __cpp_multidimensional_subscript >= 202110L
|
||||||
|
/** shortcut for m_matrix(row,col);
|
||||||
|
* \sa MatrixBase::operator(Index,Index) const */
|
||||||
|
EIGEN_DEVICE_FUNC inline Scalar operator[](Index row, Index col) const { return m_matrix[row, col]; }
|
||||||
|
/** shortcut for m_matrix(row,col);
|
||||||
|
* \sa MatrixBase::operator(Index,Index) */
|
||||||
|
EIGEN_DEVICE_FUNC inline Scalar& operator[](Index row, Index col) { return m_matrix[row, col]; }
|
||||||
|
#endif
|
||||||
|
|
||||||
/** \returns a read-only expression of the transformation matrix */
|
/** \returns a read-only expression of the transformation matrix */
|
||||||
EIGEN_DEVICE_FUNC inline const MatrixType& matrix() const { return m_matrix; }
|
EIGEN_DEVICE_FUNC inline const MatrixType& matrix() const { return m_matrix; }
|
||||||
/** \returns a writable expression of the transformation matrix */
|
/** \returns a writable expression of the transformation matrix */
|
||||||
|
|||||||
@@ -117,6 +117,10 @@ class SimpleTensorContractionMapper {
|
|||||||
return m_tensor.coeff(computeIndex(row, col));
|
return m_tensor.coeff(computeIndex(row, col));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if __cpp_multidimensional_subscript >= 202110L
|
||||||
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator[](Index row, Index col) const { return operator()(row, col); }
|
||||||
|
#endif
|
||||||
|
|
||||||
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index computeIndex(Index row, Index col) const {
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index computeIndex(Index row, Index col) const {
|
||||||
const bool left = (side == Lhs);
|
const bool left = (side == Lhs);
|
||||||
EIGEN_UNUSED_VARIABLE(left); // annoying bug in g++8.1: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85963
|
EIGEN_UNUSED_VARIABLE(left); // annoying bug in g++8.1: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85963
|
||||||
|
|||||||
@@ -63,6 +63,10 @@ class companion {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if __cpp_multidimensional_subscript >= 202110L
|
||||||
|
EIGEN_STRONG_INLINE const Scalar_ operator[](Index row, Index col) const { return operator()(row, col); }
|
||||||
|
#endif
|
||||||
|
|
||||||
public:
|
public:
|
||||||
template <typename VectorType>
|
template <typename VectorType>
|
||||||
void setPolynomial(const VectorType& poly) {
|
void setPolynomial(const VectorType& poly) {
|
||||||
|
|||||||
@@ -280,6 +280,11 @@ class RandomSetter {
|
|||||||
return m_hashmaps[outerMajor][key].value;
|
return m_hashmaps[outerMajor][key].value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if __cpp_multidimensional_subscript >= 202110L
|
||||||
|
/** \returns a reference to the coefficient at given coordinates \a row, \a col */
|
||||||
|
Scalar& operator[](Index row, Index col) { return operator()(row, col); }
|
||||||
|
#endif
|
||||||
|
|
||||||
/** \returns the number of non zero coefficients
|
/** \returns the number of non zero coefficients
|
||||||
*
|
*
|
||||||
* \note According to the underlying map/hash_map implementation,
|
* \note According to the underlying map/hash_map implementation,
|
||||||
|
|||||||
Reference in New Issue
Block a user