10#ifndef EIGEN_ASSIGNMENT_FUNCTORS_H
11#define EIGEN_ASSIGNMENT_FUNCTORS_H
21template<
typename DstScalar,
typename SrcScalar>
struct assign_op {
23 EIGEN_EMPTY_STRUCT_CTOR(assign_op)
24 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void assignCoeff(DstScalar& a,
const SrcScalar& b)
const { a = b; }
26 template<
int Alignment,
typename Packet>
27 EIGEN_STRONG_INLINE
void assignPacket(DstScalar* a,
const Packet& b)
const
28 { internal::pstoret<DstScalar,Packet,Alignment>(a,b); }
32template<
typename DstScalar>
struct assign_op<DstScalar,void> {};
34template<
typename DstScalar,
typename SrcScalar>
35struct functor_traits<assign_op<DstScalar,SrcScalar> > {
37 Cost = NumTraits<DstScalar>::ReadCost,
38 PacketAccess = is_same<DstScalar,SrcScalar>::value && packet_traits<DstScalar>::Vectorizable && packet_traits<SrcScalar>::Vectorizable
46template<
typename DstScalar,
typename SrcScalar>
struct add_assign_op {
48 EIGEN_EMPTY_STRUCT_CTOR(add_assign_op)
49 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void assignCoeff(DstScalar& a,
const SrcScalar& b)
const { a += b; }
51 template<
int Alignment,
typename Packet>
52 EIGEN_STRONG_INLINE
void assignPacket(DstScalar* a,
const Packet& b)
const
53 { internal::pstoret<DstScalar,Packet,Alignment>(a,internal::padd(internal::ploadt<Packet,Alignment>(a),b)); }
55template<
typename DstScalar,
typename SrcScalar>
56struct functor_traits<add_assign_op<DstScalar,SrcScalar> > {
58 Cost = NumTraits<DstScalar>::ReadCost + NumTraits<DstScalar>::AddCost,
59 PacketAccess = is_same<DstScalar,SrcScalar>::value && packet_traits<DstScalar>::HasAdd
67template<
typename DstScalar,
typename SrcScalar>
struct sub_assign_op {
69 EIGEN_EMPTY_STRUCT_CTOR(sub_assign_op)
70 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void assignCoeff(DstScalar& a,
const SrcScalar& b)
const { a -= b; }
72 template<
int Alignment,
typename Packet>
73 EIGEN_STRONG_INLINE
void assignPacket(DstScalar* a,
const Packet& b)
const
74 { internal::pstoret<DstScalar,Packet,Alignment>(a,internal::psub(internal::ploadt<Packet,Alignment>(a),b)); }
76template<
typename DstScalar,
typename SrcScalar>
77struct functor_traits<sub_assign_op<DstScalar,SrcScalar> > {
79 Cost = NumTraits<DstScalar>::ReadCost + NumTraits<DstScalar>::AddCost,
80 PacketAccess = is_same<DstScalar,SrcScalar>::value && packet_traits<DstScalar>::HasSub
88template<
typename DstScalar,
typename SrcScalar=DstScalar>
91 EIGEN_EMPTY_STRUCT_CTOR(mul_assign_op)
92 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void assignCoeff(DstScalar& a,
const SrcScalar& b)
const { a *= b; }
94 template<
int Alignment,
typename Packet>
95 EIGEN_STRONG_INLINE
void assignPacket(DstScalar* a,
const Packet& b)
const
96 { internal::pstoret<DstScalar,Packet,Alignment>(a,internal::pmul(internal::ploadt<Packet,Alignment>(a),b)); }
98template<
typename DstScalar,
typename SrcScalar>
99struct functor_traits<mul_assign_op<DstScalar,SrcScalar> > {
101 Cost = NumTraits<DstScalar>::ReadCost + NumTraits<DstScalar>::MulCost,
102 PacketAccess = is_same<DstScalar,SrcScalar>::value && packet_traits<DstScalar>::HasMul
110template<
typename DstScalar,
typename SrcScalar=DstScalar>
struct div_assign_op {
112 EIGEN_EMPTY_STRUCT_CTOR(div_assign_op)
113 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void assignCoeff(DstScalar& a,
const SrcScalar& b)
const { a /= b; }
115 template<
int Alignment,
typename Packet>
116 EIGEN_STRONG_INLINE
void assignPacket(DstScalar* a,
const Packet& b)
const
117 { internal::pstoret<DstScalar,Packet,Alignment>(a,internal::pdiv(internal::ploadt<Packet,Alignment>(a),b)); }
119template<
typename DstScalar,
typename SrcScalar>
120struct functor_traits<div_assign_op<DstScalar,SrcScalar> > {
122 Cost = NumTraits<DstScalar>::ReadCost + NumTraits<DstScalar>::MulCost,
123 PacketAccess = is_same<DstScalar,SrcScalar>::value && packet_traits<DstScalar>::HasDiv
142template<
typename Scalar>
struct swap_assign_op {
144 EIGEN_EMPTY_STRUCT_CTOR(swap_assign_op)
145 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void assignCoeff(Scalar& a,
const Scalar& b)
const
149 Scalar t=b;
const_cast<Scalar&
>(b)=a; a=t;
152 swap(a,
const_cast<Scalar&
>(b));
156template<
typename Scalar>
157struct functor_traits<swap_assign_op<Scalar> > {
159 Cost = 3 * NumTraits<Scalar>::ReadCost,
161 #if defined(EIGEN_VECTORIZE_AVX) && EIGEN_COMP_CLANG && (EIGEN_COMP_CLANG<800 || defined(__apple_build_version__))
168 packet_traits<Scalar>::Vectorizable
Namespace containing all symbols from the Eigen library.
Definition: Core:141