1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr> 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2009-2010 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_RETURNBYVALUE_H 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_RETURNBYVALUE_H 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen { 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \class ReturnByValue 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \ingroup Core_Module 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal { 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct traits<ReturnByValue<Derived> > 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : public traits<typename traits<Derived>::ReturnType> 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // We're disabling the DirectAccess because e.g. the constructor of 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // the Block-with-DirectAccess expression requires to have a coeffRef method. 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // Also, we don't want to have to implement the stride stuff. 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Flags = (traits<typename traits<Derived>::ReturnType>::Flags 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath | EvalBeforeNestingBit) & ~DirectAccessBit 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/* The ReturnByValue object doesn't even have a coeff() method. 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * So the only way that nesting it in an expression can work, is by evaluating it into a plain matrix. 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * So internal::nested always gives the plain return matrix type. 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * FIXME: I don't understand why we need this specialization: isn't this taken care of by the EvalBeforeNestingBit ?? 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived,int n,typename PlainObject> 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct nested<ReturnByValue<Derived>, n, PlainObject> 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename traits<Derived>::ReturnType type; 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace internal 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class ReturnByValue 517faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez : internal::no_assignment_operator, public internal::dense_xpr_base< ReturnByValue<Derived> >::type 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<Derived>::ReturnType ReturnType; 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::dense_xpr_base<ReturnByValue>::type Base; 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_DENSE_PUBLIC_INTERFACE(ReturnByValue) 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Dest> 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline void evalTo(Dest& dst) const 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { static_cast<const Derived*>(this)->evalTo(dst); } 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index rows() const { return static_cast<const Derived*>(this)->rows(); } 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index cols() const { return static_cast<const Derived*>(this)->cols(); } 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_PARSED_BY_DOXYGEN 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define Unusable YOU_ARE_TRYING_TO_ACCESS_A_SINGLE_COEFFICIENT_IN_A_SPECIAL_EXPRESSION_WHERE_THAT_IS_NOT_ALLOWED_BECAUSE_THAT_WOULD_BE_INEFFICIENT 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath class Unusable{ 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Unusable(const Unusable&) {} 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Unusable& operator=(const Unusable&) {return *this;} 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Unusable& coeff(Index) const { return *reinterpret_cast<const Unusable*>(this); } 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Unusable& coeff(Index,Index) const { return *reinterpret_cast<const Unusable*>(this); } 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Unusable& coeffRef(Index) { return *reinterpret_cast<Unusable*>(this); } 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Unusable& coeffRef(Index,Index) { return *reinterpret_cast<Unusable*>(this); } 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename OtherDerived> 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDerived& DenseBase<Derived>::operator=(const ReturnByValue<OtherDerived>& other) 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath other.evalTo(derived()); 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived(); 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_RETURNBYVALUE_H 89