15 template<
typename Derived>
class RefBase;
16 template<
typename PlainObjectType,
int Options = 0,
17 typename StrideType =
typename internal::conditional<PlainObjectType::IsVectorAtCompileTime,InnerStride<1>,
OuterStride<> >::type >
class Ref;
90 template<
typename _PlainObjectType,
int _Options,
typename _Str
ideType>
91 struct traits<
Ref<_PlainObjectType, _Options, _StrideType> >
92 :
public traits<Map<_PlainObjectType, _Options, _StrideType> >
94 typedef _PlainObjectType PlainObjectType;
95 typedef _StrideType StrideType;
98 Flags = traits<Map<_PlainObjectType, _Options, _StrideType> >::Flags | NestByRefBit
101 template<
typename Derived>
struct match {
103 HasDirectAccess = internal::has_direct_access<Derived>::ret,
104 StorageOrderMatch = PlainObjectType::IsVectorAtCompileTime || Derived::IsVectorAtCompileTime || ((PlainObjectType::Flags&
RowMajorBit)==(Derived::Flags&
RowMajorBit)),
105 InnerStrideMatch =
int(StrideType::InnerStrideAtCompileTime)==int(Dynamic)
106 || int(StrideType::InnerStrideAtCompileTime)==int(Derived::InnerStrideAtCompileTime)
107 || (int(StrideType::InnerStrideAtCompileTime)==0 && int(Derived::InnerStrideAtCompileTime)==1),
108 OuterStrideMatch = Derived::IsVectorAtCompileTime
109 ||
int(StrideType::OuterStrideAtCompileTime)==int(Dynamic) || int(StrideType::OuterStrideAtCompileTime)==int(Derived::OuterStrideAtCompileTime),
110 AlignmentMatch = (_Options!=
Aligned) || ((PlainObjectType::Flags&
AlignedBit)==0) || ((traits<Derived>::Flags&AlignedBit)==
AlignedBit),
111 MatchAtCompileTime = HasDirectAccess && StorageOrderMatch && InnerStrideMatch && OuterStrideMatch && AlignmentMatch
113 typedef typename internal::conditional<MatchAtCompileTime,internal::true_type,internal::false_type>::type type;
118 template<
typename Derived>
119 struct traits<RefBase<Derived> > :
public traits<Derived> {};
123 template<
typename Derived>
class RefBase
126 typedef typename internal::traits<Derived>::PlainObjectType PlainObjectType;
127 typedef typename internal::traits<Derived>::StrideType StrideType;
132 EIGEN_DENSE_PUBLIC_INTERFACE(RefBase)
134 inline Index innerStride()
const 136 return StrideType::InnerStrideAtCompileTime != 0 ? m_stride.inner() : 1;
139 inline Index outerStride()
const 141 return StrideType::OuterStrideAtCompileTime != 0 ? m_stride.outer()
142 : IsVectorAtCompileTime ? this->size()
143 : int(Flags)&RowMajorBit ? this->cols()
148 : Base(0,RowsAtCompileTime==Dynamic?0:RowsAtCompileTime,ColsAtCompileTime==Dynamic?0:ColsAtCompileTime),
150 m_stride(StrideType::OuterStrideAtCompileTime==Dynamic?0:StrideType::OuterStrideAtCompileTime,
151 StrideType::InnerStrideAtCompileTime==Dynamic?0:StrideType::InnerStrideAtCompileTime)
154 EIGEN_INHERIT_ASSIGNMENT_OPERATORS(RefBase)
160 template<
typename Expression>
161 void construct(Expression& expr)
163 if(PlainObjectType::RowsAtCompileTime==1)
165 eigen_assert(expr.rows()==1 || expr.cols()==1);
166 ::new (static_cast<Base*>(
this)) Base(expr.data(), 1, expr.size());
168 else if(PlainObjectType::ColsAtCompileTime==1)
170 eigen_assert(expr.rows()==1 || expr.cols()==1);
171 ::new (static_cast<Base*>(
this)) Base(expr.data(), expr.size(), 1);
174 ::new (static_cast<Base*>(this)) Base(expr.data(), expr.rows(), expr.cols());
176 if(Expression::IsVectorAtCompileTime && (!PlainObjectType::IsVectorAtCompileTime) && ((Expression::Flags&RowMajorBit)!=(PlainObjectType::Flags&RowMajorBit)))
177 ::new (&m_stride) StrideBase(expr.innerStride(), StrideType::InnerStrideAtCompileTime==0?0:1);
179 ::new (&m_stride) StrideBase(StrideType::OuterStrideAtCompileTime==0?0:expr.outerStride(),
180 StrideType::InnerStrideAtCompileTime==0?0:expr.innerStride());
187 template<typename PlainObjectType,
int Options, typename StrideType> class
Ref 188 : public RefBase<
Ref<PlainObjectType, Options, StrideType> >
190 typedef internal::traits<Ref> Traits;
193 typedef RefBase<Ref> Base;
194 EIGEN_DENSE_PUBLIC_INTERFACE(
Ref)
197 #ifndef EIGEN_PARSED_BY_DOXYGEN 198 template<
typename Derived>
200 typename internal::enable_if<
bool(Traits::template match<Derived>::MatchAtCompileTime),Derived>::type* = 0)
202 Base::construct(expr);
204 template<
typename Derived>
206 typename internal::enable_if<
bool(internal::is_lvalue<Derived>::value&&
bool(Traits::template match<Derived>::MatchAtCompileTime)),Derived>::type* = 0,
207 int = Derived::ThisConstantIsPrivateInPlainObjectBase)
209 template<
typename Derived>
213 Base::construct(expr.const_cast_derived());
216 EIGEN_INHERIT_ASSIGNMENT_OPERATORS(
Ref)
221 template<
typename TPlainObjectType,
int Options,
typename Str
ideType>
class Ref<const TPlainObjectType, Options, StrideType>
222 :
public RefBase<Ref<const TPlainObjectType, Options, StrideType> >
224 typedef internal::traits<Ref> Traits;
227 typedef RefBase<Ref> Base;
228 EIGEN_DENSE_PUBLIC_INTERFACE(
Ref)
230 template<
typename Derived>
236 construct(expr.derived(),
typename Traits::template match<Derived>::type());
241 template<
typename Expression>
242 void construct(
const Expression& expr,internal::true_type)
244 Base::construct(expr);
247 template<
typename Expression>
248 void construct(
const Expression& expr, internal::false_type)
250 m_object.lazyAssign(expr);
251 Base::construct(m_object);
255 TPlainObjectType m_object;
260 #endif // EIGEN_REF_H Base class for Map and Block expression with direct access.
Definition: ForwardDeclarations.h:109
Base class for all dense matrices, vectors, and arrays.
Definition: DenseBase.h:41
Dense storage base class for matrices and arrays.
Definition: PlainObjectBase.h:85
A matrix or vector expression mapping an existing expressions.
Definition: Ref.h:17
Definition: Eigen_Colamd.h:54
Definition: Constants.h:194
const unsigned int RowMajorBit
Definition: Constants.h:53
Convenience specialization of Stride to specify only an outer stride See class Map for some examples...
Definition: Stride.h:97
const unsigned int AlignedBit
Definition: Constants.h:147