ensure that eigen::internal::size is not found by ADL, rename to ssize and...

(cherry picked from commit 9210e71fb378a0f1542272506dc2759b6c147237)
This commit is contained in:
Erik Schultheis 2022-01-05 00:46:09 +00:00 committed by Antonio Sánchez
parent 3af8c262ac
commit bd72e4a8c4
3 changed files with 24 additions and 11 deletions

View File

@ -122,10 +122,10 @@ public:
{}
/** \returns number of rows */
Index rows() const { return internal::size(m_rowIndices); }
Index rows() const { return internal::index_list_size(m_rowIndices); }
/** \returns number of columns */
Index cols() const { return internal::size(m_colIndices); }
Index cols() const { return internal::index_list_size(m_colIndices); }
/** \returns the nested expression */
const typename internal::remove_all<XprType>::type&

View File

@ -466,20 +466,33 @@ template<typename T, std::size_t N> struct array_size<std::array<T,N> > {
};
#endif
/** \internal
* Analogue of the std::size free function.
* It returns the size of the container or view \a x of type \c T
* Analogue of the std::ssize free function.
* It returns the signed size of the container or view \a x of type \c T
*
* It currently supports:
* - any types T defining a member T::size() const
* - plain C arrays as T[N]
*
* For C++20, this function just forwards to `std::ssize`, or any ADL discoverable `ssize` function.
*/
template<typename T>
EIGEN_CONSTEXPR Index size(const T& x) { return x.size(); }
#if EIGEN_COMP_CXXVER < 20
template <typename T>
EIGEN_CONSTEXPR auto index_list_size(const T& x) {
using R = std::common_type_t<std::ptrdiff_t, std::make_signed_t<decltype(x.size())>>;
return static_cast<R>(x.size());
}
template<typename T,std::size_t N>
EIGEN_CONSTEXPR Index size(const T (&) [N]) { return N; }
template<typename T, std::ptrdiff_t N>
EIGEN_CONSTEXPR std::ptrdiff_t index_list_size(const T (&)[N]) { return N; }
#else
template <typename T>
EIGEN_CONSTEXPR auto index_list_size(T&& x) {
using std::ssize;
return ssize(std::forward<T>(x));
}
#endif // EIGEN_COMP_CXXVER
/** \internal
* Convenient struct to get the result type of a nullary, unary, binary, or

View File

@ -90,8 +90,8 @@ operator()(const RowIndices& rowIndices, const ColIndices& colIndices) EIGEN_IND
return BlockType(derived(),
internal::first(actualRowIndices),
internal::first(actualColIndices),
internal::size(actualRowIndices),
internal::size(actualColIndices));
internal::index_list_size(actualRowIndices),
internal::index_list_size(actualColIndices));
}
// The following overload returns a Scalar
@ -168,7 +168,7 @@ operator()(const Indices& indices) EIGEN_INDEXED_VIEW_METHOD_CONST
EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
typename IvcType<Indices>::type actualIndices = ivcSize(indices);
return VectorBlock<EIGEN_INDEXED_VIEW_METHOD_CONST Derived,internal::array_size<Indices>::value>
(derived(), internal::first(actualIndices), internal::size(actualIndices));
(derived(), internal::first(actualIndices), internal::index_list_size(actualIndices));
}
template<typename IndexType>