MOAB
4.9.3pre
|
00001 // This file is part of Eigen, a lightweight C++ template library 00002 // for linear algebra. 00003 // 00004 // Copyright (C) 2008-2010 Gael Guennebaud <[email protected]> 00005 // 00006 // This Source Code Form is subject to the terms of the Mozilla 00007 // Public License v. 2.0. If a copy of the MPL was not distributed 00008 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 00009 00010 #ifndef EIGEN_ASSIGNMENT_FUNCTORS_H 00011 #define EIGEN_ASSIGNMENT_FUNCTORS_H 00012 00013 namespace Eigen { 00014 00015 namespace internal { 00016 00021 template<typename Scalar> struct assign_op { 00022 00023 EIGEN_EMPTY_STRUCT_CTOR(assign_op) 00024 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(Scalar& a, const Scalar& b) const { a = b; } 00025 00026 template<int Alignment, typename Packet> 00027 EIGEN_STRONG_INLINE void assignPacket(Scalar* a, const Packet& b) const 00028 { internal::pstoret<Scalar,Packet,Alignment>(a,b); } 00029 }; 00030 template<typename Scalar> 00031 struct functor_traits<assign_op<Scalar> > { 00032 enum { 00033 Cost = NumTraits<Scalar>::ReadCost, 00034 PacketAccess = packet_traits<Scalar>::Vectorizable 00035 }; 00036 }; 00037 00042 template<typename Scalar> struct add_assign_op { 00043 00044 EIGEN_EMPTY_STRUCT_CTOR(add_assign_op) 00045 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(Scalar& a, const Scalar& b) const { a += b; } 00046 00047 template<int Alignment, typename Packet> 00048 EIGEN_STRONG_INLINE void assignPacket(Scalar* a, const Packet& b) const 00049 { internal::pstoret<Scalar,Packet,Alignment>(a,internal::padd(internal::ploadt<Packet,Alignment>(a),b)); } 00050 }; 00051 template<typename Scalar> 00052 struct functor_traits<add_assign_op<Scalar> > { 00053 enum { 00054 Cost = NumTraits<Scalar>::ReadCost + NumTraits<Scalar>::AddCost, 00055 PacketAccess = packet_traits<Scalar>::HasAdd 00056 }; 00057 }; 00058 00063 template<typename Scalar> struct sub_assign_op { 00064 00065 EIGEN_EMPTY_STRUCT_CTOR(sub_assign_op) 00066 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(Scalar& a, const Scalar& b) const { a -= b; } 00067 00068 template<int Alignment, typename Packet> 00069 EIGEN_STRONG_INLINE void assignPacket(Scalar* a, const Packet& b) const 00070 { internal::pstoret<Scalar,Packet,Alignment>(a,internal::psub(internal::ploadt<Packet,Alignment>(a),b)); } 00071 }; 00072 template<typename Scalar> 00073 struct functor_traits<sub_assign_op<Scalar> > { 00074 enum { 00075 Cost = NumTraits<Scalar>::ReadCost + NumTraits<Scalar>::AddCost, 00076 PacketAccess = packet_traits<Scalar>::HasSub 00077 }; 00078 }; 00079 00084 template<typename DstScalar, typename SrcScalar=DstScalar> 00085 struct mul_assign_op { 00086 00087 EIGEN_EMPTY_STRUCT_CTOR(mul_assign_op) 00088 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar& a, const SrcScalar& b) const { a *= b; } 00089 00090 template<int Alignment, typename Packet> 00091 EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const 00092 { internal::pstoret<DstScalar,Packet,Alignment>(a,internal::pmul(internal::ploadt<Packet,Alignment>(a),b)); } 00093 }; 00094 template<typename DstScalar, typename SrcScalar> 00095 struct functor_traits<mul_assign_op<DstScalar,SrcScalar> > { 00096 enum { 00097 Cost = NumTraits<DstScalar>::ReadCost + NumTraits<DstScalar>::MulCost, 00098 PacketAccess = is_same<DstScalar,SrcScalar>::value && packet_traits<DstScalar>::HasMul 00099 }; 00100 }; 00101 template<typename DstScalar,typename SrcScalar> struct functor_is_product_like<mul_assign_op<DstScalar,SrcScalar> > { enum { ret = 1 }; }; 00102 00107 template<typename Scalar> struct div_assign_op { 00108 00109 EIGEN_EMPTY_STRUCT_CTOR(div_assign_op) 00110 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(Scalar& a, const Scalar& b) const { a /= b; } 00111 00112 template<int Alignment, typename Packet> 00113 EIGEN_STRONG_INLINE void assignPacket(Scalar* a, const Packet& b) const 00114 { internal::pstoret<Scalar,Packet,Alignment>(a,internal::pdiv(internal::ploadt<Packet,Alignment>(a),b)); } 00115 }; 00116 template<typename Scalar> 00117 struct functor_traits<div_assign_op<Scalar> > { 00118 enum { 00119 Cost = NumTraits<Scalar>::ReadCost + NumTraits<Scalar>::MulCost, 00120 PacketAccess = packet_traits<Scalar>::HasDiv 00121 }; 00122 }; 00123 00124 00140 template<typename Scalar> struct swap_assign_op { 00141 00142 EIGEN_EMPTY_STRUCT_CTOR(swap_assign_op) 00143 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(Scalar& a, const Scalar& b) const 00144 { 00145 #ifdef __CUDACC__ 00146 // FIXME is there some kind of cuda::swap? 00147 Scalar t=b; const_cast<Scalar&>(b)=a; a=t; 00148 #else 00149 using std::swap; 00150 swap(a,const_cast<Scalar&>(b)); 00151 #endif 00152 } 00153 }; 00154 template<typename Scalar> 00155 struct functor_traits<swap_assign_op<Scalar> > { 00156 enum { 00157 Cost = 3 * NumTraits<Scalar>::ReadCost, 00158 PacketAccess = packet_traits<Scalar>::Vectorizable 00159 }; 00160 }; 00161 00162 } // namespace internal 00163 00164 } // namespace Eigen 00165 00166 #endif // EIGEN_ASSIGNMENT_FUNCTORS_H