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