10 #ifndef EIGEN_ASSIGNMENT_FUNCTORS_H 11 #define EIGEN_ASSIGNMENT_FUNCTORS_H 14 #include "../InternalHeaderCheck.h" 24 template <
typename DstScalar,
typename SrcScalar>
26 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE constexpr
void assignCoeff(DstScalar& a,
const SrcScalar& b)
const { a = b; }
28 template <
int Alignment,
typename Packet>
29 EIGEN_STRONG_INLINE
void assignPacket(DstScalar* a,
const Packet& b)
const {
30 pstoret<DstScalar, Packet, Alignment>(a, b);
33 template <
int Alignment,
typename Packet>
34 EIGEN_STRONG_INLINE
void assignPacketSegment(DstScalar* a,
const Packet& b,
Index begin,
Index count)
const {
35 pstoretSegment<DstScalar, Packet, Alignment>(a, b, begin, count);
40 template <
typename DstScalar>
41 struct assign_op<DstScalar, void> {};
43 template <
typename DstScalar,
typename SrcScalar>
44 struct functor_traits<assign_op<DstScalar, SrcScalar>> {
46 Cost = NumTraits<DstScalar>::ReadCost,
47 PacketAccess = is_same<DstScalar, SrcScalar>::value && packet_traits<DstScalar>::Vectorizable &&
48 packet_traits<SrcScalar>::Vectorizable
56 template <
typename DstScalar,
typename SrcScalar,
typename Func>
57 struct compound_assign_op {
58 using traits = functor_traits<compound_assign_op<DstScalar, SrcScalar, Func>>;
59 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE constexpr
void assignCoeff(DstScalar& a,
const SrcScalar& b)
const {
60 assign_op<DstScalar, DstScalar>().assignCoeff(a, Func().operator()(a, b));
63 template <
int Alignment,
typename Packet>
64 EIGEN_STRONG_INLINE
void assignPacket(DstScalar* a,
const Packet& b)
const {
65 assign_op<DstScalar, DstScalar>().
template assignPacket<Alignment, Packet>(
66 a, Func().packetOp(ploadt<Packet, Alignment>(a), b));
69 template <
int Alignment,
typename Packet>
70 EIGEN_STRONG_INLINE
void assignPacketSegment(DstScalar* a,
const Packet& b,
Index begin,
Index count)
const {
71 assign_op<DstScalar, DstScalar>().
template assignPacketSegment<Alignment, Packet>(
72 a, Func().packetOp(ploadtSegment<Packet, Alignment>(a, begin, count), b), begin, count);
76 template <
typename DstScalar,
typename SrcScalar,
typename Func>
77 struct functor_traits<compound_assign_op<DstScalar, SrcScalar, Func>> {
79 Cost = int(functor_traits<assign_op<DstScalar, DstScalar>>::Cost) + int(functor_traits<Func>::Cost),
80 PacketAccess = functor_traits<assign_op<DstScalar, DstScalar>>::PacketAccess && functor_traits<Func>::PacketAccess
88 template <
typename DstScalar,
typename SrcScalar = DstScalar>
89 struct add_assign_op : compound_assign_op<DstScalar, SrcScalar, scalar_sum_op<DstScalar, SrcScalar>> {};
91 template <
typename DstScalar,
typename SrcScalar>
92 struct functor_traits<add_assign_op<DstScalar, SrcScalar>> : add_assign_op<DstScalar, SrcScalar>::traits {};
98 template <
typename DstScalar,
typename SrcScalar = DstScalar>
99 struct sub_assign_op : compound_assign_op<DstScalar, SrcScalar, scalar_difference_op<DstScalar, SrcScalar>> {};
101 template <
typename DstScalar,
typename SrcScalar>
102 struct functor_traits<sub_assign_op<DstScalar, SrcScalar>> : sub_assign_op<DstScalar, SrcScalar>::traits {};
108 template <
typename DstScalar,
typename SrcScalar = DstScalar>
109 struct mul_assign_op : compound_assign_op<DstScalar, SrcScalar, scalar_product_op<DstScalar, SrcScalar>> {};
111 template <
typename DstScalar,
typename SrcScalar>
112 struct functor_traits<mul_assign_op<DstScalar, SrcScalar>> : mul_assign_op<DstScalar, SrcScalar>::traits {};
118 template <
typename DstScalar,
typename SrcScalar = DstScalar>
119 struct div_assign_op : compound_assign_op<DstScalar, SrcScalar, scalar_quotient_op<DstScalar, SrcScalar>> {};
121 template <
typename DstScalar,
typename SrcScalar>
122 struct functor_traits<div_assign_op<DstScalar, SrcScalar>> : div_assign_op<DstScalar, SrcScalar>::traits {};
139 template <
typename Scalar>
140 struct swap_assign_op {
141 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void assignCoeff(Scalar& a,
const Scalar& b)
const {
145 const_cast<Scalar&
>(b) = a;
149 swap(a, const_cast<Scalar&>(b));
153 template <
typename Scalar>
154 struct functor_traits<swap_assign_op<Scalar>> {
156 Cost = 3 * NumTraits<Scalar>::ReadCost,
158 #if defined(EIGEN_VECTORIZE_AVX) && (EIGEN_CLANG_STRICT_LESS_THAN(8, 0, 0) || EIGEN_COMP_CLANGAPPLE) 165 packet_traits<Scalar>::Vectorizable
174 #endif // EIGEN_ASSIGNMENT_FUNCTORS_H Namespace containing all symbols from the Eigen library.
Definition: B01_Experimental.dox:1
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:82
std::enable_if_t< std::is_base_of< DenseBase< std::decay_t< DerivedA > >, std::decay_t< DerivedA > >::value &&std::is_base_of< DenseBase< std::decay_t< DerivedB > >, std::decay_t< DerivedB > >::value, void > swap(DerivedA &&a, DerivedB &&b)
Definition: DenseBase.h:667