NestByValue.h 3.32 KB
Newer Older
LM's avatar
LM committed
1 2 3 4 5 6
// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>
//
Don Gagne's avatar
Don Gagne committed
7 8 9
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
LM's avatar
LM committed
10 11 12 13

#ifndef EIGEN_NESTBYVALUE_H
#define EIGEN_NESTBYVALUE_H

Don Gagne's avatar
Don Gagne committed
14 15
namespace Eigen {

16 17 18 19 20 21
namespace internal {
template<typename ExpressionType>
struct traits<NestByValue<ExpressionType> > : public traits<ExpressionType>
{};
}

LM's avatar
LM committed
22 23 24 25 26
/** \class NestByValue
  * \ingroup Core_Module
  *
  * \brief Expression which must be nested by value
  *
27
  * \tparam ExpressionType the type of the object of which we are requiring nesting-by-value
LM's avatar
LM committed
28 29 30 31 32 33 34 35 36 37 38 39 40 41
  *
  * This class is the return type of MatrixBase::nestByValue()
  * and most of the time this is the only way it is used.
  *
  * \sa MatrixBase::nestByValue()
  */
template<typename ExpressionType> class NestByValue
  : public internal::dense_xpr_base< NestByValue<ExpressionType> >::type
{
  public:

    typedef typename internal::dense_xpr_base<NestByValue>::type Base;
    EIGEN_DENSE_PUBLIC_INTERFACE(NestByValue)

42
    EIGEN_DEVICE_FUNC explicit inline NestByValue(const ExpressionType& matrix) : m_expression(matrix) {}
LM's avatar
LM committed
43

44 45 46 47
    EIGEN_DEVICE_FUNC inline Index rows() const { return m_expression.rows(); }
    EIGEN_DEVICE_FUNC inline Index cols() const { return m_expression.cols(); }
    EIGEN_DEVICE_FUNC inline Index outerStride() const { return m_expression.outerStride(); }
    EIGEN_DEVICE_FUNC inline Index innerStride() const { return m_expression.innerStride(); }
LM's avatar
LM committed
48

49
    EIGEN_DEVICE_FUNC inline const CoeffReturnType coeff(Index row, Index col) const
LM's avatar
LM committed
50 51 52 53
    {
      return m_expression.coeff(row, col);
    }

54
    EIGEN_DEVICE_FUNC inline Scalar& coeffRef(Index row, Index col)
LM's avatar
LM committed
55 56 57 58
    {
      return m_expression.const_cast_derived().coeffRef(row, col);
    }

59
    EIGEN_DEVICE_FUNC inline const CoeffReturnType coeff(Index index) const
LM's avatar
LM committed
60 61 62 63
    {
      return m_expression.coeff(index);
    }

64
    EIGEN_DEVICE_FUNC inline Scalar& coeffRef(Index index)
LM's avatar
LM committed
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
    {
      return m_expression.const_cast_derived().coeffRef(index);
    }

    template<int LoadMode>
    inline const PacketScalar packet(Index row, Index col) const
    {
      return m_expression.template packet<LoadMode>(row, col);
    }

    template<int LoadMode>
    inline void writePacket(Index row, Index col, const PacketScalar& x)
    {
      m_expression.const_cast_derived().template writePacket<LoadMode>(row, col, x);
    }

    template<int LoadMode>
    inline const PacketScalar packet(Index index) const
    {
      return m_expression.template packet<LoadMode>(index);
    }

    template<int LoadMode>
    inline void writePacket(Index index, const PacketScalar& x)
    {
      m_expression.const_cast_derived().template writePacket<LoadMode>(index, x);
    }

93
    EIGEN_DEVICE_FUNC operator const ExpressionType&() const { return m_expression; }
LM's avatar
LM committed
94 95 96 97 98 99 100 101 102 103 104 105 106 107

  protected:
    const ExpressionType m_expression;
};

/** \returns an expression of the temporary version of *this.
  */
template<typename Derived>
inline const NestByValue<Derived>
DenseBase<Derived>::nestByValue() const
{
  return NestByValue<Derived>(derived());
}

Don Gagne's avatar
Don Gagne committed
108 109
} // end namespace Eigen

LM's avatar
LM committed
110
#endif // EIGEN_NESTBYVALUE_H