Eigen  3.2.91
AssignmentFunctors.h
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>
5 //
6 // This Source Code Form is subject to the terms of the Mozilla
7 // Public License v. 2.0. If a copy of the MPL was not distributed
8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 
10 #ifndef EIGEN_ASSIGNMENT_FUNCTORS_H
11 #define EIGEN_ASSIGNMENT_FUNCTORS_H
12 
13 namespace Eigen {
14 
15 namespace internal {
16 
21 template<typename Scalar> struct assign_op {
22 
23  EIGEN_EMPTY_STRUCT_CTOR(assign_op)
24  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(Scalar& a, const Scalar& b) const { a = b; }
25 
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); }
29 };
30 template<typename Scalar>
31 struct functor_traits<assign_op<Scalar> > {
32  enum {
33  Cost = NumTraits<Scalar>::ReadCost,
34  PacketAccess = packet_traits<Scalar>::Vectorizable
35  };
36 };
37 
42 template<typename Scalar> struct add_assign_op {
43 
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; }
46 
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)); }
50 };
51 template<typename Scalar>
52 struct functor_traits<add_assign_op<Scalar> > {
53  enum {
54  Cost = NumTraits<Scalar>::ReadCost + NumTraits<Scalar>::AddCost,
55  PacketAccess = packet_traits<Scalar>::HasAdd
56  };
57 };
58 
63 template<typename Scalar> struct sub_assign_op {
64 
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; }
67 
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)); }
71 };
72 template<typename Scalar>
73 struct functor_traits<sub_assign_op<Scalar> > {
74  enum {
75  Cost = NumTraits<Scalar>::ReadCost + NumTraits<Scalar>::AddCost,
76  PacketAccess = packet_traits<Scalar>::HasSub
77  };
78 };
79 
84 template<typename DstScalar, typename SrcScalar=DstScalar>
85 struct mul_assign_op {
86 
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; }
89 
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)); }
93 };
94 template<typename DstScalar, typename SrcScalar>
95 struct functor_traits<mul_assign_op<DstScalar,SrcScalar> > {
96  enum {
97  Cost = NumTraits<DstScalar>::ReadCost + NumTraits<DstScalar>::MulCost,
98  PacketAccess = is_same<DstScalar,SrcScalar>::value && packet_traits<DstScalar>::HasMul
99  };
100 };
101 template<typename DstScalar,typename SrcScalar> struct functor_is_product_like<mul_assign_op<DstScalar,SrcScalar> > { enum { ret = 1 }; };
102 
107 template<typename Scalar> struct div_assign_op {
108 
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; }
111 
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)); }
115 };
116 template<typename Scalar>
117 struct functor_traits<div_assign_op<Scalar> > {
118  enum {
119  Cost = NumTraits<Scalar>::ReadCost + NumTraits<Scalar>::MulCost,
120  PacketAccess = packet_traits<Scalar>::HasDiv
121  };
122 };
123 
124 
140 template<typename Scalar> struct swap_assign_op {
141 
142  EIGEN_EMPTY_STRUCT_CTOR(swap_assign_op)
143  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(Scalar& a, const Scalar& b) const
144  {
145 #ifdef __CUDACC__
146  // FIXME is there some kind of cuda::swap?
147  Scalar t=b; const_cast<Scalar&>(b)=a; a=t;
148 #else
149  using std::swap;
150  swap(a,const_cast<Scalar&>(b));
151 #endif
152  }
153 };
154 template<typename Scalar>
155 struct functor_traits<swap_assign_op<Scalar> > {
156  enum {
157  Cost = 3 * NumTraits<Scalar>::ReadCost,
158  PacketAccess = packet_traits<Scalar>::Vectorizable
159  };
160 };
161 
162 } // namespace internal
163 
164 } // namespace Eigen
165 
166 #endif // EIGEN_ASSIGNMENT_FUNCTORS_H
Definition: LDLT.h:16
Definition: Eigen_Colamd.h:54