aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--Eigen/src/Core/ArithmeticSequence.h85
-rw-r--r--test/indexed_view.cpp13
2 files changed, 93 insertions, 5 deletions
diff --git a/Eigen/src/Core/ArithmeticSequence.h b/Eigen/src/Core/ArithmeticSequence.h
index 7c104ad91..6c9cb9ef3 100644
--- a/Eigen/src/Core/ArithmeticSequence.h
+++ b/Eigen/src/Core/ArithmeticSequence.h
@@ -219,7 +219,8 @@ protected:
IncrType m_incr;
};
-template<typename T> struct cleanup_seq_type { typedef T type; };
+template<typename T, typename EnableIf=void> struct cleanup_seq_type { typedef T type; };
+template<typename T> struct cleanup_seq_type<T,typename internal::enable_if<internal::is_integral<T>::value>::type> { typedef Index type; };
template<int N> struct cleanup_seq_type<fix_t<N> > { typedef fix_t<N> type; };
template<int N> struct cleanup_seq_type<fix_t<N> (*)() > { typedef fix_t<N> type; };
@@ -235,10 +236,11 @@ seqN(FirstType first, SizeType size) {
return ArithemeticSequence<typename cleanup_seq_type<FirstType>::type,typename cleanup_seq_type<SizeType>::type>(first,size);
}
+#if EIGEN_HAS_CXX11
template<typename FirstType,typename LastType>
-auto seq(FirstType f, LastType l) -> decltype(seqN(f,(l-f+1)))
+auto seq(FirstType f, LastType l) -> decltype(seqN(f,(l-f+fix<1>())))
{
- return seqN(f,(l-f+1));
+ return seqN(f,(l-f+fix<1>()));
}
template<typename FirstType,typename LastType, typename IncrType>
@@ -248,6 +250,80 @@ auto seq(FirstType f, LastType l, IncrType incr)
typedef typename cleanup_seq_type<IncrType>::type CleanedIncrType;
return seqN(f,(l-f+CleanedIncrType(incr))/CleanedIncrType(incr),CleanedIncrType(incr));
}
+#else
+template<typename FirstType,typename LastType>
+typename internal::enable_if<!(is_symbolic<FirstType>::value || is_symbolic<LastType>::value),
+ ArithemeticSequence<typename cleanup_seq_type<FirstType>::type,Index> >::type
+seq(FirstType f, LastType l)
+{
+ return seqN(f,(l-f+1));
+}
+
+template<typename FirstTypeDerived,typename LastType>
+typename internal::enable_if<!is_symbolic<LastType>::value,
+ ArithemeticSequence<FirstTypeDerived,symbolic_add<symbolic_add<symbolic_negate<FirstTypeDerived>,symbolic_value_wrapper>,symbolic_value_wrapper> > >::type
+seq(const symbolic_index_base<FirstTypeDerived> &f, LastType l)
+{
+ return seqN(f.derived(),(l-f.derived()+1));
+}
+
+template<typename FirstType,typename LastTypeDerived>
+typename internal::enable_if<!is_symbolic<FirstType>::value,
+ ArithemeticSequence<typename cleanup_seq_type<FirstType>::type,symbolic_add<symbolic_add<LastTypeDerived,symbolic_value_wrapper>,symbolic_value_wrapper> > >::type
+seq(FirstType f, const symbolic_index_base<LastTypeDerived> &l)
+{
+ return seqN(f,(l.derived()-f+1));
+}
+
+template<typename FirstTypeDerived,typename LastTypeDerived>
+ArithemeticSequence<FirstTypeDerived,symbolic_add<symbolic_add<LastTypeDerived,symbolic_negate<FirstTypeDerived> >,symbolic_value_wrapper> >
+seq(const symbolic_index_base<FirstTypeDerived> &f, const symbolic_index_base<LastTypeDerived> &l)
+{
+ return seqN(f.derived(),(l.derived()-f.derived()+1));
+}
+
+
+template<typename FirstType,typename LastType, typename IncrType>
+typename internal::enable_if<!(is_symbolic<FirstType>::value || is_symbolic<LastType>::value),
+ ArithemeticSequence<typename cleanup_seq_type<FirstType>::type,Index,typename cleanup_seq_type<IncrType>::type> >::type
+seq(FirstType f, LastType l, IncrType incr)
+{
+ typedef typename cleanup_seq_type<IncrType>::type CleanedIncrType;
+ return seqN(f,(l-f+CleanedIncrType(incr))/CleanedIncrType(incr), incr);
+}
+
+template<typename FirstTypeDerived,typename LastType, typename IncrType>
+typename internal::enable_if<!is_symbolic<LastType>::value,
+ ArithemeticSequence<FirstTypeDerived,
+ symbolic_quotient<symbolic_add<symbolic_add<symbolic_negate<FirstTypeDerived>,symbolic_value_wrapper>,symbolic_value_wrapper>,symbolic_value_wrapper>,
+ typename cleanup_seq_type<IncrType>::type> >::type
+seq(const symbolic_index_base<FirstTypeDerived> &f, LastType l, IncrType incr)
+{
+ typedef typename cleanup_seq_type<IncrType>::type CleanedIncrType;
+ return seqN(f.derived(),(l-f.derived()+CleanedIncrType(incr))/CleanedIncrType(incr), incr);
+}
+
+template<typename FirstType,typename LastTypeDerived, typename IncrType>
+typename internal::enable_if<!is_symbolic<FirstType>::value,
+ ArithemeticSequence<typename cleanup_seq_type<FirstType>::type,
+ symbolic_quotient<symbolic_add<symbolic_add<LastTypeDerived,symbolic_value_wrapper>,symbolic_value_wrapper>,symbolic_value_wrapper>,
+ typename cleanup_seq_type<IncrType>::type> >::type
+seq(FirstType f, const symbolic_index_base<LastTypeDerived> &l, IncrType incr)
+{
+ typedef typename cleanup_seq_type<IncrType>::type CleanedIncrType;
+ return seqN(f,(l.derived()-f+CleanedIncrType(incr))/CleanedIncrType(incr), incr);
+}
+
+template<typename FirstTypeDerived,typename LastTypeDerived, typename IncrType>
+ArithemeticSequence<FirstTypeDerived,
+ symbolic_quotient<symbolic_add<symbolic_add<LastTypeDerived,symbolic_negate<FirstTypeDerived> >,symbolic_value_wrapper>,symbolic_value_wrapper>,
+ typename cleanup_seq_type<IncrType>::type>
+seq(const symbolic_index_base<FirstTypeDerived> &f, const symbolic_index_base<LastTypeDerived> &l, IncrType incr)
+{
+ typedef typename cleanup_seq_type<IncrType>::type CleanedIncrType;
+ return seqN(f.derived(),(l.derived()-f.derived()+CleanedIncrType(incr))/CleanedIncrType(incr), incr);
+}
+#endif
namespace internal {
@@ -255,7 +331,7 @@ template<typename T>
Index size(const T& x) { return x.size(); }
template<typename T,std::size_t N>
-Index size(const T (&x) [N]) { return N; }
+Index size(const T (&) [N]) { return N; }
template<typename T, int XprSize, typename EnableIf = void> struct get_compile_time_size {
enum { value = Dynamic };
@@ -326,7 +402,6 @@ fix_t<N> symbolic2value(fix_t<N> x, Index /*size*/) { return x; }
template<typename Derived>
Index symbolic2value(const symbolic_index_base<Derived> &x, Index size)
{
- Index h=x.derived().eval(symbolic_value_pair<symb_last_tag>(size-1));
return x.derived().eval(symbolic_value_pair<symb_last_tag>(size-1));
}
diff --git a/test/indexed_view.cpp b/test/indexed_view.cpp
index 5c5cb5cde..13eb1ef35 100644
--- a/test/indexed_view.cpp
+++ b/test/indexed_view.cpp
@@ -7,6 +7,11 @@
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#ifdef EIGEN_TEST_PART_2
+// Make sure we also check c++98 implementation
+#define EIGEN_MAX_CPP_VER 03
+#endif
+
#include <valarray>
#include <vector>
#include "main.h"
@@ -144,6 +149,13 @@ void check_indexed_view()
VERIFY_IS_APPROX( A(seq((n-1)/2,(n)/2+3), seqN(2,4)), A(seq(last/2,(last+1)/2+3), seqN(last+2-last,4)) );
VERIFY_IS_APPROX( A(seq(n-2,2,-2), seqN(n-8,4)), A(seq(end-2,2,-2), seqN(end-8,4)) );
+ // Check all combinations of seq:
+ VERIFY_IS_APPROX( A(seq(1,n-1-2,2), seq(1,n-1-2,2)), A(seq(1,last-2,2), seq(1,last-2,fix<2>)) );
+ VERIFY_IS_APPROX( A(seq(n-1-5,n-1-2,2), seq(n-1-5,n-1-2,2)), A(seq(last-5,last-2,2), seq(last-5,last-2,fix<2>)) );
+ VERIFY_IS_APPROX( A(seq(n-1-5,7,2), seq(n-1-5,7,2)), A(seq(last-5,7,2), seq(last-5,7,fix<2>)) );
+ VERIFY_IS_APPROX( A(seq(1,n-1-2), seq(n-1-5,7)), A(seq(1,last-2), seq(last-5,7)) );
+ VERIFY_IS_APPROX( A(seq(n-1-5,n-1-2), seq(n-1-5,n-1-2)), A(seq(last-5,last-2), seq(last-5,last-2)) );
+
#if EIGEN_HAS_CXX11
VERIFY( (A(all, std::array<int,4>{{1,3,2,4}})).ColsAtCompileTime == 4);
@@ -170,5 +182,6 @@ void test_indexed_view()
{
// for(int i = 0; i < g_repeat; i++) {
CALL_SUBTEST_1( check_indexed_view() );
+ CALL_SUBTEST_2( check_indexed_view() );
// }
}