File indexing completed on 2025-12-16 10:13:27
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #ifndef EIGEN_ASSIGNMENT_FUNCTORS_H
0011 #define EIGEN_ASSIGNMENT_FUNCTORS_H
0012
0013 namespace Eigen {
0014
0015 namespace internal {
0016
0017
0018
0019
0020
0021 template<typename DstScalar,typename SrcScalar> struct assign_op {
0022
0023 EIGEN_EMPTY_STRUCT_CTOR(assign_op)
0024 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar& a, const SrcScalar& b) const { a = b; }
0025
0026 template<int Alignment, typename Packet>
0027 EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const
0028 { internal::pstoret<DstScalar,Packet,Alignment>(a,b); }
0029 };
0030
0031
0032 template<typename DstScalar> struct assign_op<DstScalar,void> {};
0033
0034 template<typename DstScalar,typename SrcScalar>
0035 struct functor_traits<assign_op<DstScalar,SrcScalar> > {
0036 enum {
0037 Cost = NumTraits<DstScalar>::ReadCost,
0038 PacketAccess = is_same<DstScalar,SrcScalar>::value && packet_traits<DstScalar>::Vectorizable && packet_traits<SrcScalar>::Vectorizable
0039 };
0040 };
0041
0042
0043
0044
0045
0046 template<typename DstScalar,typename SrcScalar> struct add_assign_op {
0047
0048 EIGEN_EMPTY_STRUCT_CTOR(add_assign_op)
0049 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar& a, const SrcScalar& b) const { a += b; }
0050
0051 template<int Alignment, typename Packet>
0052 EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const
0053 { internal::pstoret<DstScalar,Packet,Alignment>(a,internal::padd(internal::ploadt<Packet,Alignment>(a),b)); }
0054 };
0055 template<typename DstScalar,typename SrcScalar>
0056 struct functor_traits<add_assign_op<DstScalar,SrcScalar> > {
0057 enum {
0058 Cost = NumTraits<DstScalar>::ReadCost + NumTraits<DstScalar>::AddCost,
0059 PacketAccess = is_same<DstScalar,SrcScalar>::value && packet_traits<DstScalar>::HasAdd
0060 };
0061 };
0062
0063
0064
0065
0066
0067 template<typename DstScalar,typename SrcScalar> struct sub_assign_op {
0068
0069 EIGEN_EMPTY_STRUCT_CTOR(sub_assign_op)
0070 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar& a, const SrcScalar& b) const { a -= b; }
0071
0072 template<int Alignment, typename Packet>
0073 EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const
0074 { internal::pstoret<DstScalar,Packet,Alignment>(a,internal::psub(internal::ploadt<Packet,Alignment>(a),b)); }
0075 };
0076 template<typename DstScalar,typename SrcScalar>
0077 struct functor_traits<sub_assign_op<DstScalar,SrcScalar> > {
0078 enum {
0079 Cost = NumTraits<DstScalar>::ReadCost + NumTraits<DstScalar>::AddCost,
0080 PacketAccess = is_same<DstScalar,SrcScalar>::value && packet_traits<DstScalar>::HasSub
0081 };
0082 };
0083
0084
0085
0086
0087
0088 template<typename DstScalar, typename SrcScalar=DstScalar>
0089 struct mul_assign_op {
0090
0091 EIGEN_EMPTY_STRUCT_CTOR(mul_assign_op)
0092 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar& a, const SrcScalar& b) const { a *= b; }
0093
0094 template<int Alignment, typename Packet>
0095 EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const
0096 { internal::pstoret<DstScalar,Packet,Alignment>(a,internal::pmul(internal::ploadt<Packet,Alignment>(a),b)); }
0097 };
0098 template<typename DstScalar, typename SrcScalar>
0099 struct functor_traits<mul_assign_op<DstScalar,SrcScalar> > {
0100 enum {
0101 Cost = NumTraits<DstScalar>::ReadCost + NumTraits<DstScalar>::MulCost,
0102 PacketAccess = is_same<DstScalar,SrcScalar>::value && packet_traits<DstScalar>::HasMul
0103 };
0104 };
0105
0106
0107
0108
0109
0110 template<typename DstScalar, typename SrcScalar=DstScalar> struct div_assign_op {
0111
0112 EIGEN_EMPTY_STRUCT_CTOR(div_assign_op)
0113 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar& a, const SrcScalar& b) const { a /= b; }
0114
0115 template<int Alignment, typename Packet>
0116 EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const
0117 { internal::pstoret<DstScalar,Packet,Alignment>(a,internal::pdiv(internal::ploadt<Packet,Alignment>(a),b)); }
0118 };
0119 template<typename DstScalar, typename SrcScalar>
0120 struct functor_traits<div_assign_op<DstScalar,SrcScalar> > {
0121 enum {
0122 Cost = NumTraits<DstScalar>::ReadCost + NumTraits<DstScalar>::MulCost,
0123 PacketAccess = is_same<DstScalar,SrcScalar>::value && packet_traits<DstScalar>::HasDiv
0124 };
0125 };
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142 template<typename Scalar> struct swap_assign_op {
0143
0144 EIGEN_EMPTY_STRUCT_CTOR(swap_assign_op)
0145 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(Scalar& a, const Scalar& b) const
0146 {
0147 #ifdef EIGEN_GPUCC
0148
0149 Scalar t=b; const_cast<Scalar&>(b)=a; a=t;
0150 #else
0151 using std::swap;
0152 swap(a,const_cast<Scalar&>(b));
0153 #endif
0154 }
0155 };
0156 template<typename Scalar>
0157 struct functor_traits<swap_assign_op<Scalar> > {
0158 enum {
0159 Cost = 3 * NumTraits<Scalar>::ReadCost,
0160 PacketAccess =
0161 #if defined(EIGEN_VECTORIZE_AVX) && EIGEN_COMP_CLANG && (EIGEN_COMP_CLANG<800 || defined(__apple_build_version__))
0162
0163
0164
0165
0166 0
0167 #else
0168 packet_traits<Scalar>::Vectorizable
0169 #endif
0170 };
0171 };
0172
0173 }
0174
0175 }
0176
0177 #endif