diff --git a/Eigen/src/Core/ArithmeticSequence.h b/Eigen/src/Core/ArithmeticSequence.h index b84930a19..1f3a9e583 100644 --- a/Eigen/src/Core/ArithmeticSequence.h +++ b/Eigen/src/Core/ArithmeticSequence.h @@ -28,30 +28,31 @@ template struct aseq_negate > { // Compilation error in the following case: template<> struct aseq_negate > {}; -template::value, bool SizeIsSymbolic =Symbolic::is_symbolic::value> struct aseq_reverse_first_type { typedef Index type; }; -template -struct aseq_reverse_first_type { +template +struct aseq_reverse_first_type { typedef Symbolic::AddExpr, - Symbolic::ValueExpr> + Symbolic::ProductExpr > >, + Symbolic::ValueExpr > > type; }; -template -struct aseq_reverse_first_type { - typedef Symbolic::AddExpr type; +template +struct aseq_reverse_first_type { + typedef Symbolic::AddExpr > type; }; -template -struct aseq_reverse_first_type { - typedef Symbolic::AddExpr,Symbolic::ValueExpr>, - Symbolic::ValueExpr> type; +template +struct aseq_reverse_first_type { + typedef Symbolic::AddExpr > >, + Symbolic::ValueExpr >, + Symbolic::ValueExpr<> > type; }; #endif @@ -127,17 +128,17 @@ protected: public: #if EIGEN_HAS_CXX11 - auto reverse() const -> decltype(Eigen::seqN(m_first+(m_size-1)*Index(m_incr),m_size,-m_incr)) { - return seqN(m_first+(m_size-1)*Index(m_incr),m_size,-m_incr); + auto reverse() const -> decltype(Eigen::seqN(m_first+(m_size+fix<-1>())*m_incr,m_size,-m_incr)) { + return seqN(m_first+(m_size+fix<-1>())*m_incr,m_size,-m_incr); } #else protected: typedef typename internal::aseq_negate::type ReverseIncrType; - typedef typename internal::aseq_reverse_first_type::type ReverseFirstType; + typedef typename internal::aseq_reverse_first_type::type ReverseFirstType; public: ArithmeticSequence reverse() const { - return seqN(m_first+(m_size-1)*Index(m_incr),m_size,-m_incr); + return seqN(m_first+(m_size+fix<-1>())*m_incr,m_size,-m_incr); } #endif }; @@ -204,38 +205,40 @@ auto seq(FirstType f, LastType l, IncrType incr) return seqN(f,(l-f+CleanedIncrType(incr))/CleanedIncrType(incr),CleanedIncrType(incr)); } #else + template typename internal::enable_if::value || Symbolic::is_symbolic::value), ArithmeticSequence::type,Index> >::type seq(FirstType f, LastType l) { - return seqN(f,(l-f+1)); + return seqN(f,(l-f+fix<1>())); } template typename internal::enable_if::value, - ArithmeticSequence,Symbolic::ValueExpr>, - Symbolic::ValueExpr> > >::type + ArithmeticSequence,Symbolic::ValueExpr<> >, + Symbolic::ValueExpr > > > >::type seq(const Symbolic::BaseExpr &f, LastType l) { - return seqN(f.derived(),(l-f.derived()+1)); + return seqN(f.derived(),(l-f.derived()+fix<1>())); } template typename internal::enable_if::value, ArithmeticSequence::type, - Symbolic::AddExpr,Symbolic::ValueExpr> > >::type + Symbolic::AddExpr >, + Symbolic::ValueExpr > > > >::type seq(FirstType f, const Symbolic::BaseExpr &l) { - return seqN(f,(l.derived()-f+1)); + return seqN(f,(l.derived()-f+fix<1>())); } template ArithmeticSequence >,Symbolic::ValueExpr> > + Symbolic::AddExpr >,Symbolic::ValueExpr > > > seq(const Symbolic::BaseExpr &f, const Symbolic::BaseExpr &l) { - return seqN(f.derived(),(l.derived()-f.derived()+1)); + return seqN(f.derived(),(l.derived()-f.derived()+fix<1>())); } @@ -252,9 +255,9 @@ template typename internal::enable_if::value, ArithmeticSequence, - Symbolic::ValueExpr>, - Symbolic::ValueExpr>, - Symbolic::ValueExpr>, + Symbolic::ValueExpr<> >, + Symbolic::ValueExpr::type> >, + Symbolic::ValueExpr::type> >, typename internal::cleanup_seq_incr::type> >::type seq(const Symbolic::BaseExpr &f, LastType l, IncrType incr) { @@ -265,9 +268,9 @@ seq(const Symbolic::BaseExpr &f, LastType l, IncrType incr) template typename internal::enable_if::value, ArithmeticSequence::type, - Symbolic::QuotientExpr, - Symbolic::ValueExpr>, - Symbolic::ValueExpr>, + Symbolic::QuotientExpr >, + Symbolic::ValueExpr::type> >, + Symbolic::ValueExpr::type> >, typename internal::cleanup_seq_incr::type> >::type seq(FirstType f, const Symbolic::BaseExpr &l, IncrType incr) { @@ -279,8 +282,8 @@ template ArithmeticSequence >, - Symbolic::ValueExpr>, - Symbolic::ValueExpr>, + Symbolic::ValueExpr::type> >, + Symbolic::ValueExpr::type> >, typename internal::cleanup_seq_incr::type> seq(const Symbolic::BaseExpr &f, const Symbolic::BaseExpr &l, IncrType incr) { diff --git a/Eigen/src/Core/util/IndexedViewHelper.h b/Eigen/src/Core/util/IndexedViewHelper.h index 5dca1926c..1171b2b2e 100644 --- a/Eigen/src/Core/util/IndexedViewHelper.h +++ b/Eigen/src/Core/util/IndexedViewHelper.h @@ -60,7 +60,7 @@ static const auto end = last+1; #else // Using a FixedExpr<1> expression is important here to make sure the compiler // can fully optimize the computation starting indices with zero overhead. -static const Symbolic::AddExpr,Symbolic::FixedExpr<1> > end(last+fix<1>()); +static const Symbolic::AddExpr,Symbolic::ValueExpr > > end(last+fix<1>()); #endif } // end namespace placeholders diff --git a/Eigen/src/Core/util/SymbolicIndex.h b/Eigen/src/Core/util/SymbolicIndex.h index fcc5921e6..5e9465db8 100644 --- a/Eigen/src/Core/util/SymbolicIndex.h +++ b/Eigen/src/Core/util/SymbolicIndex.h @@ -46,23 +46,24 @@ template class AddExpr; template class ProductExpr; template class QuotientExpr; -// A simple wrapper around an Index to provide the eval method. +// A simple wrapper around an integral value to provide the eval method. // We could also use a free-function symbolic_eval... +template class ValueExpr { public: - ValueExpr(Index val) : m_value(val) {} + ValueExpr(IndexType val) : m_value(val) {} template - Index eval_impl(const T&) const { return m_value; } + IndexType eval_impl(const T&) const { return m_value; } protected: - Index m_value; + IndexType m_value; }; -// Simple wrapper around a compile-time value, +// Specialization for compile-time value, // It is similar to ValueExpr(N) but this version helps the compiler to generate better code. template -class FixedExpr { +class ValueExpr > { public: - FixedExpr() {} + ValueExpr() {} template Index eval_impl(const T&) const { return N; } }; @@ -94,50 +95,49 @@ public: NegateExpr operator-() const { return NegateExpr(derived()); } - AddExpr operator+(Index b) const - { return AddExpr(derived(), b); } - AddExpr operator-(Index a) const - { return AddExpr(derived(), -a); } - ProductExpr operator*(Index a) const - { return ProductExpr(derived(),a); } - QuotientExpr operator/(Index a) const - { return QuotientExpr(derived(),a); } - - friend AddExpr operator+(Index a, const BaseExpr& b) - { return AddExpr(b.derived(), a); } - friend AddExpr,ValueExpr> operator-(Index a, const BaseExpr& b) - { return AddExpr,ValueExpr>(-b.derived(), a); } - friend ProductExpr operator*(Index a, const BaseExpr& b) - { return ProductExpr(a,b.derived()); } - friend QuotientExpr operator/(Index a, const BaseExpr& b) - { return QuotientExpr(a,b.derived()); } + AddExpr > operator+(Index b) const + { return AddExpr >(derived(), b); } + AddExpr > operator-(Index a) const + { return AddExpr >(derived(), -a); } + ProductExpr > operator*(Index a) const + { return ProductExpr >(derived(),a); } + QuotientExpr > operator/(Index a) const + { return QuotientExpr >(derived(),a); } + friend AddExpr > operator+(Index a, const BaseExpr& b) + { return AddExpr >(b.derived(), a); } + friend AddExpr,ValueExpr<> > operator-(Index a, const BaseExpr& b) + { return AddExpr,ValueExpr<> >(-b.derived(), a); } + friend ProductExpr,Derived> operator*(Index a, const BaseExpr& b) + { return ProductExpr,Derived>(a,b.derived()); } + friend QuotientExpr,Derived> operator/(Index a, const BaseExpr& b) + { return QuotientExpr,Derived>(a,b.derived()); } template - AddExpr > operator+(internal::fix_t) const - { return AddExpr >(derived(), FixedExpr()); } + AddExpr > > operator+(internal::fix_t) const + { return AddExpr > >(derived(), ValueExpr >()); } template - AddExpr > operator-(internal::fix_t) const - { return AddExpr >(derived(), FixedExpr<-N>()); } + AddExpr > > operator-(internal::fix_t) const + { return AddExpr > >(derived(), ValueExpr >()); } template - ProductExpr > operator*(internal::fix_t) const - { return ProductExpr >(derived(),FixedExpr()); } + ProductExpr > > operator*(internal::fix_t) const + { return ProductExpr > >(derived(),ValueExpr >()); } template - QuotientExpr > operator/(internal::fix_t) const - { return QuotientExpr >(derived(),FixedExpr()); } + QuotientExpr > > operator/(internal::fix_t) const + { return QuotientExpr > >(derived(),ValueExpr >()); } template - friend AddExpr > operator+(internal::fix_t, const BaseExpr& b) - { return AddExpr >(b.derived(), FixedExpr()); } + friend AddExpr > > operator+(internal::fix_t, const BaseExpr& b) + { return AddExpr > >(b.derived(), ValueExpr >()); } template - friend AddExpr,FixedExpr > operator-(internal::fix_t, const BaseExpr& b) - { return AddExpr,FixedExpr >(-b.derived(), FixedExpr()); } + friend AddExpr,ValueExpr > > operator-(internal::fix_t, const BaseExpr& b) + { return AddExpr,ValueExpr > >(-b.derived(), ValueExpr >()); } template - friend ProductExpr,Derived> operator*(internal::fix_t, const BaseExpr& b) - { return ProductExpr,Derived>(FixedExpr(),b.derived()); } + friend ProductExpr >,Derived> operator*(internal::fix_t, const BaseExpr& b) + { return ProductExpr >,Derived>(ValueExpr >(),b.derived()); } template - friend QuotientExpr,Derived> operator/(internal::fix_t, const BaseExpr& b) - { return QuotientExpr ,Derived>(FixedExpr(),b.derived()); } + friend QuotientExpr >,Derived> operator/(internal::fix_t, const BaseExpr& b) + { return QuotientExpr > ,Derived>(ValueExpr >(),b.derived()); } template