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 Kamathnamespace internal {
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ViewOp, typename MatrixType>
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct traits<CwiseUnaryView<ViewOp, MatrixType> >
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : traits<MatrixType>
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename result_of<
212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                     ViewOp(const typename traits<MatrixType>::Scalar&)
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                   >::type Scalar;
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename MatrixType::Nested MatrixTypeNested;
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename remove_all<MatrixTypeNested>::type _MatrixTypeNested;
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  enum {
262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    FlagsLvalueBit = is_lvalue<MatrixType>::value ? LvalueBit : 0,
272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Flags = traits<_MatrixTypeNested>::Flags & (RowMajorBit | FlagsLvalueBit | DirectAccessBit), // FIXME DirectAccessBit should not be handled by expressions
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    MatrixTypeInnerStride =  inner_stride_at_compile_time<MatrixType>::ret,
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // need to cast the sizeof's from size_t to int explicitly, otherwise:
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // "error: no integral type can represent all of the enumerator values
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    InnerStrideAtCompileTime = MatrixTypeInnerStride == Dynamic
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                             ? int(Dynamic)
337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                             : int(MatrixTypeInnerStride) * int(sizeof(typename traits<MatrixType>::Scalar) / sizeof(Scalar)),
347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    OuterStrideAtCompileTime = outer_stride_at_compile_time<MatrixType>::ret == Dynamic
357faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                             ? int(Dynamic)
367faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                             : outer_stride_at_compile_time<MatrixType>::ret * int(sizeof(typename traits<MatrixType>::Scalar) / sizeof(Scalar))
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  };
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ViewOp, typename MatrixType, typename StorageKind>
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass CwiseUnaryViewImpl;
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/** \class CwiseUnaryView
452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \ingroup Core_Module
462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  *
472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \brief Generic lvalue expression of a coefficient-wise unary operator of a matrix or a vector
482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  *
492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \tparam ViewOp template functor implementing the view
502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \tparam MatrixType the type of the matrix we are applying the unary operator
512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  *
522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * This class represents a lvalue expression of a generic unary view operator of a matrix or a vector.
532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * It is the return type of real() and imag(), and most of the time this is the only way it is used.
542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  *
552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \sa MatrixBase::unaryViewExpr(const CustomUnaryOp &) const, class CwiseUnaryOp
562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  */
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ViewOp, typename MatrixType>
587faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezclass CwiseUnaryView : public CwiseUnaryViewImpl<ViewOp, MatrixType, typename internal::traits<MatrixType>::StorageKind>
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  public:
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename CwiseUnaryViewImpl<ViewOp, MatrixType,typename internal::traits<MatrixType>::StorageKind>::Base Base;
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_GENERIC_PUBLIC_INTERFACE(CwiseUnaryView)
642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef typename internal::ref_selector<MatrixType>::non_const_type MatrixTypeNested;
652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef typename internal::remove_all<MatrixType>::type NestedExpression;
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    explicit inline CwiseUnaryView(MatrixType& mat, const ViewOp& func = ViewOp())
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      : m_matrix(mat), m_functor(func) {}
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(CwiseUnaryView)
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_STRONG_INLINE Index rows() const { return m_matrix.rows(); }
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_STRONG_INLINE Index cols() const { return m_matrix.cols(); }
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns the functor representing unary operation */
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const ViewOp& functor() const { return m_functor; }
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns the nested expression */
792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const typename internal::remove_all<MatrixTypeNested>::type&
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    nestedExpression() const { return m_matrix; }
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns the nested expression */
832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typename internal::remove_reference<MatrixTypeNested>::type&
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    nestedExpression() { return m_matrix.const_cast_derived(); }
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  protected:
872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    MatrixTypeNested m_matrix;
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ViewOp m_functor;
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Generic API dispatcher
922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename ViewOp, typename XprType, typename StorageKind>
932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangclass CwiseUnaryViewImpl
942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : public internal::generic_xpr_base<CwiseUnaryView<ViewOp, XprType> >::type
952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangpublic:
972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename internal::generic_xpr_base<CwiseUnaryView<ViewOp, XprType> >::type Base;
982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ViewOp, typename MatrixType>
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass CwiseUnaryViewImpl<ViewOp,MatrixType,Dense>
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  : public internal::dense_xpr_base< CwiseUnaryView<ViewOp, MatrixType> >::type
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  public:
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef CwiseUnaryView<ViewOp, MatrixType> Derived;
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::dense_xpr_base< CwiseUnaryView<ViewOp, MatrixType> >::type Base;
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_DENSE_PUBLIC_INTERFACE(Derived)
1107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(CwiseUnaryViewImpl)
1117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC inline Scalar* data() { return &(this->coeffRef(0)); }
1132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC inline const Scalar* data() const { return &(this->coeff(0)); }
114810535bb0c575a003b32076e5352ab8fd3f23a1cAmi Patel
1152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC inline Index innerStride() const
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return derived().nestedExpression().innerStride() * sizeof(typename internal::traits<MatrixType>::Scalar) / sizeof(Scalar);
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC inline Index outerStride() const
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
1227faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      return derived().nestedExpression().outerStride() * sizeof(typename internal::traits<MatrixType>::Scalar) / sizeof(Scalar);
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen
127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_CWISE_UNARY_VIEW_H
129