10#ifndef EIGEN_ASSIGNMENT_FUNCTORS_H
11#define EIGEN_ASSIGNMENT_FUNCTORS_H
14#include "../InternalHeaderCheck.h"
24template <
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);
40template <
typename DstScalar>
41struct assign_op<DstScalar, void> {};
43template <
typename DstScalar,
typename SrcScalar>
44struct 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
56template <
typename DstScalar,
typename SrcScalar,
typename Func>
57struct 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);
76template <
typename DstScalar,
typename SrcScalar,
typename Func>
77struct 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
88template <
typename DstScalar,
typename SrcScalar = DstScalar>
89struct add_assign_op : compound_assign_op<DstScalar, SrcScalar, scalar_sum_op<DstScalar, SrcScalar>> {};
91template <
typename DstScalar,
typename SrcScalar>
92struct functor_traits<add_assign_op<DstScalar, SrcScalar>> : add_assign_op<DstScalar, SrcScalar>::traits {};
98template <
typename DstScalar,
typename SrcScalar = DstScalar>
99struct sub_assign_op : compound_assign_op<DstScalar, SrcScalar, scalar_difference_op<DstScalar, SrcScalar>> {};
101template <
typename DstScalar,
typename SrcScalar>
102struct functor_traits<sub_assign_op<DstScalar, SrcScalar>> : sub_assign_op<DstScalar, SrcScalar>::traits {};
108template <
typename DstScalar,
typename SrcScalar = DstScalar>
109struct mul_assign_op : compound_assign_op<DstScalar, SrcScalar, scalar_product_op<DstScalar, SrcScalar>> {};
111template <
typename DstScalar,
typename SrcScalar>
112struct functor_traits<mul_assign_op<DstScalar, SrcScalar>> : mul_assign_op<DstScalar, SrcScalar>::traits {};
118template <
typename DstScalar,
typename SrcScalar = DstScalar>
119struct div_assign_op : compound_assign_op<DstScalar, SrcScalar, scalar_quotient_op<DstScalar, SrcScalar>> {};
121template <
typename DstScalar,
typename SrcScalar>
122struct functor_traits<div_assign_op<DstScalar, SrcScalar>> : div_assign_op<DstScalar, SrcScalar>::traits {};
139template <
typename Scalar>
140struct 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));
153template <
typename Scalar>
154struct 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
Namespace containing all symbols from the Eigen library.
Definition B01_Experimental.dox:1
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
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition Meta.h:82