10 #ifndef EIGEN_CXX11_TENSOR_TENSOR_CONVERSION_H
11 #define EIGEN_CXX11_TENSOR_TENSOR_CONVERSION_H
23 template<
typename TargetType,
typename XprType>
24 struct traits<TensorConversionOp<TargetType, XprType> >
27 typedef TargetType Scalar;
28 typedef typename packet_traits<Scalar>::type Packet;
29 typedef typename traits<XprType>::StorageKind StorageKind;
30 typedef typename traits<XprType>::Index Index;
31 typedef typename XprType::Nested Nested;
32 typedef typename remove_reference<Nested>::type _Nested;
33 static const int NumDimensions = traits<XprType>::NumDimensions;
34 static const int Layout = traits<XprType>::Layout;
38 template<
typename TargetType,
typename XprType>
39 struct eval<TensorConversionOp<TargetType, XprType>,
Eigen::Dense>
41 typedef const TensorConversionOp<TargetType, XprType>& type;
44 template<
typename TargetType,
typename XprType>
45 struct nested<TensorConversionOp<TargetType, XprType>, 1, typename eval<TensorConversionOp<TargetType, XprType> >::type>
47 typedef TensorConversionOp<TargetType, XprType> type;
53 template <
typename TensorEvaluator,
typename SrcPacket,
typename TgtPacket,
int SrcCoeffRatio,
int TgtCoeffRatio>
54 struct PacketConverter {
55 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
56 PacketConverter(
const TensorEvaluator& impl)
59 template<
int LoadMode,
typename Index>
60 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TgtPacket packet(Index index)
const {
61 return internal::pcast<SrcPacket, TgtPacket>(m_impl.template packet<LoadMode>(index));
65 const TensorEvaluator& m_impl;
69 template <
typename TensorEvaluator,
typename SrcPacket,
typename TgtPacket>
70 struct PacketConverter<TensorEvaluator, SrcPacket, TgtPacket, 2, 1> {
71 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
72 PacketConverter(
const TensorEvaluator& impl)
75 template<
int LoadMode,
typename Index>
76 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TgtPacket packet(Index index)
const {
77 const int SrcPacketSize = internal::unpacket_traits<SrcPacket>::size;
79 SrcPacket src1 = m_impl.template packet<LoadMode>(index);
80 SrcPacket src2 = m_impl.template packet<LoadMode>(index + SrcPacketSize);
81 TgtPacket result = internal::pcast<SrcPacket, TgtPacket>(src1, src2);
86 const TensorEvaluator& m_impl;
90 template <
typename TensorEvaluator,
typename SrcPacket,
typename TgtPacket>
91 struct PacketConverter<TensorEvaluator, SrcPacket, TgtPacket, 1, 2> {
92 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
93 PacketConverter(
const TensorEvaluator& impl)
94 : m_impl(impl), m_maxIndex(impl.dimensions().TotalSize()) {}
96 template<
int LoadMode,
typename Index>
97 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TgtPacket packet(Index index)
const {
98 const int SrcPacketSize = internal::unpacket_traits<SrcPacket>::size;
102 if (m_impl.data() && (index + SrcPacketSize < m_maxIndex)) {
104 return internal::pcast<SrcPacket, TgtPacket>(m_impl.template packet<Unaligned>(index));
106 const int TgtPacketSize = internal::unpacket_traits<TgtPacket>::size;
107 EIGEN_ALIGN_MAX
typename internal::unpacket_traits<TgtPacket>::type values[TgtPacketSize];
108 for (
int i = 0; i < TgtPacketSize; ++i) {
109 values[i] = m_impl.coeff(index+i);
111 TgtPacket rslt = internal::pload<TgtPacket>(values);
117 const TensorEvaluator& m_impl;
118 const typename TensorEvaluator::Index m_maxIndex;
121 template<
typename TargetType,
typename XprType>
125 typedef typename internal::traits<TensorConversionOp>::Scalar Scalar;
126 typedef typename internal::traits<TensorConversionOp>::Packet Packet;
127 typedef typename internal::traits<TensorConversionOp>::StorageKind StorageKind;
128 typedef typename internal::traits<TensorConversionOp>::Index Index;
129 typedef typename internal::nested<TensorConversionOp>::type Nested;
130 typedef Scalar CoeffReturnType;
131 typedef Packet PacketReturnType;
132 typedef typename NumTraits<Scalar>::Real RealScalar;
138 const typename internal::remove_all<typename XprType::Nested>::type&
139 expression()
const {
return m_xpr; }
142 typename XprType::Nested m_xpr;
149 template<
typename TargetType,
typename ArgType,
typename Device>
153 typedef typename XprType::Index Index;
155 typedef TargetType Scalar;
156 typedef TargetType CoeffReturnType;
157 typedef typename internal::remove_all<typename internal::traits<ArgType>::Scalar>::type SrcType;
158 typedef typename internal::traits<XprType>::Packet PacketReturnType;
159 typedef typename internal::packet_traits<SrcType>::type PacketSourceType;
167 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(
const XprType& op,
const Device& device)
168 : m_impl(op.expression(), device)
172 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Dimensions& dimensions()
const {
return m_impl.dimensions(); }
174 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool evalSubExprsIfNeeded(Scalar* )
176 m_impl.evalSubExprsIfNeeded(NULL);
180 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void cleanup()
185 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index)
const
187 internal::scalar_cast_op<SrcType, TargetType> converter;
188 return converter(m_impl.coeff(index));
191 template<
int LoadMode>
192 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index)
const
194 const int SrcCoeffRatio = internal::type_casting_traits<SrcType, TargetType>::SrcCoeffRatio;
195 const int TgtCoeffRatio = internal::type_casting_traits<SrcType, TargetType>::TgtCoeffRatio;
196 PacketConverter<TensorEvaluator<ArgType, Device>, PacketSourceType, PacketReturnType,
197 SrcCoeffRatio, TgtCoeffRatio> converter(m_impl);
198 return converter.template packet<LoadMode>(index);
201 EIGEN_DEVICE_FUNC Scalar* data()
const {
return NULL; }
204 TensorEvaluator<ArgType, Device> m_impl;
209 #endif // EIGEN_CXX11_TENSOR_TENSOR_CONVERSION_H
Namespace containing all symbols from the Eigen library.
Definition: CXX11Meta.h:13
The tensor evaluator classes.
Definition: TensorEvaluator.h:28
Tensor conversion class. This class makes it possible to vectorize type casting operations when the n...
Definition: TensorConversion.h:122
The tensor base class.
Definition: TensorForwardDeclarations.h:19