11#ifndef EIGEN_ASSIGNMENT_FUNCTORS_H
12#define EIGEN_ASSIGNMENT_FUNCTORS_H
15#include "../InternalHeaderCheck.h"
25template <
typename DstScalar,
typename SrcScalar>
27 EIGEN_DEVICE_FUNC
constexpr void assignCoeff(DstScalar& a,
const SrcScalar& b)
const { a = b; }
29 template <
int Alignment,
typename Packet>
30 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void assignPacket(DstScalar* a,
const Packet& b)
const {
31 pstoret<DstScalar, Packet, Alignment>(a, b);
34 template <
int Alignment,
typename Packet>
35 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void assignPacketSegment(DstScalar* a,
const Packet& b, Index begin,
37 pstoretSegment<DstScalar, Packet, Alignment>(a, b, begin, count);
42template <
typename DstScalar>
43struct assign_op<DstScalar, void> {};
45template <
typename DstScalar,
typename SrcScalar>
46struct functor_traits<assign_op<DstScalar, SrcScalar>> {
48 Cost = NumTraits<DstScalar>::ReadCost,
49 PacketAccess = std::is_same<DstScalar, SrcScalar>::value && packet_traits<DstScalar>::Vectorizable &&
50 packet_traits<SrcScalar>::Vectorizable
58template <
typename DstScalar,
typename SrcScalar,
typename Func>
59struct compound_assign_op {
60 using traits = functor_traits<compound_assign_op<DstScalar, SrcScalar, Func>>;
61 EIGEN_DEVICE_FUNC
constexpr void assignCoeff(DstScalar& a,
const SrcScalar& b)
const {
62 assign_op<DstScalar, DstScalar>().assignCoeff(a, Func().
operator()(a, b));
65 template <
int Alignment,
typename Packet>
66 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void assignPacket(DstScalar* a,
const Packet& b)
const {
67 assign_op<DstScalar, DstScalar>().template assignPacket<Alignment, Packet>(
68 a, Func().packetOp(ploadt<Packet, Alignment>(a), b));
71 template <
int Alignment,
typename Packet>
72 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void assignPacketSegment(DstScalar* a,
const Packet& b, Index begin,
74 assign_op<DstScalar, DstScalar>().template assignPacketSegment<Alignment, Packet>(
75 a, Func().packetOp(ploadtSegment<Packet, Alignment>(a, begin, count), b), begin, count);
79template <
typename DstScalar,
typename SrcScalar,
typename Func>
80struct functor_traits<compound_assign_op<DstScalar, SrcScalar, Func>> {
82 Cost = int(functor_traits<assign_op<DstScalar, DstScalar>>::Cost) + int(functor_traits<Func>::Cost),
83 PacketAccess = functor_traits<assign_op<DstScalar, DstScalar>>::PacketAccess && functor_traits<Func>::PacketAccess
91template <
typename DstScalar,
typename SrcScalar = DstScalar>
92struct add_assign_op : compound_assign_op<DstScalar, SrcScalar, scalar_sum_op<DstScalar, SrcScalar>> {};
94template <
typename DstScalar,
typename SrcScalar>
95struct functor_traits<add_assign_op<DstScalar, SrcScalar>> : add_assign_op<DstScalar, SrcScalar>::traits {};
101template <
typename DstScalar,
typename SrcScalar = DstScalar>
102struct sub_assign_op : compound_assign_op<DstScalar, SrcScalar, scalar_difference_op<DstScalar, SrcScalar>> {
104 EIGEN_STATIC_ASSERT((!std::is_same<DstScalar, bool>::value || !std::is_same<SrcScalar, bool>::value),
105 BOOLEAN_SUBTRACTION_IS_NOT_SUPPORTED__CAST_TO_A_SIGNED_INTEGER_TYPE)
108template <
typename DstScalar,
typename SrcScalar>
109struct functor_traits<sub_assign_op<DstScalar, SrcScalar>> : sub_assign_op<DstScalar, SrcScalar>::traits {};
115template <
typename DstScalar,
typename SrcScalar = DstScalar>
116struct mul_assign_op : compound_assign_op<DstScalar, SrcScalar, scalar_product_op<DstScalar, SrcScalar>> {};
118template <
typename DstScalar,
typename SrcScalar>
119struct functor_traits<mul_assign_op<DstScalar, SrcScalar>> : mul_assign_op<DstScalar, SrcScalar>::traits {};
125template <
typename DstScalar,
typename SrcScalar = DstScalar>
126struct div_assign_op : compound_assign_op<DstScalar, SrcScalar, scalar_quotient_op<DstScalar, SrcScalar>> {};
128template <
typename DstScalar,
typename SrcScalar>
129struct functor_traits<div_assign_op<DstScalar, SrcScalar>> : div_assign_op<DstScalar, SrcScalar>::traits {};
146template <
typename Scalar>
147struct swap_assign_op {
148 EIGEN_DEVICE_FUNC
constexpr EIGEN_STRONG_INLINE
void assignCoeff(Scalar& a,
const Scalar& b)
const {
152 const_cast<Scalar&
>(b) = a;
156 swap(a,
const_cast<Scalar&
>(b));
160template <
typename Scalar>
161struct functor_traits<swap_assign_op<Scalar>> {
163 Cost = 3 * NumTraits<Scalar>::ReadCost,
165#if defined(EIGEN_VECTORIZE_AVX) && (EIGEN_CLANG_STRICT_LESS_THAN(8, 0, 0) || EIGEN_COMP_CLANGAPPLE)
172 packet_traits<Scalar>::Vectorizable