10 #ifndef EIGEN_ASSIGNMENT_FUNCTORS_H
11 #define EIGEN_ASSIGNMENT_FUNCTORS_H
21 template<
typename Scalar>
struct assign_op {
23 EIGEN_EMPTY_STRUCT_CTOR(assign_op)
24 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void assignCoeff(Scalar& a, const Scalar& b)
const { a = b; }
26 template<
int Alignment,
typename Packet>
27 EIGEN_STRONG_INLINE
void assignPacket(Scalar* a,
const Packet& b)
const
28 { internal::pstoret<Scalar,Packet,Alignment>(a,b); }
30 template<
typename Scalar>
31 struct functor_traits<assign_op<Scalar> > {
33 Cost = NumTraits<Scalar>::ReadCost,
34 PacketAccess = packet_traits<Scalar>::Vectorizable
42 template<
typename Scalar>
struct add_assign_op {
44 EIGEN_EMPTY_STRUCT_CTOR(add_assign_op)
45 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void assignCoeff(Scalar& a, const Scalar& b)
const { a += b; }
47 template<
int Alignment,
typename Packet>
48 EIGEN_STRONG_INLINE
void assignPacket(Scalar* a,
const Packet& b)
const
49 { internal::pstoret<Scalar,Packet,Alignment>(a,internal::padd(internal::ploadt<Packet,Alignment>(a),b)); }
51 template<
typename Scalar>
52 struct functor_traits<add_assign_op<Scalar> > {
54 Cost = NumTraits<Scalar>::ReadCost + NumTraits<Scalar>::AddCost,
55 PacketAccess = packet_traits<Scalar>::HasAdd
63 template<
typename Scalar>
struct sub_assign_op {
65 EIGEN_EMPTY_STRUCT_CTOR(sub_assign_op)
66 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void assignCoeff(Scalar& a, const Scalar& b)
const { a -= b; }
68 template<
int Alignment,
typename Packet>
69 EIGEN_STRONG_INLINE
void assignPacket(Scalar* a,
const Packet& b)
const
70 { internal::pstoret<Scalar,Packet,Alignment>(a,internal::psub(internal::ploadt<Packet,Alignment>(a),b)); }
72 template<
typename Scalar>
73 struct functor_traits<sub_assign_op<Scalar> > {
75 Cost = NumTraits<Scalar>::ReadCost + NumTraits<Scalar>::AddCost,
76 PacketAccess = packet_traits<Scalar>::HasSub
84 template<
typename DstScalar,
typename SrcScalar=DstScalar>
85 struct mul_assign_op {
87 EIGEN_EMPTY_STRUCT_CTOR(mul_assign_op)
88 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void assignCoeff(DstScalar& a, const SrcScalar& b)
const { a *= b; }
90 template<
int Alignment,
typename Packet>
91 EIGEN_STRONG_INLINE
void assignPacket(DstScalar* a,
const Packet& b)
const
92 { internal::pstoret<DstScalar,Packet,Alignment>(a,internal::pmul(internal::ploadt<Packet,Alignment>(a),b)); }
94 template<
typename DstScalar,
typename SrcScalar>
95 struct functor_traits<mul_assign_op<DstScalar,SrcScalar> > {
97 Cost = NumTraits<DstScalar>::ReadCost + NumTraits<DstScalar>::MulCost,
98 PacketAccess = is_same<DstScalar,SrcScalar>::value && packet_traits<DstScalar>::HasMul
101 template<
typename DstScalar,
typename SrcScalar>
struct functor_is_product_like<mul_assign_op<DstScalar,SrcScalar> > {
enum { ret = 1 }; };
107 template<
typename Scalar>
struct div_assign_op {
109 EIGEN_EMPTY_STRUCT_CTOR(div_assign_op)
110 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void assignCoeff(Scalar& a, const Scalar& b)
const { a /= b; }
112 template<
int Alignment,
typename Packet>
113 EIGEN_STRONG_INLINE
void assignPacket(Scalar* a,
const Packet& b)
const
114 { internal::pstoret<Scalar,Packet,Alignment>(a,internal::pdiv(internal::ploadt<Packet,Alignment>(a),b)); }
116 template<
typename Scalar>
117 struct functor_traits<div_assign_op<Scalar> > {
119 Cost = NumTraits<Scalar>::ReadCost + NumTraits<Scalar>::MulCost,
120 PacketAccess = packet_traits<Scalar>::HasDiv
140 template<
typename Scalar>
struct swap_assign_op {
142 EIGEN_EMPTY_STRUCT_CTOR(swap_assign_op)
143 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void assignCoeff(Scalar& a, const Scalar& b)
const
147 Scalar t=b;
const_cast<Scalar&
>(b)=a; a=t;
150 swap(a,const_cast<Scalar&>(b));
154 template<
typename Scalar>
155 struct functor_traits<swap_assign_op<Scalar> > {
157 Cost = 3 * NumTraits<Scalar>::ReadCost,
158 PacketAccess = packet_traits<Scalar>::Vectorizable
166 #endif // EIGEN_ASSIGNMENT_FUNCTORS_H
Definition: Eigen_Colamd.h:54