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