mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-08-11 19:29:02 +08:00
Fix compilation of Vector::operator()(enum) by treating enums as Index
This commit is contained in:
parent
ea4e65bf41
commit
6d42309f13
@ -410,6 +410,16 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Does the compiler support type_trais?
|
||||||
|
#ifndef EIGEN_HAS_TYPE_TRAITS
|
||||||
|
#if EIGEN_MAX_CPP_VER>=11 && (EIGEN_HAS_CXX11 || __has_feature(is_enum) || EIGEN_COMP_MSVC >= 1700)
|
||||||
|
#define EIGEN_HAS_TYPE_TRAITS 1
|
||||||
|
#define EIGEN_INCLUDE_TYPE_TRAITS
|
||||||
|
#else
|
||||||
|
#define EIGEN_HAS_TYPE_TRAITS 0
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
// Does the compiler support variadic templates?
|
// Does the compiler support variadic templates?
|
||||||
#ifndef EIGEN_HAS_VARIADIC_TEMPLATES
|
#ifndef EIGEN_HAS_VARIADIC_TEMPLATES
|
||||||
#if EIGEN_MAX_CPP_VER>=11 && (__cplusplus > 199711L || EIGEN_COMP_MSVC >= 1900) \
|
#if EIGEN_MAX_CPP_VER>=11 && (__cplusplus > 199711L || EIGEN_COMP_MSVC >= 1900) \
|
||||||
|
@ -34,6 +34,16 @@ inline IndexDest convert_index(const IndexSrc& idx) {
|
|||||||
return IndexDest(idx);
|
return IndexDest(idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// true if T can be considered as an integral index (i.e., and integral type or enum)
|
||||||
|
template<typename T> struct is_valid_index_type
|
||||||
|
: std::integral_constant<bool,
|
||||||
|
#if EIGEN_HAS_TYPE_TRAITS
|
||||||
|
internal::is_integral<T>::value || std::is_enum<T>::value
|
||||||
|
#else
|
||||||
|
// without C++11, we use is_convertible to Index instead of is_integral in order to treat enums as Index.
|
||||||
|
internal::is_convertible<T,Index>::value
|
||||||
|
#endif
|
||||||
|
> {};
|
||||||
|
|
||||||
// promote_scalar_arg is an helper used in operation between an expression and a scalar, like:
|
// promote_scalar_arg is an helper used in operation between an expression and a scalar, like:
|
||||||
// expression * scalar
|
// expression * scalar
|
||||||
|
@ -55,9 +55,7 @@ ivcSize(const Indices& indices) const {
|
|||||||
|
|
||||||
template<typename RowIndices, typename ColIndices>
|
template<typename RowIndices, typename ColIndices>
|
||||||
struct valid_indexed_view_overload {
|
struct valid_indexed_view_overload {
|
||||||
// Here we use is_convertible to Index instead of is_integral in order to treat enums as Index.
|
enum { value = !(internal::is_valid_index_type<RowIndices>::value && internal::is_valid_index_type<ColIndices>::value) };
|
||||||
// In c++11 we could use is_integral<T> && is_enum<T> if is_convertible appears to be too permissive.
|
|
||||||
enum { value = !(internal::is_convertible<RowIndices,Index>::value && internal::is_convertible<ColIndices,Index>::value) };
|
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -146,7 +144,7 @@ operator()(const RowIndicesT (&rowIndices)[RowIndicesN], const ColIndicesT (&col
|
|||||||
|
|
||||||
template<typename Indices>
|
template<typename Indices>
|
||||||
typename internal::enable_if<
|
typename internal::enable_if<
|
||||||
IsRowMajor && (!(internal::get_compile_time_incr<typename IvcType<Indices>::type>::value==1 || internal::is_integral<Indices>::value)),
|
IsRowMajor && (!(internal::get_compile_time_incr<typename IvcType<Indices>::type>::value==1 || internal::is_valid_index_type<Indices>::value)),
|
||||||
IndexedView<EIGEN_INDEXED_VIEW_METHOD_CONST Derived,IvcIndex,typename IvcType<Indices>::type> >::type
|
IndexedView<EIGEN_INDEXED_VIEW_METHOD_CONST Derived,IvcIndex,typename IvcType<Indices>::type> >::type
|
||||||
operator()(const Indices& indices) EIGEN_INDEXED_VIEW_METHOD_CONST
|
operator()(const Indices& indices) EIGEN_INDEXED_VIEW_METHOD_CONST
|
||||||
{
|
{
|
||||||
@ -157,7 +155,7 @@ operator()(const Indices& indices) EIGEN_INDEXED_VIEW_METHOD_CONST
|
|||||||
|
|
||||||
template<typename Indices>
|
template<typename Indices>
|
||||||
typename internal::enable_if<
|
typename internal::enable_if<
|
||||||
(!IsRowMajor) && (!(internal::get_compile_time_incr<typename IvcType<Indices>::type>::value==1 || internal::is_integral<Indices>::value)),
|
(!IsRowMajor) && (!(internal::get_compile_time_incr<typename IvcType<Indices>::type>::value==1 || internal::is_valid_index_type<Indices>::value)),
|
||||||
IndexedView<EIGEN_INDEXED_VIEW_METHOD_CONST Derived,typename IvcType<Indices>::type,IvcIndex> >::type
|
IndexedView<EIGEN_INDEXED_VIEW_METHOD_CONST Derived,typename IvcType<Indices>::type,IvcIndex> >::type
|
||||||
operator()(const Indices& indices) EIGEN_INDEXED_VIEW_METHOD_CONST
|
operator()(const Indices& indices) EIGEN_INDEXED_VIEW_METHOD_CONST
|
||||||
{
|
{
|
||||||
@ -168,7 +166,7 @@ operator()(const Indices& indices) EIGEN_INDEXED_VIEW_METHOD_CONST
|
|||||||
|
|
||||||
template<typename Indices>
|
template<typename Indices>
|
||||||
typename internal::enable_if<
|
typename internal::enable_if<
|
||||||
(internal::get_compile_time_incr<typename IvcType<Indices>::type>::value==1) && (!internal::is_integral<Indices>::value) && (!Symbolic::is_symbolic<Indices>::value),
|
(internal::get_compile_time_incr<typename IvcType<Indices>::type>::value==1) && (!internal::is_valid_index_type<Indices>::value) && (!Symbolic::is_symbolic<Indices>::value),
|
||||||
VectorBlock<EIGEN_INDEXED_VIEW_METHOD_CONST Derived,internal::array_size<Indices>::value> >::type
|
VectorBlock<EIGEN_INDEXED_VIEW_METHOD_CONST Derived,internal::array_size<Indices>::value> >::type
|
||||||
operator()(const Indices& indices) EIGEN_INDEXED_VIEW_METHOD_CONST
|
operator()(const Indices& indices) EIGEN_INDEXED_VIEW_METHOD_CONST
|
||||||
{
|
{
|
||||||
|
@ -366,6 +366,11 @@ void check_indexed_view()
|
|||||||
VERIFY( is_same_eq( cA.middleRows<3>(1), cA.middleRows(1,fix<3>)) );
|
VERIFY( is_same_eq( cA.middleRows<3>(1), cA.middleRows(1,fix<3>)) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check compilation of enums as index type:
|
||||||
|
enum { X=0, Y=1 };
|
||||||
|
a(X) = 1;
|
||||||
|
A(X,Y) = 1;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_indexed_view()
|
void test_indexed_view()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user