CwiseUnaryView.h revision c981c48f5bc9aefeffc0bcb0cc3934c2fae179dd
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//
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_CWISE_UNARY_VIEW_H
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_CWISE_UNARY_VIEW_H
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen {
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \class CwiseUnaryView
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \ingroup Core_Module
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \brief Generic lvalue expression of a coefficient-wise unary operator of a matrix or a vector
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \param ViewOp template functor implementing the view
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \param MatrixType the type of the matrix we are applying the unary operator
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * This class represents a lvalue expression of a generic unary view operator of a matrix or a vector.
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * It is the return type of real() and imag(), and most of the time this is the only way it is used.
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa MatrixBase::unaryViewExpr(const CustomUnaryOp &) const, class CwiseUnaryOp
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ViewOp, typename MatrixType>
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct traits<CwiseUnaryView<ViewOp, MatrixType> >
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : traits<MatrixType>
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename result_of<
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                     ViewOp(typename traits<MatrixType>::Scalar)
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                   >::type Scalar;
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename MatrixType::Nested MatrixTypeNested;
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename remove_all<MatrixTypeNested>::type _MatrixTypeNested;
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  enum {
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Flags = (traits<_MatrixTypeNested>::Flags & (HereditaryBits | LvalueBit | LinearAccessBit | DirectAccessBit)),
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CoeffReadCost = traits<_MatrixTypeNested>::CoeffReadCost + functor_traits<ViewOp>::Cost,
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    MatrixTypeInnerStride =  inner_stride_at_compile_time<MatrixType>::ret,
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // need to cast the sizeof's from size_t to int explicitly, otherwise:
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // "error: no integral type can represent all of the enumerator values
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    InnerStrideAtCompileTime = MatrixTypeInnerStride == Dynamic
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                             ? int(Dynamic)
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                             : int(MatrixTypeInnerStride)
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                               * int(sizeof(typename traits<MatrixType>::Scalar) / sizeof(Scalar)),
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    OuterStrideAtCompileTime = outer_stride_at_compile_time<MatrixType>::ret
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  };
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ViewOp, typename MatrixType, typename StorageKind>
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass CwiseUnaryViewImpl;
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ViewOp, typename MatrixType>
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass CwiseUnaryView : internal::no_assignment_operator,
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  public CwiseUnaryViewImpl<ViewOp, MatrixType, typename internal::traits<MatrixType>::StorageKind>
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  public:
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename CwiseUnaryViewImpl<ViewOp, MatrixType,typename internal::traits<MatrixType>::StorageKind>::Base Base;
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_GENERIC_PUBLIC_INTERFACE(CwiseUnaryView)
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline CwiseUnaryView(const MatrixType& mat, const ViewOp& func = ViewOp())
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      : m_matrix(mat), m_functor(func) {}
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(CwiseUnaryView)
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_STRONG_INLINE Index rows() const { return m_matrix.rows(); }
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_STRONG_INLINE Index cols() const { return m_matrix.cols(); }
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns the functor representing unary operation */
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const ViewOp& functor() const { return m_functor; }
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns the nested expression */
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const typename internal::remove_all<typename MatrixType::Nested>::type&
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    nestedExpression() const { return m_matrix; }
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns the nested expression */
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typename internal::remove_all<typename MatrixType::Nested>::type&
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    nestedExpression() { return m_matrix.const_cast_derived(); }
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  protected:
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // FIXME changed from MatrixType::Nested because of a weird compilation error with sun CC
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typename internal::nested<MatrixType>::type m_matrix;
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ViewOp m_functor;
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ViewOp, typename MatrixType>
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass CwiseUnaryViewImpl<ViewOp,MatrixType,Dense>
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  : public internal::dense_xpr_base< CwiseUnaryView<ViewOp, MatrixType> >::type
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  public:
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef CwiseUnaryView<ViewOp, MatrixType> Derived;
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::dense_xpr_base< CwiseUnaryView<ViewOp, MatrixType> >::type Base;
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_DENSE_PUBLIC_INTERFACE(Derived)
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index innerStride() const
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return derived().nestedExpression().innerStride() * sizeof(typename internal::traits<MatrixType>::Scalar) / sizeof(Scalar);
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index outerStride() const
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return derived().nestedExpression().outerStride();
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_STRONG_INLINE CoeffReturnType coeff(Index row, Index col) const
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return derived().functor()(derived().nestedExpression().coeff(row, col));
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return derived().functor()(derived().nestedExpression().coeff(index));
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_STRONG_INLINE Scalar& coeffRef(Index row, Index col)
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return derived().functor()(const_cast_derived().nestedExpression().coeffRef(row, col));
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_STRONG_INLINE Scalar& coeffRef(Index index)
128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return derived().functor()(const_cast_derived().nestedExpression().coeffRef(index));
130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen
134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_CWISE_UNARY_VIEW_H
136