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
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 internal::pstoret<DstScalar, Packet, Alignment>(a, b);
35template <
typename DstScalar>
36struct assign_op<DstScalar, void> {};
38template <
typename DstScalar,
typename SrcScalar>
39struct functor_traits<assign_op<DstScalar, SrcScalar> > {
41 Cost = NumTraits<DstScalar>::ReadCost,
42 PacketAccess = is_same<DstScalar, SrcScalar>::value && packet_traits<DstScalar>::Vectorizable &&
43 packet_traits<SrcScalar>::Vectorizable
51template <
typename DstScalar,
typename SrcScalar>
53 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void assignCoeff(DstScalar& a,
const SrcScalar& b)
const { a += b; }
55 template <
int Alignment,
typename Packet>
56 EIGEN_STRONG_INLINE
void assignPacket(DstScalar* a,
const Packet& b)
const {
57 internal::pstoret<DstScalar, Packet, Alignment>(a, internal::padd(internal::ploadt<Packet, Alignment>(a), b));
60template <
typename DstScalar,
typename SrcScalar>
61struct functor_traits<add_assign_op<DstScalar, SrcScalar> > {
63 Cost = NumTraits<DstScalar>::ReadCost + NumTraits<DstScalar>::AddCost,
64 PacketAccess = is_same<DstScalar, SrcScalar>::value && packet_traits<DstScalar>::HasAdd
72template <
typename DstScalar,
typename SrcScalar>
74 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void assignCoeff(DstScalar& a,
const SrcScalar& b)
const { a -= b; }
76 template <
int Alignment,
typename Packet>
77 EIGEN_STRONG_INLINE
void assignPacket(DstScalar* a,
const Packet& b)
const {
78 internal::pstoret<DstScalar, Packet, Alignment>(a, internal::psub(internal::ploadt<Packet, Alignment>(a), b));
81template <
typename DstScalar,
typename SrcScalar>
82struct functor_traits<sub_assign_op<DstScalar, SrcScalar> > {
84 Cost = NumTraits<DstScalar>::ReadCost + NumTraits<DstScalar>::AddCost,
85 PacketAccess = is_same<DstScalar, SrcScalar>::value && packet_traits<DstScalar>::HasSub
93template <
typename DstScalar,
typename SrcScalar = DstScalar>
95 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void assignCoeff(DstScalar& a,
const SrcScalar& b)
const { a *= b; }
97 template <
int Alignment,
typename Packet>
98 EIGEN_STRONG_INLINE
void assignPacket(DstScalar* a,
const Packet& b)
const {
99 internal::pstoret<DstScalar, Packet, Alignment>(a, internal::pmul(internal::ploadt<Packet, Alignment>(a), b));
102template <
typename DstScalar,
typename SrcScalar>
103struct functor_traits<mul_assign_op<DstScalar, SrcScalar> > {
105 Cost = NumTraits<DstScalar>::ReadCost + NumTraits<DstScalar>::MulCost,
106 PacketAccess = is_same<DstScalar, SrcScalar>::value && packet_traits<DstScalar>::HasMul
114template <
typename DstScalar,
typename SrcScalar = DstScalar>
115struct div_assign_op {
116 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void assignCoeff(DstScalar& a,
const SrcScalar& b)
const { a /= b; }
118 template <
int Alignment,
typename Packet>
119 EIGEN_STRONG_INLINE
void assignPacket(DstScalar* a,
const Packet& b)
const {
120 internal::pstoret<DstScalar, Packet, Alignment>(a, internal::pdiv(internal::ploadt<Packet, Alignment>(a), b));
123template <
typename DstScalar,
typename SrcScalar>
124struct functor_traits<div_assign_op<DstScalar, SrcScalar> > {
126 Cost = NumTraits<DstScalar>::ReadCost + NumTraits<DstScalar>::MulCost,
127 PacketAccess = is_same<DstScalar, SrcScalar>::value && packet_traits<DstScalar>::HasDiv
146template <
typename Scalar>
147struct swap_assign_op {
148 EIGEN_DEVICE_FUNC 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
Namespace containing all symbols from the Eigen library.
Definition Core:137