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 Benoit Jacob <jacob.benoit.1@gmail.com> 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr> 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_EIGENBASE_H 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_EIGENBASE_H 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen { 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** Common base class for all classes T such that MatrixBase has an operator=(T) and a constructor MatrixBase(T). 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * In other words, an EigenBase object is an object that can be copied into a MatrixBase. 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Besides MatrixBase-derived classes, this also includes special matrix classes such as diagonal matrices, etc. 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Notice that this class is trivial, it is only used to disambiguate overloaded functions. 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa \ref TopicClassHierarchy 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> struct EigenBase 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// typedef typename internal::plain_matrix_type<Derived>::type PlainObject; 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<Derived>::StorageKind StorageKind; 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<Derived>::Index Index; 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns a reference to the derived object */ 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Derived& derived() { return *static_cast<Derived*>(this); } 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns a const reference to the derived object */ 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Derived& derived() const { return *static_cast<const Derived*>(this); } 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Derived& const_cast_derived() const 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return *static_cast<Derived*>(const_cast<EigenBase*>(this)); } 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const Derived& const_derived() const 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return *static_cast<const Derived*>(this); } 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the number of rows. \sa cols(), RowsAtCompileTime */ 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index rows() const { return derived().rows(); } 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the number of columns. \sa rows(), ColsAtCompileTime*/ 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index cols() const { return derived().cols(); } 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the number of coefficients, which is rows()*cols(). 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa rows(), cols(), SizeAtCompileTime. */ 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index size() const { return rows() * cols(); } 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \internal Don't use it, but do the equivalent: \code dst = *this; \endcode */ 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Dest> inline void evalTo(Dest& dst) const 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { derived().evalTo(dst); } 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \internal Don't use it, but do the equivalent: \code dst += *this; \endcode */ 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Dest> inline void addTo(Dest& dst) const 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // This is the default implementation, 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // derived class can reimplement it in a more optimized way. 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename Dest::PlainObject res(rows(),cols()); 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath evalTo(res); 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath dst += res; 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \internal Don't use it, but do the equivalent: \code dst -= *this; \endcode */ 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Dest> inline void subTo(Dest& dst) const 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // This is the default implementation, 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // derived class can reimplement it in a more optimized way. 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename Dest::PlainObject res(rows(),cols()); 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath evalTo(res); 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath dst -= res; 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \internal Don't use it, but do the equivalent: \code dst.applyOnTheRight(*this); \endcode */ 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Dest> inline void applyThisOnTheRight(Dest& dst) const 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // This is the default implementation, 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // derived class can reimplement it in a more optimized way. 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath dst = dst * this->derived(); 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \internal Don't use it, but do the equivalent: \code dst.applyOnTheLeft(*this); \endcode */ 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Dest> inline void applyThisOnTheLeft(Dest& dst) const 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // This is the default implementation, 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // derived class can reimplement it in a more optimized way. 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath dst = this->derived() * dst; 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/*************************************************************************** 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* Implementation of matrix base methods 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath***************************************************************************/ 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \brief Copies the generic expression \a other into *this. 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \details The expression must provide a (templated) evalTo(Derived& dst) const 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * function which does the actual job. In practice, this allows any user to write 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * its own special matrix without having to modify MatrixBase 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \returns a reference to *this. 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename OtherDerived> 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDerived& DenseBase<Derived>::operator=(const EigenBase<OtherDerived> &other) 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath other.derived().evalTo(derived()); 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived(); 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename OtherDerived> 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDerived& DenseBase<Derived>::operator+=(const EigenBase<OtherDerived> &other) 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath other.derived().addTo(derived()); 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived(); 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename OtherDerived> 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDerived& DenseBase<Derived>::operator-=(const EigenBase<OtherDerived> &other) 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath other.derived().subTo(derived()); 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived(); 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_EIGENBASE_H 132