mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-06-04 18:54:00 +08:00
Add a Symbolic::FixedExpr helper expression to make sure the compiler fully optimize the usage of last and end.
This commit is contained in:
parent
15471432fe
commit
f3ccbe0419
@ -378,6 +378,7 @@ public:
|
|||||||
|
|
||||||
Index size() const { return (m_last-m_first+m_incr)/m_incr; }
|
Index size() const { return (m_last-m_first+m_incr)/m_incr; }
|
||||||
Index operator[](Index i) const { return m_first + i * m_incr; }
|
Index operator[](Index i) const { return m_first + i * m_incr; }
|
||||||
|
Index first() const { return m_first; }
|
||||||
|
|
||||||
const FirstType& firstObject() const { return m_first; }
|
const FirstType& firstObject() const { return m_first; }
|
||||||
const LastType& lastObject() const { return m_last; }
|
const LastType& lastObject() const { return m_last; }
|
||||||
|
@ -58,7 +58,9 @@ static const Symbolic::SymbolExpr<internal::symbolic_last_tag> last;
|
|||||||
#ifdef EIGEN_PARSED_BY_DOXYGEN
|
#ifdef EIGEN_PARSED_BY_DOXYGEN
|
||||||
static const auto end = last+1;
|
static const auto end = last+1;
|
||||||
#else
|
#else
|
||||||
static const Symbolic::AddExpr<Symbolic::SymbolExpr<internal::symbolic_last_tag>,Symbolic::ValueExpr> end(last+1);
|
// 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::SymbolExpr<internal::symbolic_last_tag>,Symbolic::FixedExpr<1> > end(last+Symbolic::FixedExpr<1>());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
} // end namespace placeholders
|
} // end namespace placeholders
|
||||||
|
@ -124,6 +124,17 @@ struct is_symbolic {
|
|||||||
enum { value = internal::is_convertible<T,BaseExpr<T> >::value };
|
enum { value = internal::is_convertible<T,BaseExpr<T> >::value };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Simple wrapper around a compile-time value,
|
||||||
|
// It is similar to ValueExpr(N) but this version helps the compiler to generate better code.
|
||||||
|
template<int N>
|
||||||
|
class FixedExpr : public BaseExpr<FixedExpr<N> > {
|
||||||
|
public:
|
||||||
|
FixedExpr() {}
|
||||||
|
template<typename T>
|
||||||
|
Index eval_impl(const T&) const { return N; }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/** Represents the actual value of a symbol identified by its tag
|
/** Represents the actual value of a symbol identified by its tag
|
||||||
*
|
*
|
||||||
* It is the return type of SymbolValue::operator=, and most of the time this is only way it is used.
|
* It is the return type of SymbolValue::operator=, and most of the time this is only way it is used.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user