1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_NESTBYVALUE_H
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_NESTBYVALUE_H
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen {
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangnamespace internal {
172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename ExpressionType>
182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct traits<NestByValue<ExpressionType> > : public traits<ExpressionType>
192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{};
202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}
212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \class NestByValue
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \ingroup Core_Module
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \brief Expression which must be nested by value
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \tparam ExpressionType the type of the object of which we are requiring nesting-by-value
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * This class is the return type of MatrixBase::nestByValue()
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * and most of the time this is the only way it is used.
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa MatrixBase::nestByValue()
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType> class NestByValue
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  : public internal::dense_xpr_base< NestByValue<ExpressionType> >::type
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  public:
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::dense_xpr_base<NestByValue>::type Base;
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_DENSE_PUBLIC_INTERFACE(NestByValue)
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC explicit inline NestByValue(const ExpressionType& matrix) : m_expression(matrix) {}
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC inline Index rows() const { return m_expression.rows(); }
452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC inline Index cols() const { return m_expression.cols(); }
462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC inline Index outerStride() const { return m_expression.outerStride(); }
472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC inline Index innerStride() const { return m_expression.innerStride(); }
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC inline const CoeffReturnType coeff(Index row, Index col) const
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_expression.coeff(row, col);
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC inline Scalar& coeffRef(Index row, Index col)
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_expression.const_cast_derived().coeffRef(row, col);
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC inline const CoeffReturnType coeff(Index index) const
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_expression.coeff(index);
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC inline Scalar& coeffRef(Index index)
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_expression.const_cast_derived().coeffRef(index);
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int LoadMode>
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline const PacketScalar packet(Index row, Index col) const
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_expression.template packet<LoadMode>(row, col);
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int LoadMode>
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline void writePacket(Index row, Index col, const PacketScalar& x)
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      m_expression.const_cast_derived().template writePacket<LoadMode>(row, col, x);
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int LoadMode>
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline const PacketScalar packet(Index index) const
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_expression.template packet<LoadMode>(index);
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int LoadMode>
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline void writePacket(Index index, const PacketScalar& x)
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      m_expression.const_cast_derived().template writePacket<LoadMode>(index, x);
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC operator const ExpressionType&() const { return m_expression; }
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  protected:
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const ExpressionType m_expression;
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns an expression of the temporary version of *this.
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const NestByValue<Derived>
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::nestByValue() const
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return NestByValue<Derived>(derived());
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_NESTBYVALUE_H
111