Decouple Cwise*Op evaluators from expression objects

This commit is contained in:
Jitse Niesen 2011-04-05 18:30:51 +01:00
parent 11ea81858a
commit eae5a6bb09
2 changed files with 48 additions and 30 deletions

View File

@ -201,28 +201,32 @@ struct evaluator_impl<CwiseNullaryOp<NullaryOp,PlainObjectType> >
{ {
typedef CwiseNullaryOp<NullaryOp,PlainObjectType> NullaryOpType; typedef CwiseNullaryOp<NullaryOp,PlainObjectType> NullaryOpType;
evaluator_impl(const NullaryOpType& n) : m_nullaryOp(n) {} evaluator_impl(const NullaryOpType& n)
: m_functor(n.functor())
{ }
typedef typename NullaryOpType::Index Index; typedef typename NullaryOpType::Index Index;
typedef typename NullaryOpType::CoeffReturnType CoeffReturnType;
typedef typename NullaryOpType::PacketScalar PacketScalar;
typename NullaryOpType::CoeffReturnType coeff(Index i, Index j) const CoeffReturnType coeff(Index row, Index col) const
{ {
return m_nullaryOp.coeff(i, j); return m_functor(row, col);
} }
typename NullaryOpType::CoeffReturnType coeff(Index index) const CoeffReturnType coeff(Index index) const
{ {
return m_nullaryOp.coeff(index); return m_functor(index);
} }
template<int LoadMode> template<int LoadMode>
typename NullaryOpType::PacketScalar packet(Index index) const PacketScalar packet(Index index) const
{ {
return m_nullaryOp.template packet<LoadMode>(index); return m_functor.packetOp(index);
} }
protected: protected:
const NullaryOpType& m_nullaryOp; const NullaryOp m_functor;
}; };
// -------------------- CwiseUnaryOp -------------------- // -------------------- CwiseUnaryOp --------------------
@ -232,34 +236,39 @@ struct evaluator_impl<CwiseUnaryOp<UnaryOp, ArgType> >
{ {
typedef CwiseUnaryOp<UnaryOp, ArgType> UnaryOpType; typedef CwiseUnaryOp<UnaryOp, ArgType> UnaryOpType;
evaluator_impl(const UnaryOpType& op) : m_unaryOp(op), m_argImpl(op.nestedExpression()) {} evaluator_impl(const UnaryOpType& op)
: m_functor(op.functor()),
m_argImpl(op.nestedExpression())
{ }
typedef typename UnaryOpType::Index Index; typedef typename UnaryOpType::Index Index;
typedef typename UnaryOpType::CoeffReturnType CoeffReturnType;
typedef typename UnaryOpType::PacketScalar PacketScalar;
typename UnaryOpType::CoeffReturnType coeff(Index i, Index j) const CoeffReturnType coeff(Index row, Index col) const
{ {
return m_unaryOp.functor()(m_argImpl.coeff(i, j)); return m_functor(m_argImpl.coeff(row, col));
} }
typename UnaryOpType::CoeffReturnType coeff(Index index) const CoeffReturnType coeff(Index index) const
{ {
return m_unaryOp.functor()(m_argImpl.coeff(index)); return m_functor(m_argImpl.coeff(index));
} }
template<int LoadMode> template<int LoadMode>
typename UnaryOpType::PacketScalar packet(Index index) const PacketScalar packet(Index row, Index col) const
{ {
return m_unaryOp.functor().packetOp(m_argImpl.template packet<LoadMode>(index)); return m_functor.packetOp(m_argImpl.template packet<LoadMode>(row, col));
} }
template<int LoadMode> template<int LoadMode>
typename UnaryOpType::PacketScalar packet(Index row, Index col) const PacketScalar packet(Index index) const
{ {
return m_unaryOp.functor().packetOp(m_argImpl.template packet<LoadMode>(row, col)); return m_functor.packetOp(m_argImpl.template packet<LoadMode>(index));
} }
protected: protected:
const UnaryOpType m_unaryOp; const UnaryOp m_functor;
typename evaluator<ArgType>::type m_argImpl; typename evaluator<ArgType>::type m_argImpl;
}; };
@ -270,36 +279,42 @@ struct evaluator_impl<CwiseBinaryOp<BinaryOp, Lhs, Rhs> >
{ {
typedef CwiseBinaryOp<BinaryOp, Lhs, Rhs> BinaryOpType; typedef CwiseBinaryOp<BinaryOp, Lhs, Rhs> BinaryOpType;
evaluator_impl(const BinaryOpType& xpr) : m_binaryOp(xpr), m_lhsImpl(xpr.lhs()), m_rhsImpl(xpr.rhs()) {} evaluator_impl(const BinaryOpType& xpr)
: m_functor(xpr.functor()),
m_lhsImpl(xpr.lhs()),
m_rhsImpl(xpr.rhs())
{ }
typedef typename BinaryOpType::Index Index; typedef typename BinaryOpType::Index Index;
typedef typename BinaryOpType::CoeffReturnType CoeffReturnType;
typedef typename BinaryOpType::PacketScalar PacketScalar;
typename BinaryOpType::CoeffReturnType coeff(Index i, Index j) const CoeffReturnType coeff(Index row, Index col) const
{ {
return m_binaryOp.functor()(m_lhsImpl.coeff(i, j), m_rhsImpl.coeff(i, j)); return m_functor(m_lhsImpl.coeff(row, col), m_rhsImpl.coeff(row, col));
} }
typename BinaryOpType::CoeffReturnType coeff(Index index) const CoeffReturnType coeff(Index index) const
{ {
return m_binaryOp.functor()(m_lhsImpl.coeff(index), m_rhsImpl.coeff(index)); return m_functor(m_lhsImpl.coeff(index), m_rhsImpl.coeff(index));
} }
template<int LoadMode> template<int LoadMode>
typename BinaryOpType::PacketScalar packet(Index index) const PacketScalar packet(Index row, Index col) const
{ {
return m_binaryOp.functor().packetOp(m_lhsImpl.template packet<LoadMode>(index), return m_functor.packetOp(m_lhsImpl.template packet<LoadMode>(row, col),
m_rhsImpl.template packet<LoadMode>(index));
}
template<int LoadMode>
typename BinaryOpType::PacketScalar packet(Index row, Index col) const
{
return m_binaryOp.functor().packetOp(m_lhsImpl.template packet<LoadMode>(row, col),
m_rhsImpl.template packet<LoadMode>(row, col)); m_rhsImpl.template packet<LoadMode>(row, col));
} }
template<int LoadMode>
PacketScalar packet(Index index) const
{
return m_functor.packetOp(m_lhsImpl.template packet<LoadMode>(index),
m_rhsImpl.template packet<LoadMode>(index));
}
protected: protected:
const BinaryOpType& m_binaryOp; const BinaryOp m_functor;
typename evaluator<Lhs>::type m_lhsImpl; typename evaluator<Lhs>::type m_lhsImpl;
typename evaluator<Rhs>::type m_rhsImpl; typename evaluator<Rhs>::type m_rhsImpl;
}; };

View File

@ -101,6 +101,9 @@ class CwiseNullaryOp : internal::no_assignment_operator,
return m_functor.packetOp(index); return m_functor.packetOp(index);
} }
/** \returns the functor representing the nullary operation */
const NullaryOp& functor() const { return m_functor; }
protected: protected:
const internal::variable_if_dynamic<Index, RowsAtCompileTime> m_rows; const internal::variable_if_dynamic<Index, RowsAtCompileTime> m_rows;
const internal::variable_if_dynamic<Index, ColsAtCompileTime> m_cols; const internal::variable_if_dynamic<Index, ColsAtCompileTime> m_cols;