extend quotient functor to allow for mixed types (complex-real)

This commit is contained in:
Gael Guennebaud 2012-07-27 11:56:20 +02:00
parent 9e8d2dea80
commit 6eee2918d9
2 changed files with 15 additions and 7 deletions

View File

@ -204,21 +204,28 @@ struct functor_traits<scalar_difference_op<Scalar> > {
* *
* \sa class CwiseBinaryOp, Cwise::operator/() * \sa class CwiseBinaryOp, Cwise::operator/()
*/ */
template<typename Scalar> struct scalar_quotient_op { template<typename LhsScalar,typename RhsScalar> struct scalar_quotient_op {
enum {
// TODO vectorize mixed product
Vectorizable = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasDiv && packet_traits<RhsScalar>::HasDiv
};
typedef typename scalar_product_traits<LhsScalar,RhsScalar>::ReturnType result_type;
EIGEN_EMPTY_STRUCT_CTOR(scalar_quotient_op) EIGEN_EMPTY_STRUCT_CTOR(scalar_quotient_op)
EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a, const Scalar& b) const { return a / b; } EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return a / b; }
template<typename Packet> template<typename Packet>
EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
{ return internal::pdiv(a,b); } { return internal::pdiv(a,b); }
}; };
template<typename Scalar> template<typename LhsScalar,typename RhsScalar>
struct functor_traits<scalar_quotient_op<Scalar> > { struct functor_traits<scalar_quotient_op<LhsScalar,RhsScalar> > {
enum { enum {
Cost = 2 * NumTraits<Scalar>::MulCost, Cost = (NumTraits<LhsScalar>::MulCost + NumTraits<RhsScalar>::MulCost), // rough estimate!
PacketAccess = packet_traits<Scalar>::HasDiv PacketAccess = scalar_quotient_op<LhsScalar,RhsScalar>::Vectorizable
}; };
}; };
/** \internal /** \internal
* \brief Template functor to compute the and of two booleans * \brief Template functor to compute the and of two booleans
* *
@ -660,6 +667,7 @@ template<typename Scalar> struct functor_has_linear_access<scalar_identity_op<Sc
template<typename Functor> struct functor_allows_mixing_real_and_complex { enum { ret = 0 }; }; template<typename Functor> struct functor_allows_mixing_real_and_complex { enum { ret = 0 }; };
template<typename LhsScalar,typename RhsScalar> struct functor_allows_mixing_real_and_complex<scalar_product_op<LhsScalar,RhsScalar> > { enum { ret = 1 }; }; template<typename LhsScalar,typename RhsScalar> struct functor_allows_mixing_real_and_complex<scalar_product_op<LhsScalar,RhsScalar> > { enum { ret = 1 }; };
template<typename LhsScalar,typename RhsScalar> struct functor_allows_mixing_real_and_complex<scalar_conj_product_op<LhsScalar,RhsScalar> > { enum { ret = 1 }; }; template<typename LhsScalar,typename RhsScalar> struct functor_allows_mixing_real_and_complex<scalar_conj_product_op<LhsScalar,RhsScalar> > { enum { ret = 1 }; };
template<typename LhsScalar,typename RhsScalar> struct functor_allows_mixing_real_and_complex<scalar_quotient_op<LhsScalar,RhsScalar> > { enum { ret = 1 }; };
/** \internal /** \internal

View File

@ -154,7 +154,6 @@ template<typename LhsScalar, typename RhsScalar, bool ConjLhs=false, bool ConjRh
template<typename Scalar> struct scalar_sum_op; template<typename Scalar> struct scalar_sum_op;
template<typename Scalar> struct scalar_difference_op; template<typename Scalar> struct scalar_difference_op;
template<typename LhsScalar,typename RhsScalar> struct scalar_conj_product_op; template<typename LhsScalar,typename RhsScalar> struct scalar_conj_product_op;
template<typename Scalar> struct scalar_quotient_op;
template<typename Scalar> struct scalar_opposite_op; template<typename Scalar> struct scalar_opposite_op;
template<typename Scalar> struct scalar_conjugate_op; template<typename Scalar> struct scalar_conjugate_op;
template<typename Scalar> struct scalar_real_op; template<typename Scalar> struct scalar_real_op;
@ -185,6 +184,7 @@ template<typename Scalar> struct scalar_identity_op;
template<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_product_op; template<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_product_op;
template<typename LhsScalar,typename RhsScalar> struct scalar_multiple2_op; template<typename LhsScalar,typename RhsScalar> struct scalar_multiple2_op;
template<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_quotient_op;
} // end namespace internal } // end namespace internal