mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-08-12 19:59:05 +08:00
bug #1231: fix compilation regression regarding complex_array/=real_array and add respective unit tests
This commit is contained in:
parent
21d692d054
commit
84df9142e7
@ -217,7 +217,7 @@ template<typename OtherDerived>
|
|||||||
EIGEN_STRONG_INLINE Derived &
|
EIGEN_STRONG_INLINE Derived &
|
||||||
ArrayBase<Derived>::operator/=(const ArrayBase<OtherDerived>& other)
|
ArrayBase<Derived>::operator/=(const ArrayBase<OtherDerived>& other)
|
||||||
{
|
{
|
||||||
call_assignment(derived(), other.derived(), internal::div_assign_op<Scalar>());
|
call_assignment(derived(), other.derived(), internal::div_assign_op<Scalar,typename OtherDerived::Scalar>());
|
||||||
return derived();
|
return derived();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,23 +104,23 @@ template<typename DstScalar,typename SrcScalar> struct functor_is_product_like<m
|
|||||||
* \brief Template functor for scalar/packet assignment with diviving
|
* \brief Template functor for scalar/packet assignment with diviving
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
template<typename Scalar> struct div_assign_op {
|
template<typename DstScalar, typename SrcScalar=DstScalar> struct div_assign_op {
|
||||||
|
|
||||||
EIGEN_EMPTY_STRUCT_CTOR(div_assign_op)
|
EIGEN_EMPTY_STRUCT_CTOR(div_assign_op)
|
||||||
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(Scalar& a, const Scalar& b) const { a /= b; }
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar& a, const SrcScalar& b) const { a /= b; }
|
||||||
|
|
||||||
template<int Alignment, typename Packet>
|
template<int Alignment, typename Packet>
|
||||||
EIGEN_STRONG_INLINE void assignPacket(Scalar* a, const Packet& b) const
|
EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const
|
||||||
{ internal::pstoret<Scalar,Packet,Alignment>(a,internal::pdiv(internal::ploadt<Packet,Alignment>(a),b)); }
|
{ internal::pstoret<DstScalar,Packet,Alignment>(a,internal::pdiv(internal::ploadt<Packet,Alignment>(a),b)); }
|
||||||
};
|
};
|
||||||
template<typename Scalar>
|
template<typename DstScalar, typename SrcScalar>
|
||||||
struct functor_traits<div_assign_op<Scalar> > {
|
struct functor_traits<div_assign_op<DstScalar,SrcScalar> > {
|
||||||
enum {
|
enum {
|
||||||
Cost = NumTraits<Scalar>::ReadCost + NumTraits<Scalar>::MulCost,
|
Cost = NumTraits<DstScalar>::ReadCost + NumTraits<DstScalar>::MulCost,
|
||||||
PacketAccess = packet_traits<Scalar>::HasDiv
|
PacketAccess = is_same<DstScalar,SrcScalar>::value && packet_traits<DstScalar>::HasDiv
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
template<typename DstScalar,typename SrcScalar> struct functor_is_product_like<div_assign_op<DstScalar,SrcScalar> > { enum { ret = 1 }; };
|
||||||
|
|
||||||
/** \internal
|
/** \internal
|
||||||
* \brief Template functor for scalar/packet assignment with swapping
|
* \brief Template functor for scalar/packet assignment with swapping
|
||||||
|
@ -184,6 +184,18 @@ template<int SizeAtCompileType> void mixingtypes(int size = SizeAtCompileType)
|
|||||||
Mat_cd((scd * mcd * md.template cast<CD>().eval()).template triangularView<Upper>()));
|
Mat_cd((scd * mcd * md.template cast<CD>().eval()).template triangularView<Upper>()));
|
||||||
VERIFY_IS_APPROX(Mat_cd(rcd.template triangularView<Upper>() = scd * md * mcd),
|
VERIFY_IS_APPROX(Mat_cd(rcd.template triangularView<Upper>() = scd * md * mcd),
|
||||||
Mat_cd((scd * md.template cast<CD>().eval() * mcd).template triangularView<Upper>()));
|
Mat_cd((scd * md.template cast<CD>().eval() * mcd).template triangularView<Upper>()));
|
||||||
|
|
||||||
|
|
||||||
|
VERIFY_IS_APPROX( md.array() * mcd.array(), md.template cast<CD>().eval().array() * mcd.array() );
|
||||||
|
VERIFY_IS_APPROX( mcd.array() * md.array(), mcd.array() * md.template cast<CD>().eval().array() );
|
||||||
|
|
||||||
|
// VERIFY_IS_APPROX( md.array() / mcd.array(), md.template cast<CD>().eval().array() / mcd.array() );
|
||||||
|
VERIFY_IS_APPROX( mcd.array() / md.array(), mcd.array() / md.template cast<CD>().eval().array() );
|
||||||
|
|
||||||
|
rcd = mcd;
|
||||||
|
VERIFY_IS_APPROX( rcd.array() *= md.array(), mcd.array() * md.template cast<CD>().eval().array() );
|
||||||
|
rcd = mcd;
|
||||||
|
VERIFY_IS_APPROX( rcd.array() /= md.array(), mcd.array() / md.template cast<CD>().eval().array() );
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_mixingtypes()
|
void test_mixingtypes()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user