1 | // This file is part of Eigen, a lightweight C++ template library |
2 | // for linear algebra. |
3 | // |
4 | // Copyright (C) 2008 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_NESTBYVALUE_H |
12 | #define EIGEN_NESTBYVALUE_H |
13 | |
14 | namespace Eigen { |
15 | |
16 | namespace internal { |
17 | template<typename ExpressionType> |
18 | struct traits<NestByValue<ExpressionType> > : public traits<ExpressionType> |
19 | {}; |
20 | } |
21 | |
22 | /** \class NestByValue |
23 | * \ingroup Core_Module |
24 | * |
25 | * \brief Expression which must be nested by value |
26 | * |
27 | * \tparam ExpressionType the type of the object of which we are requiring nesting-by-value |
28 | * |
29 | * This class is the return type of MatrixBase::nestByValue() |
30 | * and most of the time this is the only way it is used. |
31 | * |
32 | * \sa MatrixBase::nestByValue() |
33 | */ |
34 | template<typename ExpressionType> class NestByValue |
35 | : public internal::dense_xpr_base< NestByValue<ExpressionType> >::type |
36 | { |
37 | public: |
38 | |
39 | typedef typename internal::dense_xpr_base<NestByValue>::type Base; |
40 | EIGEN_DENSE_PUBLIC_INTERFACE(NestByValue) |
41 | |
42 | EIGEN_DEVICE_FUNC explicit inline NestByValue(const ExpressionType& matrix) : m_expression(matrix) {} |
43 | |
44 | EIGEN_DEVICE_FUNC inline Index rows() const { return m_expression.rows(); } |
45 | EIGEN_DEVICE_FUNC inline Index cols() const { return m_expression.cols(); } |
46 | EIGEN_DEVICE_FUNC inline Index outerStride() const { return m_expression.outerStride(); } |
47 | EIGEN_DEVICE_FUNC inline Index innerStride() const { return m_expression.innerStride(); } |
48 | |
49 | EIGEN_DEVICE_FUNC inline const CoeffReturnType coeff(Index row, Index col) const |
50 | { |
51 | return m_expression.coeff(row, col); |
52 | } |
53 | |
54 | EIGEN_DEVICE_FUNC inline Scalar& coeffRef(Index row, Index col) |
55 | { |
56 | return m_expression.const_cast_derived().coeffRef(row, col); |
57 | } |
58 | |
59 | EIGEN_DEVICE_FUNC inline const CoeffReturnType coeff(Index index) const |
60 | { |
61 | return m_expression.coeff(index); |
62 | } |
63 | |
64 | EIGEN_DEVICE_FUNC inline Scalar& coeffRef(Index index) |
65 | { |
66 | return m_expression.const_cast_derived().coeffRef(index); |
67 | } |
68 | |
69 | template<int LoadMode> |
70 | inline const PacketScalar packet(Index row, Index col) const |
71 | { |
72 | return m_expression.template packet<LoadMode>(row, col); |
73 | } |
74 | |
75 | template<int LoadMode> |
76 | inline void writePacket(Index row, Index col, const PacketScalar& x) |
77 | { |
78 | m_expression.const_cast_derived().template writePacket<LoadMode>(row, col, x); |
79 | } |
80 | |
81 | template<int LoadMode> |
82 | inline const PacketScalar packet(Index index) const |
83 | { |
84 | return m_expression.template packet<LoadMode>(index); |
85 | } |
86 | |
87 | template<int LoadMode> |
88 | inline void writePacket(Index index, const PacketScalar& x) |
89 | { |
90 | m_expression.const_cast_derived().template writePacket<LoadMode>(index, x); |
91 | } |
92 | |
93 | EIGEN_DEVICE_FUNC operator const ExpressionType&() const { return m_expression; } |
94 | |
95 | protected: |
96 | const ExpressionType m_expression; |
97 | }; |
98 | |
99 | /** \returns an expression of the temporary version of *this. |
100 | */ |
101 | template<typename Derived> |
102 | inline const NestByValue<Derived> |
103 | DenseBase<Derived>::nestByValue() const |
104 | { |
105 | return NestByValue<Derived>(derived()); |
106 | } |
107 | |
108 | } // end namespace Eigen |
109 | |
110 | #endif // EIGEN_NESTBYVALUE_H |
111 | |