252 static inline void run(Derived1 &,
const Derived2 &) { }
255template<
typename Derived1,
typename Derived2,
int Version>
256struct assign_impl<Derived1, Derived2, DefaultTraversal, NoUnrolling, Version>
258 typedef typename Derived1::Index Index;
259 static inline void run(Derived1 &dst,
const Derived2 &src)
261 const Index innerSize = dst.innerSize();
262 const Index outerSize = dst.outerSize();
263 for(Index outer = 0; outer < outerSize; ++outer)
264 for(Index inner = 0; inner < innerSize; ++inner)
265 dst.copyCoeffByOuterInner(outer, inner, src);
269template<
typename Derived1,
typename Derived2,
int Version>
270struct assign_impl<Derived1, Derived2, DefaultTraversal, CompleteUnrolling, Version>
272 static EIGEN_STRONG_INLINE
void run(Derived1 &dst,
const Derived2 &src)
274 assign_DefaultTraversal_CompleteUnrolling<Derived1, Derived2, 0, Derived1::SizeAtCompileTime>
279template<
typename Derived1,
typename Derived2,
int Version>
280struct assign_impl<Derived1, Derived2, DefaultTraversal, InnerUnrolling, Version>
282 typedef typename Derived1::Index Index;
283 static EIGEN_STRONG_INLINE
void run(Derived1 &dst,
const Derived2 &src)
285 const Index outerSize = dst.outerSize();
286 for(Index outer = 0; outer < outerSize; ++outer)
287 assign_DefaultTraversal_InnerUnrolling<Derived1, Derived2, 0, Derived1::InnerSizeAtCompileTime>
288 ::run(dst, src, outer);
296template<
typename Derived1,
typename Derived2,
int Version>
297struct assign_impl<Derived1, Derived2, LinearTraversal, NoUnrolling, Version>
299 typedef typename Derived1::Index Index;
300 static inline void run(Derived1 &dst,
const Derived2 &src)
302 const Index size = dst.size();
303 for(Index i = 0; i < size; ++i)
304 dst.copyCoeff(i, src);
308template<
typename Derived1,
typename Derived2,
int Version>
309struct assign_impl<Derived1, Derived2, LinearTraversal, CompleteUnrolling, Version>
311 static EIGEN_STRONG_INLINE
void run(Derived1 &dst,
const Derived2 &src)
313 assign_LinearTraversal_CompleteUnrolling<Derived1, Derived2, 0, Derived1::SizeAtCompileTime>
322template<
typename Derived1,
typename Derived2,
int Version>
323struct assign_impl<Derived1, Derived2, InnerVectorizedTraversal, NoUnrolling, Version>
325 typedef typename Derived1::Index Index;
326 static inline void run(Derived1 &dst,
const Derived2 &src)
328 const Index innerSize = dst.innerSize();
329 const Index outerSize = dst.outerSize();
330 const Index packetSize = packet_traits<typename Derived1::Scalar>::size;
331 for(Index outer = 0; outer < outerSize; ++outer)
332 for(Index inner = 0; inner < innerSize; inner+=packetSize)
333 dst.template copyPacketByOuterInner<Derived2, Aligned, Aligned>(outer, inner, src);
337template<
typename Derived1,
typename Derived2,
int Version>
338struct assign_impl<Derived1, Derived2, InnerVectorizedTraversal, CompleteUnrolling, Version>
340 static EIGEN_STRONG_INLINE
void run(Derived1 &dst,
const Derived2 &src)
342 assign_innervec_CompleteUnrolling<Derived1, Derived2, 0, Derived1::SizeAtCompileTime>
347template<
typename Derived1,
typename Derived2,
int Version>
348struct assign_impl<Derived1, Derived2, InnerVectorizedTraversal, InnerUnrolling, Version>
350 typedef typename Derived1::Index Index;
351 static EIGEN_STRONG_INLINE
void run(Derived1 &dst,
const Derived2 &src)
353 const Index outerSize = dst.outerSize();
354 for(Index outer = 0; outer < outerSize; ++outer)
355 assign_innervec_InnerUnrolling<Derived1, Derived2, 0, Derived1::InnerSizeAtCompileTime>
356 ::run(dst, src, outer);
364template <
bool IsAligned = false>
365struct unaligned_assign_impl
367 template <
typename Derived,
typename OtherDerived>
368 static EIGEN_STRONG_INLINE
void run(
const Derived&, OtherDerived&,
typename Derived::Index,
typename Derived::Index) {}
372struct unaligned_assign_impl<false>
377 template <
typename Derived,
typename OtherDerived>
378 static EIGEN_DONT_INLINE
void run(
const Derived& src, OtherDerived& dst,
typename Derived::Index start,
typename Derived::Index end)
380 template <
typename Derived,
typename OtherDerived>
381 static EIGEN_STRONG_INLINE
void run(
const Derived& src, OtherDerived& dst,
typename Derived::Index start,
typename Derived::Index end)
384 for (
typename Derived::Index index = start; index < end; ++index)
385 dst.copyCoeff(index, src);
389template<
typename Derived1,
typename Derived2,
int Version>
390struct assign_impl<Derived1, Derived2, LinearVectorizedTraversal, NoUnrolling, Version>
392 typedef typename Derived1::Index Index;
393 static EIGEN_STRONG_INLINE
void run(Derived1 &dst,
const Derived2 &src)
395 const Index size = dst.size();
396 typedef packet_traits<typename Derived1::Scalar> PacketTraits;
398 packetSize = PacketTraits::size,
399 dstAlignment = PacketTraits::AlignedOnScalar ?
Aligned : int(assign_traits<Derived1,Derived2>::DstIsAligned) ,
400 srcAlignment = assign_traits<Derived1,Derived2>::JointAlignment
402 const Index alignedStart = assign_traits<Derived1,Derived2>::DstIsAligned ? 0
403 : internal::first_aligned(&dst.coeffRef(0), size);
404 const Index alignedEnd = alignedStart + ((size-alignedStart)/packetSize)*packetSize;
406 unaligned_assign_impl<assign_traits<Derived1,Derived2>::DstIsAligned!=0>::run(src,dst,0,alignedStart);
408 for(Index index = alignedStart; index < alignedEnd; index += packetSize)
410 dst.template copyPacket<Derived2, dstAlignment, srcAlignment>(index, src);
413 unaligned_assign_impl<>::run(src,dst,alignedEnd,size);
417template<
typename Derived1,
typename Derived2,
int Version>
418struct assign_impl<Derived1, Derived2, LinearVectorizedTraversal, CompleteUnrolling, Version>
420 typedef typename Derived1::Index Index;
421 static EIGEN_STRONG_INLINE
void run(Derived1 &dst,
const Derived2 &src)
423 enum { size = Derived1::SizeAtCompileTime,
424 packetSize = packet_traits<typename Derived1::Scalar>::size,
425 alignedSize = (size/packetSize)*packetSize };
427 assign_innervec_CompleteUnrolling<Derived1, Derived2, 0, alignedSize>::run(dst, src);
428 assign_DefaultTraversal_CompleteUnrolling<Derived1, Derived2, alignedSize, size>::run(dst, src);
436template<
typename Derived1,
typename Derived2,
int Version>
437struct assign_impl<Derived1, Derived2, SliceVectorizedTraversal, NoUnrolling, Version>
439 typedef typename Derived1::Index Index;
440 static inline void run(Derived1 &dst,
const Derived2 &src)
442 typedef typename Derived1::Scalar Scalar;
443 typedef packet_traits<Scalar> PacketTraits;
445 packetSize = PacketTraits::size,
446 alignable = PacketTraits::AlignedOnScalar,
447 dstIsAligned = assign_traits<Derived1,Derived2>::DstIsAligned,
448 dstAlignment = alignable ?
Aligned : int(dstIsAligned),
449 srcAlignment = assign_traits<Derived1,Derived2>::JointAlignment
451 const Scalar *dst_ptr = &dst.coeffRef(0,0);
452 if((!
bool(dstIsAligned)) && (
size_t(dst_ptr) %
sizeof(Scalar))>0)
455 return assign_impl<Derived1,Derived2,DefaultTraversal,NoUnrolling>::run(dst, src);
457 const Index packetAlignedMask = packetSize - 1;
458 const Index innerSize = dst.innerSize();
459 const Index outerSize = dst.outerSize();
460 const Index alignedStep = alignable ? (packetSize - dst.outerStride() % packetSize) & packetAlignedMask : 0;
461 Index alignedStart = ((!alignable) || bool(dstIsAligned)) ? 0 : internal::first_aligned(dst_ptr, innerSize);
463 for(Index outer = 0; outer < outerSize; ++outer)
465 const Index alignedEnd = alignedStart + ((innerSize-alignedStart) & ~packetAlignedMask);
467 for(Index inner = 0; inner<alignedStart ; ++inner)
468 dst.copyCoeffByOuterInner(outer, inner, src);
471 for(Index inner = alignedStart; inner<alignedEnd; inner+=packetSize)
472 dst.template copyPacketByOuterInner<Derived2, dstAlignment, Unaligned>(outer, inner, src);
475 for(Index inner = alignedEnd; inner<innerSize ; ++inner)
476 dst.copyCoeffByOuterInner(outer, inner, src);
478 alignedStart = std::min<Index>((alignedStart+alignedStep)%packetSize, innerSize);
489template<
typename Derived>
490template<
typename OtherDerived>
491EIGEN_STRONG_INLINE Derived& DenseBase<Derived>
492 ::lazyAssign(
const DenseBase<OtherDerived>& other)
495 SameType = internal::is_same<typename Derived::Scalar,typename OtherDerived::Scalar>::value
498 EIGEN_STATIC_ASSERT_LVALUE(Derived)
499 EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Derived,OtherDerived)
500 EIGEN_STATIC_ASSERT(SameType,YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
502#ifdef EIGEN_DEBUG_ASSIGN
503 internal::assign_traits<Derived, OtherDerived>::debug();
505 eigen_assert(rows() == other.rows() && cols() == other.cols());
506 internal::assign_impl<Derived, OtherDerived, int(SameType) ? int(internal::assign_traits<Derived, OtherDerived>::Traversal)
507 : int(InvalidTraversal)>::run(derived(),other.derived());
508#ifndef EIGEN_NO_DEBUG
509 checkTransposeAliasing(other.derived());
516template<
typename Derived,
typename OtherDerived,
518 bool NeedToTranspose = ((
int(Derived::RowsAtCompileTime) == 1 &&
int(OtherDerived::ColsAtCompileTime) == 1)
521 (
int(Derived::ColsAtCompileTime) == 1 &&
int(OtherDerived::RowsAtCompileTime) == 1))
522 && int(Derived::SizeAtCompileTime) != 1>
523struct assign_selector;
525template<
typename Derived,
typename OtherDerived>
526struct assign_selector<Derived,OtherDerived,false,false> {
527 static EIGEN_STRONG_INLINE Derived& run(Derived& dst,
const OtherDerived& other) {
return dst.lazyAssign(other.derived()); }
528 template<
typename ActualDerived,
typename ActualOtherDerived>
529 static EIGEN_STRONG_INLINE Derived& evalTo(ActualDerived& dst,
const ActualOtherDerived& other) { other.evalTo(dst);
return dst; }
531template<
typename Derived,
typename OtherDerived>
532struct assign_selector<Derived,OtherDerived,true,false> {
533 static EIGEN_STRONG_INLINE Derived& run(Derived& dst,
const OtherDerived& other) {
return dst.lazyAssign(other.eval()); }
535template<
typename Derived,
typename OtherDerived>
536struct assign_selector<Derived,OtherDerived,false,true> {
537 static EIGEN_STRONG_INLINE Derived& run(Derived& dst,
const OtherDerived& other) {
return dst.lazyAssign(other.transpose()); }
538 template<
typename ActualDerived,
typename ActualOtherDerived>
539 static EIGEN_STRONG_INLINE Derived& evalTo(ActualDerived& dst,
const ActualOtherDerived& other) { Transpose<ActualDerived> dstTrans(dst); other.evalTo(dstTrans);
return dst; }
541template<
typename Derived,
typename OtherDerived>
542struct assign_selector<Derived,OtherDerived,true,true> {
543 static EIGEN_STRONG_INLINE Derived& run(Derived& dst,
const OtherDerived& other) {
return dst.lazyAssign(other.transpose().eval()); }
548template<
typename Derived>
549template<
typename OtherDerived>
552 return internal::assign_selector<Derived,OtherDerived>::run(derived(), other.derived());
555template<
typename Derived>
558 return internal::assign_selector<Derived,Derived>::run(derived(), other.derived());