Eigen  3.3.9
 
Loading...
Searching...
No Matches
PlainObjectBase.h
1// This file is part of Eigen, a lightweight C++ template library
2// for linear algebra.
3//
4// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>
5// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>
6//
7// This Source Code Form is subject to the terms of the Mozilla
8// Public License v. 2.0. If a copy of the MPL was not distributed
9// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10
11#ifndef EIGEN_DENSESTORAGEBASE_H
12#define EIGEN_DENSESTORAGEBASE_H
13
14#if defined(EIGEN_INITIALIZE_MATRICES_BY_ZERO)
15# define EIGEN_INITIALIZE_COEFFS
16# define EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED for(int i=0;i<base().size();++i) coeffRef(i)=Scalar(0);
17#elif defined(EIGEN_INITIALIZE_MATRICES_BY_NAN)
18# define EIGEN_INITIALIZE_COEFFS
19# define EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED for(int i=0;i<base().size();++i) coeffRef(i)=std::numeric_limits<Scalar>::quiet_NaN();
20#else
21# undef EIGEN_INITIALIZE_COEFFS
22# define EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
23#endif
24
25namespace Eigen {
26
27namespace internal {
28
29template<int MaxSizeAtCompileTime> struct check_rows_cols_for_overflow {
30 template<typename Index>
31 EIGEN_DEVICE_FUNC
32 static EIGEN_ALWAYS_INLINE void run(Index, Index)
33 {
34 }
35};
36
37template<> struct check_rows_cols_for_overflow<Dynamic> {
38 template<typename Index>
39 EIGEN_DEVICE_FUNC
40 static EIGEN_ALWAYS_INLINE void run(Index rows, Index cols)
41 {
42 // http://hg.mozilla.org/mozilla-central/file/6c8a909977d3/xpcom/ds/CheckedInt.h#l242
43 // we assume Index is signed
44 Index max_index = (std::size_t(1) << (8 * sizeof(Index) - 1)) - 1; // assume Index is signed
45 bool error = (rows == 0 || cols == 0) ? false
46 : (rows > max_index / cols);
47 if (error)
48 throw_std_bad_alloc();
49 }
50};
51
52template <typename Derived,
53 typename OtherDerived = Derived,
54 bool IsVector = bool(Derived::IsVectorAtCompileTime) && bool(OtherDerived::IsVectorAtCompileTime)>
55struct conservative_resize_like_impl;
56
57template<typename MatrixTypeA, typename MatrixTypeB, bool SwapPointers> struct matrix_swap_impl;
58
59} // end namespace internal
60
61#ifdef EIGEN_PARSED_BY_DOXYGEN
62namespace doxygen {
63
64// This is a workaround to doxygen not being able to understand the inheritance logic
65// when it is hidden by the dense_xpr_base helper struct.
66// Moreover, doxygen fails to include members that are not documented in the declaration body of
67// MatrixBase if we inherits MatrixBase<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >,
68// this is why we simply inherits MatrixBase, though this does not make sense.
69
71template<typename Derived> struct dense_xpr_base_dispatcher;
73template<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
74struct dense_xpr_base_dispatcher<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >
75 : public MatrixBase {};
76
77template<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
78struct dense_xpr_base_dispatcher<Array<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >
79 : public ArrayBase {};
80
81} // namespace doxygen
82
94template<typename Derived>
95class PlainObjectBase : public doxygen::dense_xpr_base_dispatcher<Derived>
96#else
97template<typename Derived>
98class PlainObjectBase : public internal::dense_xpr_base<Derived>::type
99#endif
100{
101 public:
102 enum { Options = internal::traits<Derived>::Options };
103 typedef typename internal::dense_xpr_base<Derived>::type Base;
104
105 typedef typename internal::traits<Derived>::StorageKind StorageKind;
106 typedef typename internal::traits<Derived>::Scalar Scalar;
107
108 typedef typename internal::packet_traits<Scalar>::type PacketScalar;
109 typedef typename NumTraits<Scalar>::Real RealScalar;
110 typedef Derived DenseType;
111
112 using Base::RowsAtCompileTime;
113 using Base::ColsAtCompileTime;
114 using Base::SizeAtCompileTime;
115 using Base::MaxRowsAtCompileTime;
116 using Base::MaxColsAtCompileTime;
117 using Base::MaxSizeAtCompileTime;
118 using Base::IsVectorAtCompileTime;
119 using Base::Flags;
120
121 template<typename PlainObjectType, int MapOptions, typename StrideType> friend class Eigen::Map;
122 friend class Eigen::Map<Derived, Unaligned>;
123 typedef Eigen::Map<Derived, Unaligned> MapType;
124 friend class Eigen::Map<const Derived, Unaligned>;
125 typedef const Eigen::Map<const Derived, Unaligned> ConstMapType;
126#if EIGEN_MAX_ALIGN_BYTES>0
127 // for EIGEN_MAX_ALIGN_BYTES==0, AlignedMax==Unaligned, and many compilers generate warnings for friend-ing a class twice.
128 friend class Eigen::Map<Derived, AlignedMax>;
129 friend class Eigen::Map<const Derived, AlignedMax>;
130#endif
131 typedef Eigen::Map<Derived, AlignedMax> AlignedMapType;
132 typedef const Eigen::Map<const Derived, AlignedMax> ConstAlignedMapType;
133 template<typename StrideType> struct StridedMapType { typedef Eigen::Map<Derived, Unaligned, StrideType> type; };
134 template<typename StrideType> struct StridedConstMapType { typedef Eigen::Map<const Derived, Unaligned, StrideType> type; };
135 template<typename StrideType> struct StridedAlignedMapType { typedef Eigen::Map<Derived, AlignedMax, StrideType> type; };
136 template<typename StrideType> struct StridedConstAlignedMapType { typedef Eigen::Map<const Derived, AlignedMax, StrideType> type; };
137
138 protected:
139 DenseStorage<Scalar, Base::MaxSizeAtCompileTime, Base::RowsAtCompileTime, Base::ColsAtCompileTime, Options> m_storage;
140
141 public:
142 enum { NeedsToAlign = (SizeAtCompileTime != Dynamic) && (internal::traits<Derived>::Alignment>0) };
143 EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign)
144
145 EIGEN_DEVICE_FUNC
146 Base& base() { return *static_cast<Base*>(this); }
147 EIGEN_DEVICE_FUNC
148 const Base& base() const { return *static_cast<const Base*>(this); }
149
150 EIGEN_DEVICE_FUNC
151 EIGEN_STRONG_INLINE Index rows() const { return m_storage.rows(); }
152 EIGEN_DEVICE_FUNC
153 EIGEN_STRONG_INLINE Index cols() const { return m_storage.cols(); }
154
159 EIGEN_DEVICE_FUNC
160 EIGEN_STRONG_INLINE const Scalar& coeff(Index rowId, Index colId) const
161 {
162 if(Flags & RowMajorBit)
163 return m_storage.data()[colId + rowId * m_storage.cols()];
164 else // column-major
165 return m_storage.data()[rowId + colId * m_storage.rows()];
166 }
167
172 EIGEN_DEVICE_FUNC
173 EIGEN_STRONG_INLINE const Scalar& coeff(Index index) const
174 {
175 return m_storage.data()[index];
176 }
177
182 EIGEN_DEVICE_FUNC
183 EIGEN_STRONG_INLINE Scalar& coeffRef(Index rowId, Index colId)
184 {
185 if(Flags & RowMajorBit)
186 return m_storage.data()[colId + rowId * m_storage.cols()];
187 else // column-major
188 return m_storage.data()[rowId + colId * m_storage.rows()];
189 }
190
195 EIGEN_DEVICE_FUNC
196 EIGEN_STRONG_INLINE Scalar& coeffRef(Index index)
197 {
198 return m_storage.data()[index];
199 }
200
203 EIGEN_DEVICE_FUNC
204 EIGEN_STRONG_INLINE const Scalar& coeffRef(Index rowId, Index colId) const
205 {
206 if(Flags & RowMajorBit)
207 return m_storage.data()[colId + rowId * m_storage.cols()];
208 else // column-major
209 return m_storage.data()[rowId + colId * m_storage.rows()];
210 }
211
214 EIGEN_DEVICE_FUNC
215 EIGEN_STRONG_INLINE const Scalar& coeffRef(Index index) const
216 {
217 return m_storage.data()[index];
218 }
219
221 template<int LoadMode>
222 EIGEN_STRONG_INLINE PacketScalar packet(Index rowId, Index colId) const
223 {
224 return internal::ploadt<PacketScalar, LoadMode>
225 (m_storage.data() + (Flags & RowMajorBit
226 ? colId + rowId * m_storage.cols()
227 : rowId + colId * m_storage.rows()));
228 }
229
231 template<int LoadMode>
232 EIGEN_STRONG_INLINE PacketScalar packet(Index index) const
233 {
234 return internal::ploadt<PacketScalar, LoadMode>(m_storage.data() + index);
235 }
236
238 template<int StoreMode>
239 EIGEN_STRONG_INLINE void writePacket(Index rowId, Index colId, const PacketScalar& val)
240 {
241 internal::pstoret<Scalar, PacketScalar, StoreMode>
242 (m_storage.data() + (Flags & RowMajorBit
243 ? colId + rowId * m_storage.cols()
244 : rowId + colId * m_storage.rows()), val);
245 }
246
248 template<int StoreMode>
249 EIGEN_STRONG_INLINE void writePacket(Index index, const PacketScalar& val)
250 {
251 internal::pstoret<Scalar, PacketScalar, StoreMode>(m_storage.data() + index, val);
252 }
253
255 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar *data() const
256 { return m_storage.data(); }
257
259 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar *data()
260 { return m_storage.data(); }
261
278 EIGEN_DEVICE_FUNC
279 EIGEN_STRONG_INLINE void resize(Index rows, Index cols)
280 {
281 eigen_assert( EIGEN_IMPLIES(RowsAtCompileTime!=Dynamic,rows==RowsAtCompileTime)
282 && EIGEN_IMPLIES(ColsAtCompileTime!=Dynamic,cols==ColsAtCompileTime)
283 && EIGEN_IMPLIES(RowsAtCompileTime==Dynamic && MaxRowsAtCompileTime!=Dynamic,rows<=MaxRowsAtCompileTime)
284 && EIGEN_IMPLIES(ColsAtCompileTime==Dynamic && MaxColsAtCompileTime!=Dynamic,cols<=MaxColsAtCompileTime)
285 && rows>=0 && cols>=0 && "Invalid sizes when resizing a matrix or array.");
286 internal::check_rows_cols_for_overflow<MaxSizeAtCompileTime>::run(rows, cols);
287 #ifdef EIGEN_INITIALIZE_COEFFS
288 Index size = rows*cols;
289 bool size_changed = size != this->size();
290 m_storage.resize(size, rows, cols);
291 if(size_changed) EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
292 #else
293 m_storage.resize(rows*cols, rows, cols);
294 #endif
295 }
296
308 EIGEN_DEVICE_FUNC
309 inline void resize(Index size)
310 {
311 EIGEN_STATIC_ASSERT_VECTOR_ONLY(PlainObjectBase)
312 eigen_assert(((SizeAtCompileTime == Dynamic && (MaxSizeAtCompileTime==Dynamic || size<=MaxSizeAtCompileTime)) || SizeAtCompileTime == size) && size>=0);
313 #ifdef EIGEN_INITIALIZE_COEFFS
314 bool size_changed = size != this->size();
315 #endif
316 if(RowsAtCompileTime == 1)
317 m_storage.resize(size, 1, size);
318 else
319 m_storage.resize(size, size, 1);
320 #ifdef EIGEN_INITIALIZE_COEFFS
321 if(size_changed) EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
322 #endif
323 }
324
333 EIGEN_DEVICE_FUNC
334 inline void resize(NoChange_t, Index cols)
335 {
336 resize(rows(), cols);
337 }
338
347 EIGEN_DEVICE_FUNC
348 inline void resize(Index rows, NoChange_t)
349 {
350 resize(rows, cols());
351 }
352
360 template<typename OtherDerived>
361 EIGEN_DEVICE_FUNC
362 EIGEN_STRONG_INLINE void resizeLike(const EigenBase<OtherDerived>& _other)
363 {
364 const OtherDerived& other = _other.derived();
365 internal::check_rows_cols_for_overflow<MaxSizeAtCompileTime>::run(other.rows(), other.cols());
366 const Index othersize = other.rows()*other.cols();
367 if(RowsAtCompileTime == 1)
368 {
369 eigen_assert(other.rows() == 1 || other.cols() == 1);
370 resize(1, othersize);
371 }
372 else if(ColsAtCompileTime == 1)
373 {
374 eigen_assert(other.rows() == 1 || other.cols() == 1);
375 resize(othersize, 1);
376 }
377 else resize(other.rows(), other.cols());
378 }
379
389 EIGEN_DEVICE_FUNC
390 EIGEN_STRONG_INLINE void conservativeResize(Index rows, Index cols)
391 {
392 internal::conservative_resize_like_impl<Derived>::run(*this, rows, cols);
393 }
394
402 EIGEN_DEVICE_FUNC
403 EIGEN_STRONG_INLINE void conservativeResize(Index rows, NoChange_t)
404 {
405 // Note: see the comment in conservativeResize(Index,Index)
406 conservativeResize(rows, cols());
407 }
408
416 EIGEN_DEVICE_FUNC
417 EIGEN_STRONG_INLINE void conservativeResize(NoChange_t, Index cols)
418 {
419 // Note: see the comment in conservativeResize(Index,Index)
420 conservativeResize(rows(), cols);
421 }
422
431 EIGEN_DEVICE_FUNC
432 EIGEN_STRONG_INLINE void conservativeResize(Index size)
433 {
434 internal::conservative_resize_like_impl<Derived>::run(*this, size);
435 }
436
446 template<typename OtherDerived>
447 EIGEN_DEVICE_FUNC
448 EIGEN_STRONG_INLINE void conservativeResizeLike(const DenseBase<OtherDerived>& other)
449 {
450 internal::conservative_resize_like_impl<Derived,OtherDerived>::run(*this, other);
451 }
452
456 EIGEN_DEVICE_FUNC
457 EIGEN_STRONG_INLINE Derived& operator=(const PlainObjectBase& other)
458 {
459 return _set(other);
460 }
461
463 template<typename OtherDerived>
464 EIGEN_DEVICE_FUNC
465 EIGEN_STRONG_INLINE Derived& lazyAssign(const DenseBase<OtherDerived>& other)
466 {
467 _resize_to_match(other);
468 return Base::lazyAssign(other.derived());
469 }
470
471 template<typename OtherDerived>
472 EIGEN_DEVICE_FUNC
473 EIGEN_STRONG_INLINE Derived& operator=(const ReturnByValue<OtherDerived>& func)
474 {
475 resize(func.rows(), func.cols());
476 return Base::operator=(func);
477 }
478
479 // Prevent user from trying to instantiate PlainObjectBase objects
480 // by making all its constructor protected. See bug 1074.
481 protected:
482
483 EIGEN_DEVICE_FUNC
484 EIGEN_STRONG_INLINE PlainObjectBase() : m_storage()
485 {
486// _check_template_params();
487// EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
488 }
489
490#ifndef EIGEN_PARSED_BY_DOXYGEN
491 // FIXME is it still needed ?
493 EIGEN_DEVICE_FUNC
494 explicit PlainObjectBase(internal::constructor_without_unaligned_array_assert)
495 : m_storage(internal::constructor_without_unaligned_array_assert())
496 {
497// _check_template_params(); EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
498 }
499#endif
500
501#if EIGEN_HAS_RVALUE_REFERENCES
502 EIGEN_DEVICE_FUNC
503 PlainObjectBase(PlainObjectBase&& other) EIGEN_NOEXCEPT
504 : m_storage( std::move(other.m_storage) )
505 {
506 }
507
508 EIGEN_DEVICE_FUNC
509 PlainObjectBase& operator=(PlainObjectBase&& other) EIGEN_NOEXCEPT
510 {
511 using std::swap;
512 swap(m_storage, other.m_storage);
513 return *this;
514 }
515#endif
516
518 EIGEN_DEVICE_FUNC
519 EIGEN_STRONG_INLINE PlainObjectBase(const PlainObjectBase& other)
520 : Base(), m_storage(other.m_storage) { }
521 EIGEN_DEVICE_FUNC
522 EIGEN_STRONG_INLINE PlainObjectBase(Index size, Index rows, Index cols)
523 : m_storage(size, rows, cols)
524 {
525// _check_template_params();
526// EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
527 }
528
530 template<typename OtherDerived>
531 EIGEN_DEVICE_FUNC
532 EIGEN_STRONG_INLINE PlainObjectBase(const DenseBase<OtherDerived> &other)
533 : m_storage()
534 {
535 _check_template_params();
536 resizeLike(other);
537 _set_noalias(other);
538 }
539
541 template<typename OtherDerived>
542 EIGEN_DEVICE_FUNC
543 EIGEN_STRONG_INLINE PlainObjectBase(const EigenBase<OtherDerived> &other)
544 : m_storage()
545 {
546 _check_template_params();
547 resizeLike(other);
548 *this = other.derived();
549 }
550
551 template<typename OtherDerived>
552 EIGEN_DEVICE_FUNC
553 EIGEN_STRONG_INLINE PlainObjectBase(const ReturnByValue<OtherDerived>& other)
554 {
555 _check_template_params();
556 // FIXME this does not automatically transpose vectors if necessary
557 resize(other.rows(), other.cols());
558 other.evalTo(this->derived());
559 }
560
561 public:
562
566 template<typename OtherDerived>
567 EIGEN_DEVICE_FUNC
568 EIGEN_STRONG_INLINE Derived& operator=(const EigenBase<OtherDerived> &other)
569 {
570 _resize_to_match(other);
571 Base::operator=(other.derived());
572 return this->derived();
573 }
574
587 static inline ConstMapType Map(const Scalar* data)
588 { return ConstMapType(data); }
589 static inline MapType Map(Scalar* data)
590 { return MapType(data); }
591 static inline ConstMapType Map(const Scalar* data, Index size)
592 { return ConstMapType(data, size); }
593 static inline MapType Map(Scalar* data, Index size)
594 { return MapType(data, size); }
595 static inline ConstMapType Map(const Scalar* data, Index rows, Index cols)
596 { return ConstMapType(data, rows, cols); }
597 static inline MapType Map(Scalar* data, Index rows, Index cols)
598 { return MapType(data, rows, cols); }
599
600 static inline ConstAlignedMapType MapAligned(const Scalar* data)
601 { return ConstAlignedMapType(data); }
602 static inline AlignedMapType MapAligned(Scalar* data)
603 { return AlignedMapType(data); }
604 static inline ConstAlignedMapType MapAligned(const Scalar* data, Index size)
605 { return ConstAlignedMapType(data, size); }
606 static inline AlignedMapType MapAligned(Scalar* data, Index size)
607 { return AlignedMapType(data, size); }
608 static inline ConstAlignedMapType MapAligned(const Scalar* data, Index rows, Index cols)
609 { return ConstAlignedMapType(data, rows, cols); }
610 static inline AlignedMapType MapAligned(Scalar* data, Index rows, Index cols)
611 { return AlignedMapType(data, rows, cols); }
612
613 template<int Outer, int Inner>
614 static inline typename StridedConstMapType<Stride<Outer, Inner> >::type Map(const Scalar* data, const Stride<Outer, Inner>& stride)
615 { return typename StridedConstMapType<Stride<Outer, Inner> >::type(data, stride); }
616 template<int Outer, int Inner>
617 static inline typename StridedMapType<Stride<Outer, Inner> >::type Map(Scalar* data, const Stride<Outer, Inner>& stride)
618 { return typename StridedMapType<Stride<Outer, Inner> >::type(data, stride); }
619 template<int Outer, int Inner>
620 static inline typename StridedConstMapType<Stride<Outer, Inner> >::type Map(const Scalar* data, Index size, const Stride<Outer, Inner>& stride)
621 { return typename StridedConstMapType<Stride<Outer, Inner> >::type(data, size, stride); }
622 template<int Outer, int Inner>
623 static inline typename StridedMapType<Stride<Outer, Inner> >::type Map(Scalar* data, Index size, const Stride<Outer, Inner>& stride)
624 { return typename StridedMapType<Stride<Outer, Inner> >::type(data, size, stride); }
625 template<int Outer, int Inner>
626 static inline typename StridedConstMapType<Stride<Outer, Inner> >::type Map(const Scalar* data, Index rows, Index cols, const Stride<Outer, Inner>& stride)
627 { return typename StridedConstMapType<Stride<Outer, Inner> >::type(data, rows, cols, stride); }
628 template<int Outer, int Inner>
629 static inline typename StridedMapType<Stride<Outer, Inner> >::type Map(Scalar* data, Index rows, Index cols, const Stride<Outer, Inner>& stride)
630 { return typename StridedMapType<Stride<Outer, Inner> >::type(data, rows, cols, stride); }
631
632 template<int Outer, int Inner>
633 static inline typename StridedConstAlignedMapType<Stride<Outer, Inner> >::type MapAligned(const Scalar* data, const Stride<Outer, Inner>& stride)
634 { return typename StridedConstAlignedMapType<Stride<Outer, Inner> >::type(data, stride); }
635 template<int Outer, int Inner>
636 static inline typename StridedAlignedMapType<Stride<Outer, Inner> >::type MapAligned(Scalar* data, const Stride<Outer, Inner>& stride)
637 { return typename StridedAlignedMapType<Stride<Outer, Inner> >::type(data, stride); }
638 template<int Outer, int Inner>
639 static inline typename StridedConstAlignedMapType<Stride<Outer, Inner> >::type MapAligned(const Scalar* data, Index size, const Stride<Outer, Inner>& stride)
640 { return typename StridedConstAlignedMapType<Stride<Outer, Inner> >::type(data, size, stride); }
641 template<int Outer, int Inner>
642 static inline typename StridedAlignedMapType<Stride<Outer, Inner> >::type MapAligned(Scalar* data, Index size, const Stride<Outer, Inner>& stride)
643 { return typename StridedAlignedMapType<Stride<Outer, Inner> >::type(data, size, stride); }
644 template<int Outer, int Inner>
645 static inline typename StridedConstAlignedMapType<Stride<Outer, Inner> >::type MapAligned(const Scalar* data, Index rows, Index cols, const Stride<Outer, Inner>& stride)
646 { return typename StridedConstAlignedMapType<Stride<Outer, Inner> >::type(data, rows, cols, stride); }
647 template<int Outer, int Inner>
648 static inline typename StridedAlignedMapType<Stride<Outer, Inner> >::type MapAligned(Scalar* data, Index rows, Index cols, const Stride<Outer, Inner>& stride)
649 { return typename StridedAlignedMapType<Stride<Outer, Inner> >::type(data, rows, cols, stride); }
650
651
652 using Base::setConstant;
653 EIGEN_DEVICE_FUNC Derived& setConstant(Index size, const Scalar& val);
654 EIGEN_DEVICE_FUNC Derived& setConstant(Index rows, Index cols, const Scalar& val);
655
656 using Base::setZero;
657 EIGEN_DEVICE_FUNC Derived& setZero(Index size);
658 EIGEN_DEVICE_FUNC Derived& setZero(Index rows, Index cols);
659
660 using Base::setOnes;
661 EIGEN_DEVICE_FUNC Derived& setOnes(Index size);
662 EIGEN_DEVICE_FUNC Derived& setOnes(Index rows, Index cols);
663
664 using Base::setRandom;
665 Derived& setRandom(Index size);
666 Derived& setRandom(Index rows, Index cols);
667
668 #ifdef EIGEN_PLAINOBJECTBASE_PLUGIN
669 #include EIGEN_PLAINOBJECTBASE_PLUGIN
670 #endif
671
672 protected:
680 template<typename OtherDerived>
681 EIGEN_DEVICE_FUNC
682 EIGEN_STRONG_INLINE void _resize_to_match(const EigenBase<OtherDerived>& other)
683 {
684 #ifdef EIGEN_NO_AUTOMATIC_RESIZING
685 eigen_assert((this->size()==0 || (IsVectorAtCompileTime ? (this->size() == other.size())
686 : (rows() == other.rows() && cols() == other.cols())))
687 && "Size mismatch. Automatic resizing is disabled because EIGEN_NO_AUTOMATIC_RESIZING is defined");
688 EIGEN_ONLY_USED_FOR_DEBUG(other);
689 #else
690 resizeLike(other);
691 #endif
692 }
693
708 // aliasing is dealt once in internall::call_assignment
709 // so at this stage we have to assume aliasing... and resising has to be done later.
710 template<typename OtherDerived>
711 EIGEN_DEVICE_FUNC
712 EIGEN_STRONG_INLINE Derived& _set(const DenseBase<OtherDerived>& other)
713 {
714 internal::call_assignment(this->derived(), other.derived());
715 return this->derived();
716 }
717
723 template<typename OtherDerived>
724 EIGEN_DEVICE_FUNC
725 EIGEN_STRONG_INLINE Derived& _set_noalias(const DenseBase<OtherDerived>& other)
726 {
727 // I don't think we need this resize call since the lazyAssign will anyways resize
728 // and lazyAssign will be called by the assign selector.
729 //_resize_to_match(other);
730 // the 'false' below means to enforce lazy evaluation. We don't use lazyAssign() because
731 // it wouldn't allow to copy a row-vector into a column-vector.
732 internal::call_assignment_no_alias(this->derived(), other.derived(), internal::assign_op<Scalar,typename OtherDerived::Scalar>());
733 return this->derived();
734 }
735
736 template<typename T0, typename T1>
737 EIGEN_DEVICE_FUNC
738 EIGEN_STRONG_INLINE void _init2(Index rows, Index cols, typename internal::enable_if<Base::SizeAtCompileTime!=2,T0>::type* = 0)
739 {
740 const bool t0_is_integer_alike = internal::is_valid_index_type<T0>::value;
741 const bool t1_is_integer_alike = internal::is_valid_index_type<T1>::value;
742 EIGEN_STATIC_ASSERT(t0_is_integer_alike &&
743 t1_is_integer_alike,
744 FLOATING_POINT_ARGUMENT_PASSED__INTEGER_WAS_EXPECTED)
745 resize(rows,cols);
746 }
747
748 template<typename T0, typename T1>
749 EIGEN_DEVICE_FUNC
750 EIGEN_STRONG_INLINE void _init2(const T0& val0, const T1& val1, typename internal::enable_if<Base::SizeAtCompileTime==2,T0>::type* = 0)
751 {
752 EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(PlainObjectBase, 2)
753 m_storage.data()[0] = Scalar(val0);
754 m_storage.data()[1] = Scalar(val1);
755 }
756
757 template<typename T0, typename T1>
758 EIGEN_DEVICE_FUNC
759 EIGEN_STRONG_INLINE void _init2(const Index& val0, const Index& val1,
760 typename internal::enable_if< (!internal::is_same<Index,Scalar>::value)
761 && (internal::is_same<T0,Index>::value)
762 && (internal::is_same<T1,Index>::value)
763 && Base::SizeAtCompileTime==2,T1>::type* = 0)
764 {
765 EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(PlainObjectBase, 2)
766 m_storage.data()[0] = Scalar(val0);
767 m_storage.data()[1] = Scalar(val1);
768 }
769
770 // The argument is convertible to the Index type and we either have a non 1x1 Matrix, or a dynamic-sized Array,
771 // then the argument is meant to be the size of the object.
772 template<typename T>
773 EIGEN_DEVICE_FUNC
774 EIGEN_STRONG_INLINE void _init1(Index size, typename internal::enable_if< (Base::SizeAtCompileTime!=1 || !internal::is_convertible<T, Scalar>::value)
775 && ((!internal::is_same<typename internal::traits<Derived>::XprKind,ArrayXpr>::value || Base::SizeAtCompileTime==Dynamic)),T>::type* = 0)
776 {
777 // NOTE MSVC 2008 complains if we directly put bool(NumTraits<T>::IsInteger) as the EIGEN_STATIC_ASSERT argument.
778 const bool is_integer_alike = internal::is_valid_index_type<T>::value;
779 EIGEN_UNUSED_VARIABLE(is_integer_alike);
780 EIGEN_STATIC_ASSERT(is_integer_alike,
781 FLOATING_POINT_ARGUMENT_PASSED__INTEGER_WAS_EXPECTED)
782 resize(size);
783 }
784
785 // We have a 1x1 matrix/array => the argument is interpreted as the value of the unique coefficient (case where scalar type can be implicitely converted)
786 template<typename T>
787 EIGEN_DEVICE_FUNC
788 EIGEN_STRONG_INLINE void _init1(const Scalar& val0, typename internal::enable_if<Base::SizeAtCompileTime==1 && internal::is_convertible<T, Scalar>::value,T>::type* = 0)
789 {
790 EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(PlainObjectBase, 1)
791 m_storage.data()[0] = val0;
792 }
793
794 // We have a 1x1 matrix/array => the argument is interpreted as the value of the unique coefficient (case where scalar type match the index type)
795 template<typename T>
796 EIGEN_DEVICE_FUNC
797 EIGEN_STRONG_INLINE void _init1(const Index& val0,
798 typename internal::enable_if< (!internal::is_same<Index,Scalar>::value)
799 && (internal::is_same<Index,T>::value)
800 && Base::SizeAtCompileTime==1
801 && internal::is_convertible<T, Scalar>::value,T*>::type* = 0)
802 {
803 EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(PlainObjectBase, 1)
804 m_storage.data()[0] = Scalar(val0);
805 }
806
807 // Initialize a fixed size matrix from a pointer to raw data
808 template<typename T>
809 EIGEN_DEVICE_FUNC
810 EIGEN_STRONG_INLINE void _init1(const Scalar* data){
811 this->_set_noalias(ConstMapType(data));
812 }
813
814 // Initialize an arbitrary matrix from a dense expression
815 template<typename T, typename OtherDerived>
816 EIGEN_DEVICE_FUNC
817 EIGEN_STRONG_INLINE void _init1(const DenseBase<OtherDerived>& other){
818 this->_set_noalias(other);
819 }
820
821 // Initialize an arbitrary matrix from an object convertible to the Derived type.
822 template<typename T>
823 EIGEN_DEVICE_FUNC
824 EIGEN_STRONG_INLINE void _init1(const Derived& other){
825 this->_set_noalias(other);
826 }
827
828 // Initialize an arbitrary matrix from a generic Eigen expression
829 template<typename T, typename OtherDerived>
830 EIGEN_DEVICE_FUNC
831 EIGEN_STRONG_INLINE void _init1(const EigenBase<OtherDerived>& other){
832 this->derived() = other;
833 }
834
835 template<typename T, typename OtherDerived>
836 EIGEN_DEVICE_FUNC
837 EIGEN_STRONG_INLINE void _init1(const ReturnByValue<OtherDerived>& other)
838 {
839 resize(other.rows(), other.cols());
840 other.evalTo(this->derived());
841 }
842
843 template<typename T, typename OtherDerived, int ColsAtCompileTime>
844 EIGEN_DEVICE_FUNC
845 EIGEN_STRONG_INLINE void _init1(const RotationBase<OtherDerived,ColsAtCompileTime>& r)
846 {
847 this->derived() = r;
848 }
849
850 // For fixed-size Array<Scalar,...>
851 template<typename T>
852 EIGEN_DEVICE_FUNC
853 EIGEN_STRONG_INLINE void _init1(const Scalar& val0,
854 typename internal::enable_if< Base::SizeAtCompileTime!=Dynamic
855 && Base::SizeAtCompileTime!=1
856 && internal::is_convertible<T, Scalar>::value
857 && internal::is_same<typename internal::traits<Derived>::XprKind,ArrayXpr>::value,T>::type* = 0)
858 {
859 Base::setConstant(val0);
860 }
861
862 // For fixed-size Array<Index,...>
863 template<typename T>
864 EIGEN_DEVICE_FUNC
865 EIGEN_STRONG_INLINE void _init1(const Index& val0,
866 typename internal::enable_if< (!internal::is_same<Index,Scalar>::value)
867 && (internal::is_same<Index,T>::value)
868 && Base::SizeAtCompileTime!=Dynamic
869 && Base::SizeAtCompileTime!=1
870 && internal::is_convertible<T, Scalar>::value
871 && internal::is_same<typename internal::traits<Derived>::XprKind,ArrayXpr>::value,T*>::type* = 0)
872 {
873 Base::setConstant(val0);
874 }
875
876 template<typename MatrixTypeA, typename MatrixTypeB, bool SwapPointers>
877 friend struct internal::matrix_swap_impl;
878
879 public:
880
881#ifndef EIGEN_PARSED_BY_DOXYGEN
886 template<typename OtherDerived>
887 EIGEN_DEVICE_FUNC
888 void swap(DenseBase<OtherDerived> & other)
889 {
890 enum { SwapPointers = internal::is_same<Derived, OtherDerived>::value && Base::SizeAtCompileTime==Dynamic };
891 internal::matrix_swap_impl<Derived, OtherDerived, bool(SwapPointers)>::run(this->derived(), other.derived());
892 }
893
897 template<typename OtherDerived>
898 EIGEN_DEVICE_FUNC
899 void swap(DenseBase<OtherDerived> const & other)
900 { Base::swap(other.derived()); }
901
902 EIGEN_DEVICE_FUNC
903 static EIGEN_STRONG_INLINE void _check_template_params()
904 {
905 EIGEN_STATIC_ASSERT((EIGEN_IMPLIES(MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1, (Options&RowMajor)==RowMajor)
906 && EIGEN_IMPLIES(MaxColsAtCompileTime==1 && MaxRowsAtCompileTime!=1, (Options&RowMajor)==0)
907 && ((RowsAtCompileTime == Dynamic) || (RowsAtCompileTime >= 0))
908 && ((ColsAtCompileTime == Dynamic) || (ColsAtCompileTime >= 0))
909 && ((MaxRowsAtCompileTime == Dynamic) || (MaxRowsAtCompileTime >= 0))
910 && ((MaxColsAtCompileTime == Dynamic) || (MaxColsAtCompileTime >= 0))
911 && (MaxRowsAtCompileTime == RowsAtCompileTime || RowsAtCompileTime==Dynamic)
912 && (MaxColsAtCompileTime == ColsAtCompileTime || ColsAtCompileTime==Dynamic)
913 && (Options & (DontAlign|RowMajor)) == Options),
914 INVALID_MATRIX_TEMPLATE_PARAMETERS)
915 }
916
917 enum { IsPlainObjectBase = 1 };
918#endif
919};
920
921namespace internal {
922
923template <typename Derived, typename OtherDerived, bool IsVector>
924struct conservative_resize_like_impl
925{
926 static void run(DenseBase<Derived>& _this, Index rows, Index cols)
927 {
928 if (_this.rows() == rows && _this.cols() == cols) return;
929 EIGEN_STATIC_ASSERT_DYNAMIC_SIZE(Derived)
930
931 if ( ( Derived::IsRowMajor && _this.cols() == cols) || // row-major and we change only the number of rows
932 (!Derived::IsRowMajor && _this.rows() == rows) ) // column-major and we change only the number of columns
933 {
934 internal::check_rows_cols_for_overflow<Derived::MaxSizeAtCompileTime>::run(rows, cols);
935 _this.derived().m_storage.conservativeResize(rows*cols,rows,cols);
936 }
937 else
938 {
939 // The storage order does not allow us to use reallocation.
940 typename Derived::PlainObject tmp(rows,cols);
941 const Index common_rows = numext::mini(rows, _this.rows());
942 const Index common_cols = numext::mini(cols, _this.cols());
943 tmp.block(0,0,common_rows,common_cols) = _this.block(0,0,common_rows,common_cols);
944 _this.derived().swap(tmp);
945 }
946 }
947
948 static void run(DenseBase<Derived>& _this, const DenseBase<OtherDerived>& other)
949 {
950 if (_this.rows() == other.rows() && _this.cols() == other.cols()) return;
951
952 // Note: Here is space for improvement. Basically, for conservativeResize(Index,Index),
953 // neither RowsAtCompileTime or ColsAtCompileTime must be Dynamic. If only one of the
954 // dimensions is dynamic, one could use either conservativeResize(Index rows, NoChange_t) or
955 // conservativeResize(NoChange_t, Index cols). For these methods new static asserts like
956 // EIGEN_STATIC_ASSERT_DYNAMIC_ROWS and EIGEN_STATIC_ASSERT_DYNAMIC_COLS would be good.
957 EIGEN_STATIC_ASSERT_DYNAMIC_SIZE(Derived)
958 EIGEN_STATIC_ASSERT_DYNAMIC_SIZE(OtherDerived)
959
960 if ( ( Derived::IsRowMajor && _this.cols() == other.cols()) || // row-major and we change only the number of rows
961 (!Derived::IsRowMajor && _this.rows() == other.rows()) ) // column-major and we change only the number of columns
962 {
963 const Index new_rows = other.rows() - _this.rows();
964 const Index new_cols = other.cols() - _this.cols();
965 _this.derived().m_storage.conservativeResize(other.size(),other.rows(),other.cols());
966 if (new_rows>0)
967 _this.bottomRightCorner(new_rows, other.cols()) = other.bottomRows(new_rows);
968 else if (new_cols>0)
969 _this.bottomRightCorner(other.rows(), new_cols) = other.rightCols(new_cols);
970 }
971 else
972 {
973 // The storage order does not allow us to use reallocation.
974 typename Derived::PlainObject tmp(other);
975 const Index common_rows = numext::mini(tmp.rows(), _this.rows());
976 const Index common_cols = numext::mini(tmp.cols(), _this.cols());
977 tmp.block(0,0,common_rows,common_cols) = _this.block(0,0,common_rows,common_cols);
978 _this.derived().swap(tmp);
979 }
980 }
981};
982
983// Here, the specialization for vectors inherits from the general matrix case
984// to allow calling .conservativeResize(rows,cols) on vectors.
985template <typename Derived, typename OtherDerived>
986struct conservative_resize_like_impl<Derived,OtherDerived,true>
987 : conservative_resize_like_impl<Derived,OtherDerived,false>
988{
989 using conservative_resize_like_impl<Derived,OtherDerived,false>::run;
990
991 static void run(DenseBase<Derived>& _this, Index size)
992 {
993 const Index new_rows = Derived::RowsAtCompileTime==1 ? 1 : size;
994 const Index new_cols = Derived::RowsAtCompileTime==1 ? size : 1;
995 _this.derived().m_storage.conservativeResize(size,new_rows,new_cols);
996 }
997
998 static void run(DenseBase<Derived>& _this, const DenseBase<OtherDerived>& other)
999 {
1000 if (_this.rows() == other.rows() && _this.cols() == other.cols()) return;
1001
1002 const Index num_new_elements = other.size() - _this.size();
1003
1004 const Index new_rows = Derived::RowsAtCompileTime==1 ? 1 : other.rows();
1005 const Index new_cols = Derived::RowsAtCompileTime==1 ? other.cols() : 1;
1006 _this.derived().m_storage.conservativeResize(other.size(),new_rows,new_cols);
1007
1008 if (num_new_elements > 0)
1009 _this.tail(num_new_elements) = other.tail(num_new_elements);
1010 }
1011};
1012
1013template<typename MatrixTypeA, typename MatrixTypeB, bool SwapPointers>
1014struct matrix_swap_impl
1015{
1016 EIGEN_DEVICE_FUNC
1017 static inline void run(MatrixTypeA& a, MatrixTypeB& b)
1018 {
1019 a.base().swap(b);
1020 }
1021};
1022
1023template<typename MatrixTypeA, typename MatrixTypeB>
1024struct matrix_swap_impl<MatrixTypeA, MatrixTypeB, true>
1025{
1026 EIGEN_DEVICE_FUNC
1027 static inline void run(MatrixTypeA& a, MatrixTypeB& b)
1028 {
1029 static_cast<typename MatrixTypeA::Base&>(a).m_storage.swap(static_cast<typename MatrixTypeB::Base&>(b).m_storage);
1030 }
1031};
1032
1033} // end namespace internal
1034
1035} // end namespace Eigen
1036
1037#endif // EIGEN_DENSESTORAGEBASE_H
General-purpose arrays with easy API for coefficient-wise operations.
Definition Array.h:47
Base class for all dense matrices, vectors, and arrays.
Definition DenseBase.h:47
A matrix or vector expression mapping an existing array of data.
Definition Map.h:96
The matrix class, also used for vectors and row-vectors.
Definition Matrix.h:180
Dense storage base class for matrices and arrays.
Definition PlainObjectBase.h:100
Scalar & coeffRef(Index rowId, Index colId)
Definition PlainObjectBase.h:183
void resize(NoChange_t, Index cols)
Definition PlainObjectBase.h:334
const Scalar & coeff(Index index) const
Definition PlainObjectBase.h:173
PlainObjectBase(const ReturnByValue< OtherDerived > &other)
Copy constructor with in-place evaluation.
Definition PlainObjectBase.h:553
static StridedMapType< Stride< Outer, Inner > >::type Map(Scalar *data, Index size, const Stride< Outer, Inner > &stride)
Definition PlainObjectBase.h:623
void _init1(const Scalar &val0, typename internal::enable_if< Base::SizeAtCompileTime!=Dynamic &&Base::SizeAtCompileTime!=1 &&internal::is_convertible< T, Scalar >::value &&internal::is_same< typename internal::traits< Derived >::XprKind, ArrayXpr >::value, T >::type *=0)
Definition PlainObjectBase.h:853
void _init2(const T0 &val0, const T1 &val1, typename internal::enable_if< Base::SizeAtCompileTime==2, T0 >::type *=0)
Definition PlainObjectBase.h:750
void _init1(const Index &val0, typename internal::enable_if<(!internal::is_same< Index, Scalar >::value) &&(internal::is_same< Index, T >::value) &&Base::SizeAtCompileTime!=Dynamic &&Base::SizeAtCompileTime!=1 &&internal::is_convertible< T, Scalar >::value &&internal::is_same< typename internal::traits< Derived >::XprKind, ArrayXpr >::value, T * >::type *=0)
Definition PlainObjectBase.h:865
static StridedMapType< Stride< Outer, Inner > >::type Map(Scalar *data, Index rows, Index cols, const Stride< Outer, Inner > &stride)
Definition PlainObjectBase.h:629
const Scalar & coeffRef(Index rowId, Index colId) const
Definition PlainObjectBase.h:204
void _resize_to_match(const EigenBase< OtherDerived > &other)
Definition PlainObjectBase.h:682
Derived & lazyAssign(const DenseBase< OtherDerived > &other)
Definition PlainObjectBase.h:465
static StridedAlignedMapType< Stride< Outer, Inner > >::type MapAligned(Scalar *data, Index rows, Index cols, const Stride< Outer, Inner > &stride)
Definition PlainObjectBase.h:648
static StridedConstAlignedMapType< Stride< Outer, Inner > >::type MapAligned(const Scalar *data, const Stride< Outer, Inner > &stride)
Definition PlainObjectBase.h:633
void _init1(const EigenBase< OtherDerived > &other)
Definition PlainObjectBase.h:831
void conservativeResizeLike(const DenseBase< OtherDerived > &other)
Definition PlainObjectBase.h:448
void _init1(const RotationBase< OtherDerived, ColsAtCompileTime > &r)
Definition PlainObjectBase.h:845
PlainObjectBase(const PlainObjectBase &other)
Definition PlainObjectBase.h:519
void _init2(Index rows, Index cols, typename internal::enable_if< Base::SizeAtCompileTime!=2, T0 >::type *=0)
Definition PlainObjectBase.h:738
const Scalar & coeff(Index rowId, Index colId) const
Definition PlainObjectBase.h:160
Derived & setRandom(Index size)
Definition Random.h:151
static AlignedMapType MapAligned(Scalar *data, Index size)
Definition PlainObjectBase.h:606
void _init1(const DenseBase< OtherDerived > &other)
Definition PlainObjectBase.h:817
void conservativeResize(Index rows, Index cols)
Definition PlainObjectBase.h:390
static ConstAlignedMapType MapAligned(const Scalar *data, Index size)
Definition PlainObjectBase.h:604
Derived & setZero(Index rows, Index cols)
Definition CwiseNullaryOp.h:533
PlainObjectBase(const DenseBase< OtherDerived > &other)
Definition PlainObjectBase.h:532
void conservativeResize(Index size)
Definition PlainObjectBase.h:432
const Scalar & coeffRef(Index index) const
Definition PlainObjectBase.h:215
static StridedMapType< Stride< Outer, Inner > >::type Map(Scalar *data, const Stride< Outer, Inner > &stride)
Definition PlainObjectBase.h:617
Derived & _set_noalias(const DenseBase< OtherDerived > &other)
Definition PlainObjectBase.h:725
void _init1(const Scalar &val0, typename internal::enable_if< Base::SizeAtCompileTime==1 &&internal::is_convertible< T, Scalar >::value, T >::type *=0)
Definition PlainObjectBase.h:788
Derived & setOnes(Index size)
Definition CwiseNullaryOp.h:641
static StridedAlignedMapType< Stride< Outer, Inner > >::type MapAligned(Scalar *data, Index size, const Stride< Outer, Inner > &stride)
Definition PlainObjectBase.h:642
Derived & setRandom(Index rows, Index cols)
Definition Random.h:174
static ConstAlignedMapType MapAligned(const Scalar *data, Index rows, Index cols)
Definition PlainObjectBase.h:608
void resize(Index size)
Definition PlainObjectBase.h:309
Scalar * data()
Definition PlainObjectBase.h:259
void conservativeResize(Index rows, NoChange_t)
Definition PlainObjectBase.h:403
PlainObjectBase(const EigenBase< OtherDerived > &other)
Definition PlainObjectBase.h:543
Derived & _set(const DenseBase< OtherDerived > &other)
Copies the value of the expression other into *this with automatic resizing.
Definition PlainObjectBase.h:712
static AlignedMapType MapAligned(Scalar *data, Index rows, Index cols)
Definition PlainObjectBase.h:610
void resize(Index rows, Index cols)
Definition PlainObjectBase.h:279
static AlignedMapType MapAligned(Scalar *data)
Definition PlainObjectBase.h:602
Scalar & coeffRef(Index index)
Definition PlainObjectBase.h:196
void _init1(const Scalar *data)
Definition PlainObjectBase.h:810
void resizeLike(const EigenBase< OtherDerived > &_other)
Definition PlainObjectBase.h:362
static StridedAlignedMapType< Stride< Outer, Inner > >::type MapAligned(Scalar *data, const Stride< Outer, Inner > &stride)
Definition PlainObjectBase.h:636
Derived & setConstant(Index size, const Scalar &val)
Definition CwiseNullaryOp.h:341
void _init1(const ReturnByValue< OtherDerived > &other)
Definition PlainObjectBase.h:837
static ConstMapType Map(const Scalar *data)
Definition PlainObjectBase.h:587
static MapType Map(Scalar *data, Index size)
Definition PlainObjectBase.h:593
void _init1(const Derived &other)
Definition PlainObjectBase.h:824
static MapType Map(Scalar *data)
Definition PlainObjectBase.h:589
static StridedConstMapType< Stride< Outer, Inner > >::type Map(const Scalar *data, const Stride< Outer, Inner > &stride)
Definition PlainObjectBase.h:614
static ConstMapType Map(const Scalar *data, Index size)
Definition PlainObjectBase.h:591
static StridedConstMapType< Stride< Outer, Inner > >::type Map(const Scalar *data, Index size, const Stride< Outer, Inner > &stride)
Definition PlainObjectBase.h:620
void _init2(const Index &val0, const Index &val1, typename internal::enable_if<(!internal::is_same< Index, Scalar >::value) &&(internal::is_same< T0, Index >::value) &&(internal::is_same< T1, Index >::value) &&Base::SizeAtCompileTime==2, T1 >::type *=0)
Definition PlainObjectBase.h:759
Derived & setZero(Index size)
Definition CwiseNullaryOp.h:515
static StridedConstAlignedMapType< Stride< Outer, Inner > >::type MapAligned(const Scalar *data, Index rows, Index cols, const Stride< Outer, Inner > &stride)
Definition PlainObjectBase.h:645
Derived & setOnes(Index rows, Index cols)
Definition CwiseNullaryOp.h:659
static MapType Map(Scalar *data, Index rows, Index cols)
Definition PlainObjectBase.h:597
Derived & operator=(const PlainObjectBase &other)
Definition PlainObjectBase.h:457
void _init1(const Index &val0, typename internal::enable_if<(!internal::is_same< Index, Scalar >::value) &&(internal::is_same< Index, T >::value) &&Base::SizeAtCompileTime==1 &&internal::is_convertible< T, Scalar >::value, T * >::type *=0)
Definition PlainObjectBase.h:797
static StridedConstAlignedMapType< Stride< Outer, Inner > >::type MapAligned(const Scalar *data, Index size, const Stride< Outer, Inner > &stride)
Definition PlainObjectBase.h:639
static ConstMapType Map(const Scalar *data, Index rows, Index cols)
Definition PlainObjectBase.h:595
static StridedConstMapType< Stride< Outer, Inner > >::type Map(const Scalar *data, Index rows, Index cols, const Stride< Outer, Inner > &stride)
Definition PlainObjectBase.h:626
void resize(Index rows, NoChange_t)
Definition PlainObjectBase.h:348
static ConstAlignedMapType MapAligned(const Scalar *data)
Definition PlainObjectBase.h:600
const Scalar * data() const
Definition PlainObjectBase.h:255
void _init1(Index size, typename internal::enable_if<(Base::SizeAtCompileTime!=1||!internal::is_convertible< T, Scalar >::value) &&((!internal::is_same< typename internal::traits< Derived >::XprKind, ArrayXpr >::value||Base::SizeAtCompileTime==Dynamic)), T >::type *=0)
Definition PlainObjectBase.h:774
Derived & setConstant(Index rows, Index cols, const Scalar &val)
Definition CwiseNullaryOp.h:360
Derived & operator=(const EigenBase< OtherDerived > &other)
Copies the generic expression other into *this.
Definition PlainObjectBase.h:568
void conservativeResize(NoChange_t, Index cols)
Definition PlainObjectBase.h:417
Common base class for compact rotation representations.
Definition RotationBase.h:30
Holds strides information for Map.
Definition Stride.h:45
@ Unaligned
Definition Constants.h:228
@ DontAlign
Definition Constants.h:326
@ RowMajor
Definition Constants.h:322
const unsigned int RowMajorBit
Definition Constants.h:61
Namespace containing all symbols from the Eigen library.
Definition A05_PortingFrom2To3.dox:1
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition Meta.h:65
const int Dynamic
Definition Constants.h:21
Definition Constants.h:509
Definition EigenBase.h:30
Index cols() const
Definition EigenBase.h:62
Derived & derived()
Definition EigenBase.h:45
Index rows() const
Definition EigenBase.h:59
Index size() const
Definition EigenBase.h:66
Definition PlainObjectBase.h:71