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)
477faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                             : int(MatrixTypeInnerStride) * int(sizeof(typename traits<MatrixType>::Scalar) / sizeof(Scalar)),
487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    OuterStrideAtCompileTime = outer_stride_at_compile_time<MatrixType>::ret == Dynamic
497faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                             ? int(Dynamic)
507faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                             : outer_stride_at_compile_time<MatrixType>::ret * int(sizeof(typename traits<MatrixType>::Scalar) / sizeof(Scalar))
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  };
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ViewOp, typename MatrixType, typename StorageKind>
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass CwiseUnaryViewImpl;
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ViewOp, typename MatrixType>
597faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezclass CwiseUnaryView : 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)
1017faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(CwiseUnaryViewImpl)
1027faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
103810535bb0c575a003b32076e5352ab8fd3f23a1cAmi Patel    inline Scalar* data() { return &coeffRef(0); }
104810535bb0c575a003b32076e5352ab8fd3f23a1cAmi Patel    inline const Scalar* data() const { return &coeff(0); }
105810535bb0c575a003b32076e5352ab8fd3f23a1cAmi Patel
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index innerStride() const
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return derived().nestedExpression().innerStride() * sizeof(typename internal::traits<MatrixType>::Scalar) / sizeof(Scalar);
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index outerStride() const
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
1137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      return derived().nestedExpression().outerStride() * sizeof(typename internal::traits<MatrixType>::Scalar) / sizeof(Scalar);
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_STRONG_INLINE CoeffReturnType coeff(Index row, Index col) const
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return derived().functor()(derived().nestedExpression().coeff(row, col));
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return derived().functor()(derived().nestedExpression().coeff(index));
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_STRONG_INLINE Scalar& coeffRef(Index row, Index col)
127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return derived().functor()(const_cast_derived().nestedExpression().coeffRef(row, col));
129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_STRONG_INLINE Scalar& coeffRef(Index index)
132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return derived().functor()(const_cast_derived().nestedExpression().coeffRef(index));
134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen
138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_CWISE_UNARY_VIEW_H
140