12b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// This file is part of Eigen, a lightweight C++ template library
22b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// for linear algebra.
32b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang//
42b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Copyright (C) 2011 Benoit Jacob <jacob.benoit.1@gmail.com>
52b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Copyright (C) 2011-2014 Gael Guennebaud <gael.guennebaud@inria.fr>
62b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Copyright (C) 2011-2012 Jitse Niesen <jitse@maths.leeds.ac.uk>
72b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang//
82b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// This Source Code Form is subject to the terms of the Mozilla
92b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Public License v. 2.0. If a copy of the MPL was not distributed
102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#ifndef EIGEN_COREEVALUATORS_H
142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#define EIGEN_COREEVALUATORS_H
152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangnamespace Eigen {
172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangnamespace internal {
192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// This class returns the evaluator kind from the expression storage kind.
212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Default assumes index based accessors
222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename StorageKind>
232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct storage_kind_to_evaluator_kind {
242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef IndexBased Kind;
252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// This class returns the evaluator shape from the expression storage kind.
282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// It can be Dense, Sparse, Triangular, Diagonal, SelfAdjoint, Band, etc.
292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename StorageKind> struct storage_kind_to_shape;
302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<> struct storage_kind_to_shape<Dense>                  { typedef DenseShape Shape;           };
322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<> struct storage_kind_to_shape<SolverStorage>          { typedef SolverShape Shape;           };
332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<> struct storage_kind_to_shape<PermutationStorage>     { typedef PermutationShape Shape;     };
342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<> struct storage_kind_to_shape<TranspositionsStorage>  { typedef TranspositionsShape Shape;  };
352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Evaluators have to be specialized with respect to various criteria such as:
372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang//  - storage/structure/shape
382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang//  - scalar type
392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang//  - etc.
402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Therefore, we need specialization of evaluator providing additional template arguments for each kind of evaluators.
412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// We currently distinguish the following kind of evaluators:
422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// - unary_evaluator    for expressions taking only one arguments (CwiseUnaryOp, CwiseUnaryView, Transpose, MatrixWrapper, ArrayWrapper, Reverse, Replicate)
432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// - binary_evaluator   for expression taking two arguments (CwiseBinaryOp)
442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// - ternary_evaluator   for expression taking three arguments (CwiseTernaryOp)
452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// - product_evaluator  for linear algebra products (Product); special case of binary_evaluator because it requires additional tags for dispatching.
462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// - mapbase_evaluator  for Map, Block, Ref
472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// - block_evaluator    for Block (special dispatching to a mapbase_evaluator or unary_evaluator)
482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate< typename T,
502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang          typename Arg1Kind   = typename evaluator_traits<typename T::Arg1>::Kind,
512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang          typename Arg2Kind   = typename evaluator_traits<typename T::Arg2>::Kind,
522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang          typename Arg3Kind   = typename evaluator_traits<typename T::Arg3>::Kind,
532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang          typename Arg1Scalar = typename traits<typename T::Arg1>::Scalar,
542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang          typename Arg2Scalar = typename traits<typename T::Arg2>::Scalar,
552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang          typename Arg3Scalar = typename traits<typename T::Arg3>::Scalar> struct ternary_evaluator;
562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate< typename T,
582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang          typename LhsKind   = typename evaluator_traits<typename T::Lhs>::Kind,
592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang          typename RhsKind   = typename evaluator_traits<typename T::Rhs>::Kind,
602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang          typename LhsScalar = typename traits<typename T::Lhs>::Scalar,
612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang          typename RhsScalar = typename traits<typename T::Rhs>::Scalar> struct binary_evaluator;
622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate< typename T,
642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang          typename Kind   = typename evaluator_traits<typename T::NestedExpression>::Kind,
652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang          typename Scalar = typename T::Scalar> struct unary_evaluator;
662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// evaluator_traits<T> contains traits for evaluator<T>
682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename T>
702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct evaluator_traits_base
712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  // by default, get evaluator kind and shape from storage
732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename storage_kind_to_evaluator_kind<typename traits<T>::StorageKind>::Kind Kind;
742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename storage_kind_to_shape<typename traits<T>::StorageKind>::Shape Shape;
752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Default evaluator traits
782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename T>
792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct evaluator_traits : public evaluator_traits_base<T>
802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename T, typename Shape = typename evaluator_traits<T>::Shape >
842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct evaluator_assume_aliasing {
852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  static const bool value = false;
862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// By default, we assume a unary expression:
892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename T>
902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct evaluator : public unary_evaluator<T>
912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef unary_evaluator<T> Base;
932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC explicit evaluator(const T& xpr) : Base(xpr) {}
942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// TODO: Think about const-correctness
982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename T>
992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct evaluator<const T>
1002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : evaluator<T>
1012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
1022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC
1032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  explicit evaluator(const T& xpr) : evaluator<T>(xpr) {}
1042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
1052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// ---------- base class for all evaluators ----------
1072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename ExpressionType>
1092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct evaluator_base : public noncopyable
1102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
1112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  // TODO that's not very nice to have to propagate all these traits. They are currently only needed to handle outer,inner indices.
1122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef traits<ExpressionType> ExpressionTraits;
1132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  enum {
1152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Alignment = 0
1162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  };
1172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
1182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// -------------------- Matrix and Array --------------------
1202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang//
1212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// evaluator<PlainObjectBase> is a common base class for the
1222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Matrix and Array evaluators.
1232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Here we directly specialize evaluator. This is not really a unary expression, and it is, by definition, dense,
1242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// so no need for more sophisticated dispatching.
1252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Derived>
1272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct evaluator<PlainObjectBase<Derived> >
1282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : evaluator_base<Derived>
1292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
1302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef PlainObjectBase<Derived> PlainObjectType;
1312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename PlainObjectType::Scalar Scalar;
1322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename PlainObjectType::CoeffReturnType CoeffReturnType;
1332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  enum {
1352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    IsRowMajor = PlainObjectType::IsRowMajor,
1362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    IsVectorAtCompileTime = PlainObjectType::IsVectorAtCompileTime,
1372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    RowsAtCompileTime = PlainObjectType::RowsAtCompileTime,
1382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    ColsAtCompileTime = PlainObjectType::ColsAtCompileTime,
1392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    CoeffReadCost = NumTraits<Scalar>::ReadCost,
1412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Flags = traits<Derived>::EvaluatorFlags,
1422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Alignment = traits<Derived>::Alignment
1432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  };
1442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC evaluator()
1462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    : m_data(0),
1472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      m_outerStride(IsVectorAtCompileTime  ? 0
1482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                                           : int(IsRowMajor) ? ColsAtCompileTime
1492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                                           : RowsAtCompileTime)
1502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
1512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
1522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
1532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC explicit evaluator(const PlainObjectType& m)
1552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    : m_data(m.data()), m_outerStride(IsVectorAtCompileTime ? 0 : m.outerStride())
1562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
1572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
1582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
1592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  CoeffReturnType coeff(Index row, Index col) const
1622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
1632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    if (IsRowMajor)
1642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return m_data[row * m_outerStride.value() + col];
1652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    else
1662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return m_data[row + col * m_outerStride.value()];
1672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
1682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  CoeffReturnType coeff(Index index) const
1712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
1722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_data[index];
1732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
1742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Scalar& coeffRef(Index row, Index col)
1772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
1782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    if (IsRowMajor)
1792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return const_cast<Scalar*>(m_data)[row * m_outerStride.value() + col];
1802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    else
1812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return const_cast<Scalar*>(m_data)[row + col * m_outerStride.value()];
1822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
1832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Scalar& coeffRef(Index index)
1862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
1872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return const_cast<Scalar*>(m_data)[index];
1882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
1892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
1902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int LoadMode, typename PacketType>
1912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
1922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  PacketType packet(Index row, Index col) const
1932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
1942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    if (IsRowMajor)
1952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return ploadt<PacketType, LoadMode>(m_data + row * m_outerStride.value() + col);
1962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    else
1972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return ploadt<PacketType, LoadMode>(m_data + row + col * m_outerStride.value());
1982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
1992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int LoadMode, typename PacketType>
2012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
2022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  PacketType packet(Index index) const
2032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
2042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return ploadt<PacketType, LoadMode>(m_data + index);
2052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
2062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int StoreMode,typename PacketType>
2082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
2092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  void writePacket(Index row, Index col, const PacketType& x)
2102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
2112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    if (IsRowMajor)
2122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return pstoret<Scalar, PacketType, StoreMode>
2132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang	            (const_cast<Scalar*>(m_data) + row * m_outerStride.value() + col, x);
2142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    else
2152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return pstoret<Scalar, PacketType, StoreMode>
2162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                    (const_cast<Scalar*>(m_data) + row + col * m_outerStride.value(), x);
2172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
2182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int StoreMode, typename PacketType>
2202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
2212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  void writePacket(Index index, const PacketType& x)
2222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
2232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return pstoret<Scalar, PacketType, StoreMode>(const_cast<Scalar*>(m_data) + index, x);
2242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
2252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangprotected:
2272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  const Scalar *m_data;
2282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  // We do not need to know the outer stride for vectors
2302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  variable_if_dynamic<Index, IsVectorAtCompileTime  ? 0
2312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                                                    : int(IsRowMajor) ? ColsAtCompileTime
2322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                                                    : RowsAtCompileTime> m_outerStride;
2332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
2342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Scalar, int Rows, int Cols, int Options, int MaxRows, int MaxCols>
2362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct evaluator<Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols> >
2372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : evaluator<PlainObjectBase<Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols> > >
2382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
2392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols> XprType;
2402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC evaluator() {}
2422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC explicit evaluator(const XprType& m)
2442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    : evaluator<PlainObjectBase<XprType> >(m)
2452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  { }
2462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
2472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Scalar, int Rows, int Cols, int Options, int MaxRows, int MaxCols>
2492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct evaluator<Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols> >
2502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : evaluator<PlainObjectBase<Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols> > >
2512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
2522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols> XprType;
2532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC evaluator() {}
2552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC explicit evaluator(const XprType& m)
2572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    : evaluator<PlainObjectBase<XprType> >(m)
2582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  { }
2592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
2602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// -------------------- Transpose --------------------
2622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename ArgType>
2642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct unary_evaluator<Transpose<ArgType>, IndexBased>
2652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : evaluator_base<Transpose<ArgType> >
2662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
2672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef Transpose<ArgType> XprType;
2682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  enum {
2702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    CoeffReadCost = evaluator<ArgType>::CoeffReadCost,
2712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Flags = evaluator<ArgType>::Flags ^ RowMajorBit,
2722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Alignment = evaluator<ArgType>::Alignment
2732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  };
2742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC explicit unary_evaluator(const XprType& t) : m_argImpl(t.nestedExpression()) {}
2762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename XprType::Scalar Scalar;
2782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename XprType::CoeffReturnType CoeffReturnType;
2792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
2812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  CoeffReturnType coeff(Index row, Index col) const
2822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
2832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_argImpl.coeff(col, row);
2842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
2852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
2872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  CoeffReturnType coeff(Index index) const
2882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
2892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_argImpl.coeff(index);
2902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
2912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
2932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Scalar& coeffRef(Index row, Index col)
2942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
2952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_argImpl.coeffRef(col, row);
2962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
2972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
2992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typename XprType::Scalar& coeffRef(Index index)
3002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
3012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_argImpl.coeffRef(index);
3022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
3032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int LoadMode, typename PacketType>
3052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
3062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  PacketType packet(Index row, Index col) const
3072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
3082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_argImpl.template packet<LoadMode,PacketType>(col, row);
3092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
3102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int LoadMode, typename PacketType>
3122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
3132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  PacketType packet(Index index) const
3142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
3152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_argImpl.template packet<LoadMode,PacketType>(index);
3162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
3172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int StoreMode, typename PacketType>
3192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
3202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  void writePacket(Index row, Index col, const PacketType& x)
3212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
3222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    m_argImpl.template writePacket<StoreMode,PacketType>(col, row, x);
3232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
3242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int StoreMode, typename PacketType>
3262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
3272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  void writePacket(Index index, const PacketType& x)
3282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
3292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    m_argImpl.template writePacket<StoreMode,PacketType>(index, x);
3302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
3312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangprotected:
3332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  evaluator<ArgType> m_argImpl;
3342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
3352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// -------------------- CwiseNullaryOp --------------------
3372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Like Matrix and Array, this is not really a unary expression, so we directly specialize evaluator.
3382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Likewise, there is not need to more sophisticated dispatching here.
3392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Scalar,typename NullaryOp,
3412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang         bool has_nullary = has_nullary_operator<NullaryOp>::value,
3422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang         bool has_unary   = has_unary_operator<NullaryOp>::value,
3432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang         bool has_binary  = has_binary_operator<NullaryOp>::value>
3442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct nullary_wrapper
3452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
3462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template <typename IndexType>
3472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType i, IndexType j) const { return op(i,j); }
3482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template <typename IndexType>
3492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType i) const { return op(i); }
3502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template <typename T, typename IndexType> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType i, IndexType j) const { return op.template packetOp<T>(i,j); }
3522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template <typename T, typename IndexType> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType i) const { return op.template packetOp<T>(i); }
3532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
3542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Scalar,typename NullaryOp>
3562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct nullary_wrapper<Scalar,NullaryOp,true,false,false>
3572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
3582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template <typename IndexType>
3592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType=0, IndexType=0) const { return op(); }
3602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template <typename T, typename IndexType> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType=0, IndexType=0) const { return op.template packetOp<T>(); }
3612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
3622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Scalar,typename NullaryOp>
3642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct nullary_wrapper<Scalar,NullaryOp,false,false,true>
3652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
3662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template <typename IndexType>
3672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType i, IndexType j=0) const { return op(i,j); }
3682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template <typename T, typename IndexType> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType i, IndexType j=0) const { return op.template packetOp<T>(i,j); }
3692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
3702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// We need the following specialization for vector-only functors assigned to a runtime vector,
3722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// for instance, using linspace and assigning a RowVectorXd to a MatrixXd or even a row of a MatrixXd.
3732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// In this case, i==0 and j is used for the actual iteration.
3742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Scalar,typename NullaryOp>
3752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct nullary_wrapper<Scalar,NullaryOp,false,true,false>
3762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
3772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template <typename IndexType>
3782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType i, IndexType j) const {
3792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    eigen_assert(i==0 || j==0);
3802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return op(i+j);
3812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
3822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template <typename T, typename IndexType> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType i, IndexType j) const {
3832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    eigen_assert(i==0 || j==0);
3842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return op.template packetOp<T>(i+j);
3852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
3862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template <typename IndexType>
3882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType i) const { return op(i); }
3892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template <typename T, typename IndexType>
3902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType i) const { return op.template packetOp<T>(i); }
3912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
3922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Scalar,typename NullaryOp>
3942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct nullary_wrapper<Scalar,NullaryOp,false,false,false> {};
3952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#if 0 && EIGEN_COMP_MSVC>0
3972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Disable this ugly workaround. This is now handled in traits<Ref>::match,
3982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// but this piece of code might still become handly if some other weird compilation
3992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// erros pop up again.
4002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
4012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// MSVC exhibits a weird compilation error when
4022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// compiling:
4032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang//    Eigen::MatrixXf A = MatrixXf::Random(3,3);
4042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang//    Ref<const MatrixXf> R = 2.f*A;
4052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// and that has_*ary_operator<scalar_constant_op<float>> have not been instantiated yet.
4062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// The "problem" is that evaluator<2.f*A> is instantiated by traits<Ref>::match<2.f*A>
4072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// and at that time has_*ary_operator<T> returns true regardless of T.
4082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Then nullary_wrapper is badly instantiated as nullary_wrapper<.,.,true,true,true>.
4092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// The trick is thus to defer the proper instantiation of nullary_wrapper when coeff(),
4102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// and packet() are really instantiated as implemented below:
4112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
4122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// This is a simple wrapper around Index to enforce the re-instantiation of
4132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// has_*ary_operator when needed.
4142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename T> struct nullary_wrapper_workaround_msvc {
4152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  nullary_wrapper_workaround_msvc(const T&);
4162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  operator T()const;
4172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
4182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
4192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Scalar,typename NullaryOp>
4202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct nullary_wrapper<Scalar,NullaryOp,true,true,true>
4212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
4222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template <typename IndexType>
4232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType i, IndexType j) const {
4242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return nullary_wrapper<Scalar,NullaryOp,
4252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    has_nullary_operator<NullaryOp,nullary_wrapper_workaround_msvc<IndexType> >::value,
4262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    has_unary_operator<NullaryOp,nullary_wrapper_workaround_msvc<IndexType> >::value,
4272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    has_binary_operator<NullaryOp,nullary_wrapper_workaround_msvc<IndexType> >::value>().operator()(op,i,j);
4282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
4292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template <typename IndexType>
4302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const NullaryOp& op, IndexType i) const {
4312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return nullary_wrapper<Scalar,NullaryOp,
4322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    has_nullary_operator<NullaryOp,nullary_wrapper_workaround_msvc<IndexType> >::value,
4332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    has_unary_operator<NullaryOp,nullary_wrapper_workaround_msvc<IndexType> >::value,
4342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    has_binary_operator<NullaryOp,nullary_wrapper_workaround_msvc<IndexType> >::value>().operator()(op,i);
4352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
4362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
4372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template <typename T, typename IndexType>
4382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType i, IndexType j) const {
4392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return nullary_wrapper<Scalar,NullaryOp,
4402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    has_nullary_operator<NullaryOp,nullary_wrapper_workaround_msvc<IndexType> >::value,
4412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    has_unary_operator<NullaryOp,nullary_wrapper_workaround_msvc<IndexType> >::value,
4422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    has_binary_operator<NullaryOp,nullary_wrapper_workaround_msvc<IndexType> >::value>().template packetOp<T>(op,i,j);
4432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
4442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template <typename T, typename IndexType>
4452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T packetOp(const NullaryOp& op, IndexType i) const {
4462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return nullary_wrapper<Scalar,NullaryOp,
4472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    has_nullary_operator<NullaryOp,nullary_wrapper_workaround_msvc<IndexType> >::value,
4482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    has_unary_operator<NullaryOp,nullary_wrapper_workaround_msvc<IndexType> >::value,
4492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    has_binary_operator<NullaryOp,nullary_wrapper_workaround_msvc<IndexType> >::value>().template packetOp<T>(op,i);
4502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
4512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
4522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#endif // MSVC workaround
4532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
4542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename NullaryOp, typename PlainObjectType>
4552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct evaluator<CwiseNullaryOp<NullaryOp,PlainObjectType> >
4562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : evaluator_base<CwiseNullaryOp<NullaryOp,PlainObjectType> >
4572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
4582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef CwiseNullaryOp<NullaryOp,PlainObjectType> XprType;
4592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename internal::remove_all<PlainObjectType>::type PlainObjectTypeCleaned;
4602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
4612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  enum {
4622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    CoeffReadCost = internal::functor_traits<NullaryOp>::Cost,
4632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
4642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Flags = (evaluator<PlainObjectTypeCleaned>::Flags
4652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang          &  (  HereditaryBits
4662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang              | (functor_has_linear_access<NullaryOp>::ret  ? LinearAccessBit : 0)
4672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang              | (functor_traits<NullaryOp>::PacketAccess    ? PacketAccessBit : 0)))
4682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang          | (functor_traits<NullaryOp>::IsRepeatable ? 0 : EvalBeforeNestingBit),
4692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Alignment = AlignedMax
4702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  };
4712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
4722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC explicit evaluator(const XprType& n)
4732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    : m_functor(n.functor()), m_wrapper()
4742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
4752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
4762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
4772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
4782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename XprType::CoeffReturnType CoeffReturnType;
4792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
4802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template <typename IndexType>
4812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
4822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  CoeffReturnType coeff(IndexType row, IndexType col) const
4832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
4842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_wrapper(m_functor, row, col);
4852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
4862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
4872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template <typename IndexType>
4882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
4892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  CoeffReturnType coeff(IndexType index) const
4902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
4912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_wrapper(m_functor,index);
4922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
4932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
4942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int LoadMode, typename PacketType, typename IndexType>
4952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
4962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  PacketType packet(IndexType row, IndexType col) const
4972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
4982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_wrapper.template packetOp<PacketType>(m_functor, row, col);
4992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
5002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int LoadMode, typename PacketType, typename IndexType>
5022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
5032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  PacketType packet(IndexType index) const
5042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
5052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_wrapper.template packetOp<PacketType>(m_functor, index);
5062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
5072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangprotected:
5092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  const NullaryOp m_functor;
5102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  const internal::nullary_wrapper<CoeffReturnType,NullaryOp> m_wrapper;
5112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
5122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// -------------------- CwiseUnaryOp --------------------
5142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename UnaryOp, typename ArgType>
5162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct unary_evaluator<CwiseUnaryOp<UnaryOp, ArgType>, IndexBased >
5172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : evaluator_base<CwiseUnaryOp<UnaryOp, ArgType> >
5182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
5192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef CwiseUnaryOp<UnaryOp, ArgType> XprType;
5202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  enum {
5222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    CoeffReadCost = evaluator<ArgType>::CoeffReadCost + functor_traits<UnaryOp>::Cost,
5232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Flags = evaluator<ArgType>::Flags
5252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang          & (HereditaryBits | LinearAccessBit | (functor_traits<UnaryOp>::PacketAccess ? PacketAccessBit : 0)),
5262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Alignment = evaluator<ArgType>::Alignment
5272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  };
5282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
5302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  explicit unary_evaluator(const XprType& op)
5312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    : m_functor(op.functor()),
5322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      m_argImpl(op.nestedExpression())
5332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
5342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_INTERNAL_CHECK_COST_VALUE(functor_traits<UnaryOp>::Cost);
5352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
5362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
5372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename XprType::CoeffReturnType CoeffReturnType;
5392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
5412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  CoeffReturnType coeff(Index row, Index col) const
5422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
5432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_functor(m_argImpl.coeff(row, col));
5442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
5452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
5472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  CoeffReturnType coeff(Index index) const
5482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
5492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_functor(m_argImpl.coeff(index));
5502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
5512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int LoadMode, typename PacketType>
5532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
5542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  PacketType packet(Index row, Index col) const
5552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
5562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_functor.packetOp(m_argImpl.template packet<LoadMode, PacketType>(row, col));
5572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
5582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int LoadMode, typename PacketType>
5602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
5612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  PacketType packet(Index index) const
5622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
5632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_functor.packetOp(m_argImpl.template packet<LoadMode, PacketType>(index));
5642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
5652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangprotected:
5672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  const UnaryOp m_functor;
5682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  evaluator<ArgType> m_argImpl;
5692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
5702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// -------------------- CwiseTernaryOp --------------------
5722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// this is a ternary expression
5742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename TernaryOp, typename Arg1, typename Arg2, typename Arg3>
5752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct evaluator<CwiseTernaryOp<TernaryOp, Arg1, Arg2, Arg3> >
5762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : public ternary_evaluator<CwiseTernaryOp<TernaryOp, Arg1, Arg2, Arg3> >
5772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
5782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef CwiseTernaryOp<TernaryOp, Arg1, Arg2, Arg3> XprType;
5792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef ternary_evaluator<CwiseTernaryOp<TernaryOp, Arg1, Arg2, Arg3> > Base;
5802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC explicit evaluator(const XprType& xpr) : Base(xpr) {}
5822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
5832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename TernaryOp, typename Arg1, typename Arg2, typename Arg3>
5852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct ternary_evaluator<CwiseTernaryOp<TernaryOp, Arg1, Arg2, Arg3>, IndexBased, IndexBased>
5862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : evaluator_base<CwiseTernaryOp<TernaryOp, Arg1, Arg2, Arg3> >
5872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
5882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef CwiseTernaryOp<TernaryOp, Arg1, Arg2, Arg3> XprType;
5892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  enum {
5912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    CoeffReadCost = evaluator<Arg1>::CoeffReadCost + evaluator<Arg2>::CoeffReadCost + evaluator<Arg3>::CoeffReadCost + functor_traits<TernaryOp>::Cost,
5922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
5932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Arg1Flags = evaluator<Arg1>::Flags,
5942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Arg2Flags = evaluator<Arg2>::Flags,
5952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Arg3Flags = evaluator<Arg3>::Flags,
5962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    SameType = is_same<typename Arg1::Scalar,typename Arg2::Scalar>::value && is_same<typename Arg1::Scalar,typename Arg3::Scalar>::value,
5972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    StorageOrdersAgree = (int(Arg1Flags)&RowMajorBit)==(int(Arg2Flags)&RowMajorBit) && (int(Arg1Flags)&RowMajorBit)==(int(Arg3Flags)&RowMajorBit),
5982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Flags0 = (int(Arg1Flags) | int(Arg2Flags) | int(Arg3Flags)) & (
5992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        HereditaryBits
6002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        | (int(Arg1Flags) & int(Arg2Flags) & int(Arg3Flags) &
6012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang           ( (StorageOrdersAgree ? LinearAccessBit : 0)
6022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang           | (functor_traits<TernaryOp>::PacketAccess && StorageOrdersAgree && SameType ? PacketAccessBit : 0)
6032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang           )
6042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        )
6052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang     ),
6062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Flags = (Flags0 & ~RowMajorBit) | (Arg1Flags & RowMajorBit),
6072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Alignment = EIGEN_PLAIN_ENUM_MIN(
6082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        EIGEN_PLAIN_ENUM_MIN(evaluator<Arg1>::Alignment, evaluator<Arg2>::Alignment),
6092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        evaluator<Arg3>::Alignment)
6102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  };
6112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
6122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC explicit ternary_evaluator(const XprType& xpr)
6132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    : m_functor(xpr.functor()),
6142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      m_arg1Impl(xpr.arg1()),
6152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      m_arg2Impl(xpr.arg2()),
6162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      m_arg3Impl(xpr.arg3())
6172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
6182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_INTERNAL_CHECK_COST_VALUE(functor_traits<TernaryOp>::Cost);
6192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
6202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
6212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
6222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename XprType::CoeffReturnType CoeffReturnType;
6232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
6242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
6252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  CoeffReturnType coeff(Index row, Index col) const
6262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
6272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_functor(m_arg1Impl.coeff(row, col), m_arg2Impl.coeff(row, col), m_arg3Impl.coeff(row, col));
6282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
6292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
6302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
6312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  CoeffReturnType coeff(Index index) const
6322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
6332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_functor(m_arg1Impl.coeff(index), m_arg2Impl.coeff(index), m_arg3Impl.coeff(index));
6342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
6352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
6362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int LoadMode, typename PacketType>
6372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
6382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  PacketType packet(Index row, Index col) const
6392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
6402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_functor.packetOp(m_arg1Impl.template packet<LoadMode,PacketType>(row, col),
6412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                              m_arg2Impl.template packet<LoadMode,PacketType>(row, col),
6422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                              m_arg3Impl.template packet<LoadMode,PacketType>(row, col));
6432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
6442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
6452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int LoadMode, typename PacketType>
6462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
6472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  PacketType packet(Index index) const
6482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
6492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_functor.packetOp(m_arg1Impl.template packet<LoadMode,PacketType>(index),
6502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                              m_arg2Impl.template packet<LoadMode,PacketType>(index),
6512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                              m_arg3Impl.template packet<LoadMode,PacketType>(index));
6522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
6532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
6542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangprotected:
6552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  const TernaryOp m_functor;
6562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  evaluator<Arg1> m_arg1Impl;
6572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  evaluator<Arg2> m_arg2Impl;
6582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  evaluator<Arg3> m_arg3Impl;
6592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
6602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
6612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// -------------------- CwiseBinaryOp --------------------
6622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
6632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// this is a binary expression
6642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename BinaryOp, typename Lhs, typename Rhs>
6652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct evaluator<CwiseBinaryOp<BinaryOp, Lhs, Rhs> >
6662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : public binary_evaluator<CwiseBinaryOp<BinaryOp, Lhs, Rhs> >
6672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
6682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef CwiseBinaryOp<BinaryOp, Lhs, Rhs> XprType;
6692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef binary_evaluator<CwiseBinaryOp<BinaryOp, Lhs, Rhs> > Base;
6702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
6712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC explicit evaluator(const XprType& xpr) : Base(xpr) {}
6722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
6732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
6742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename BinaryOp, typename Lhs, typename Rhs>
6752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct binary_evaluator<CwiseBinaryOp<BinaryOp, Lhs, Rhs>, IndexBased, IndexBased>
6762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : evaluator_base<CwiseBinaryOp<BinaryOp, Lhs, Rhs> >
6772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
6782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef CwiseBinaryOp<BinaryOp, Lhs, Rhs> XprType;
6792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
6802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  enum {
6812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    CoeffReadCost = evaluator<Lhs>::CoeffReadCost + evaluator<Rhs>::CoeffReadCost + functor_traits<BinaryOp>::Cost,
6822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
6832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    LhsFlags = evaluator<Lhs>::Flags,
6842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    RhsFlags = evaluator<Rhs>::Flags,
6852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    SameType = is_same<typename Lhs::Scalar,typename Rhs::Scalar>::value,
6862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    StorageOrdersAgree = (int(LhsFlags)&RowMajorBit)==(int(RhsFlags)&RowMajorBit),
6872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Flags0 = (int(LhsFlags) | int(RhsFlags)) & (
6882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        HereditaryBits
6892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      | (int(LhsFlags) & int(RhsFlags) &
6902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang           ( (StorageOrdersAgree ? LinearAccessBit : 0)
6912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang           | (functor_traits<BinaryOp>::PacketAccess && StorageOrdersAgree && SameType ? PacketAccessBit : 0)
6922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang           )
6932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang        )
6942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang     ),
6952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Flags = (Flags0 & ~RowMajorBit) | (LhsFlags & RowMajorBit),
6962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Alignment = EIGEN_PLAIN_ENUM_MIN(evaluator<Lhs>::Alignment,evaluator<Rhs>::Alignment)
6972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  };
6982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
6992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC explicit binary_evaluator(const XprType& xpr)
7002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    : m_functor(xpr.functor()),
7012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      m_lhsImpl(xpr.lhs()),
7022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      m_rhsImpl(xpr.rhs())
7032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
7042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_INTERNAL_CHECK_COST_VALUE(functor_traits<BinaryOp>::Cost);
7052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
7062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
7072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
7082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename XprType::CoeffReturnType CoeffReturnType;
7092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
7102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
7112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  CoeffReturnType coeff(Index row, Index col) const
7122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
7132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_functor(m_lhsImpl.coeff(row, col), m_rhsImpl.coeff(row, col));
7142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
7152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
7162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
7172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  CoeffReturnType coeff(Index index) const
7182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
7192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_functor(m_lhsImpl.coeff(index), m_rhsImpl.coeff(index));
7202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
7212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
7222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int LoadMode, typename PacketType>
7232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
7242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  PacketType packet(Index row, Index col) const
7252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
7262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_functor.packetOp(m_lhsImpl.template packet<LoadMode,PacketType>(row, col),
7272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                              m_rhsImpl.template packet<LoadMode,PacketType>(row, col));
7282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
7292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
7302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int LoadMode, typename PacketType>
7312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
7322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  PacketType packet(Index index) const
7332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
7342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_functor.packetOp(m_lhsImpl.template packet<LoadMode,PacketType>(index),
7352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                              m_rhsImpl.template packet<LoadMode,PacketType>(index));
7362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
7372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
7382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangprotected:
7392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  const BinaryOp m_functor;
7402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  evaluator<Lhs> m_lhsImpl;
7412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  evaluator<Rhs> m_rhsImpl;
7422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
7432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
7442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// -------------------- CwiseUnaryView --------------------
7452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
7462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename UnaryOp, typename ArgType>
7472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct unary_evaluator<CwiseUnaryView<UnaryOp, ArgType>, IndexBased>
7482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : evaluator_base<CwiseUnaryView<UnaryOp, ArgType> >
7492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
7502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef CwiseUnaryView<UnaryOp, ArgType> XprType;
7512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
7522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  enum {
7532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    CoeffReadCost = evaluator<ArgType>::CoeffReadCost + functor_traits<UnaryOp>::Cost,
7542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
7552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Flags = (evaluator<ArgType>::Flags & (HereditaryBits | LinearAccessBit | DirectAccessBit)),
7562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
7572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Alignment = 0 // FIXME it is not very clear why alignment is necessarily lost...
7582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  };
7592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
7602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC explicit unary_evaluator(const XprType& op)
7612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    : m_unaryOp(op.functor()),
7622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      m_argImpl(op.nestedExpression())
7632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
7642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_INTERNAL_CHECK_COST_VALUE(functor_traits<UnaryOp>::Cost);
7652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
7662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
7672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
7682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename XprType::Scalar Scalar;
7692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename XprType::CoeffReturnType CoeffReturnType;
7702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
7712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
7722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  CoeffReturnType coeff(Index row, Index col) const
7732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
7742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_unaryOp(m_argImpl.coeff(row, col));
7752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
7762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
7772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
7782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  CoeffReturnType coeff(Index index) const
7792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
7802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_unaryOp(m_argImpl.coeff(index));
7812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
7822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
7832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
7842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Scalar& coeffRef(Index row, Index col)
7852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
7862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_unaryOp(m_argImpl.coeffRef(row, col));
7872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
7882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
7892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
7902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Scalar& coeffRef(Index index)
7912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
7922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_unaryOp(m_argImpl.coeffRef(index));
7932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
7942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
7952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangprotected:
7962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  const UnaryOp m_unaryOp;
7972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  evaluator<ArgType> m_argImpl;
7982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
7992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
8002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// -------------------- Map --------------------
8012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
8022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// FIXME perhaps the PlainObjectType could be provided by Derived::PlainObject ?
8032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// but that might complicate template specialization
8042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Derived, typename PlainObjectType>
8052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct mapbase_evaluator;
8062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
8072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename Derived, typename PlainObjectType>
8082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct mapbase_evaluator : evaluator_base<Derived>
8092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
8102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef Derived  XprType;
8112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename XprType::PointerType PointerType;
8122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename XprType::Scalar Scalar;
8132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename XprType::CoeffReturnType CoeffReturnType;
8142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
8152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  enum {
8162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    IsRowMajor = XprType::RowsAtCompileTime,
8172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    ColsAtCompileTime = XprType::ColsAtCompileTime,
8182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    CoeffReadCost = NumTraits<Scalar>::ReadCost
8192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  };
8202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
8212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC explicit mapbase_evaluator(const XprType& map)
8222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    : m_data(const_cast<PointerType>(map.data())),
8232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      m_innerStride(map.innerStride()),
8242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      m_outerStride(map.outerStride())
8252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
8262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(evaluator<Derived>::Flags&PacketAccessBit, internal::inner_stride_at_compile_time<Derived>::ret==1),
8272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                        PACKET_ACCESS_REQUIRES_TO_HAVE_INNER_STRIDE_FIXED_TO_1);
8282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
8292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
8302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
8312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
8322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  CoeffReturnType coeff(Index row, Index col) const
8332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
8342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_data[col * colStride() + row * rowStride()];
8352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
8362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
8372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
8382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  CoeffReturnType coeff(Index index) const
8392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
8402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_data[index * m_innerStride.value()];
8412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
8422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
8432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
8442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Scalar& coeffRef(Index row, Index col)
8452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
8462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_data[col * colStride() + row * rowStride()];
8472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
8482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
8492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
8502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Scalar& coeffRef(Index index)
8512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
8522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_data[index * m_innerStride.value()];
8532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
8542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
8552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int LoadMode, typename PacketType>
8562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
8572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  PacketType packet(Index row, Index col) const
8582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
8592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    PointerType ptr = m_data + row * rowStride() + col * colStride();
8602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return internal::ploadt<PacketType, LoadMode>(ptr);
8612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
8622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
8632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int LoadMode, typename PacketType>
8642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
8652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  PacketType packet(Index index) const
8662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
8672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return internal::ploadt<PacketType, LoadMode>(m_data + index * m_innerStride.value());
8682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
8692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
8702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int StoreMode, typename PacketType>
8712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
8722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  void writePacket(Index row, Index col, const PacketType& x)
8732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
8742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    PointerType ptr = m_data + row * rowStride() + col * colStride();
8752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return internal::pstoret<Scalar, PacketType, StoreMode>(ptr, x);
8762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
8772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
8782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int StoreMode, typename PacketType>
8792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
8802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  void writePacket(Index index, const PacketType& x)
8812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
8822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    internal::pstoret<Scalar, PacketType, StoreMode>(m_data + index * m_innerStride.value(), x);
8832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
8842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangprotected:
8852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC
8862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  inline Index rowStride() const { return XprType::IsRowMajor ? m_outerStride.value() : m_innerStride.value(); }
8872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC
8882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  inline Index colStride() const { return XprType::IsRowMajor ? m_innerStride.value() : m_outerStride.value(); }
8892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
8902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  PointerType m_data;
8912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  const internal::variable_if_dynamic<Index, XprType::InnerStrideAtCompileTime> m_innerStride;
8922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  const internal::variable_if_dynamic<Index, XprType::OuterStrideAtCompileTime> m_outerStride;
8932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
8942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
8952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename PlainObjectType, int MapOptions, typename StrideType>
8962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct evaluator<Map<PlainObjectType, MapOptions, StrideType> >
8972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : public mapbase_evaluator<Map<PlainObjectType, MapOptions, StrideType>, PlainObjectType>
8982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
8992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef Map<PlainObjectType, MapOptions, StrideType> XprType;
9002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename XprType::Scalar Scalar;
9012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  // TODO: should check for smaller packet types once we can handle multi-sized packet types
9022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename packet_traits<Scalar>::type PacketScalar;
9032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
9042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  enum {
9052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    InnerStrideAtCompileTime = StrideType::InnerStrideAtCompileTime == 0
9062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                             ? int(PlainObjectType::InnerStrideAtCompileTime)
9072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                             : int(StrideType::InnerStrideAtCompileTime),
9082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    OuterStrideAtCompileTime = StrideType::OuterStrideAtCompileTime == 0
9092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                             ? int(PlainObjectType::OuterStrideAtCompileTime)
9102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                             : int(StrideType::OuterStrideAtCompileTime),
9112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    HasNoInnerStride = InnerStrideAtCompileTime == 1,
9122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    HasNoOuterStride = StrideType::OuterStrideAtCompileTime == 0,
9132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    HasNoStride = HasNoInnerStride && HasNoOuterStride,
9142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    IsDynamicSize = PlainObjectType::SizeAtCompileTime==Dynamic,
9152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
9162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    PacketAccessMask = bool(HasNoInnerStride) ? ~int(0) : ~int(PacketAccessBit),
9172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    LinearAccessMask = bool(HasNoStride) || bool(PlainObjectType::IsVectorAtCompileTime) ? ~int(0) : ~int(LinearAccessBit),
9182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Flags = int( evaluator<PlainObjectType>::Flags) & (LinearAccessMask&PacketAccessMask),
9192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
9202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Alignment = int(MapOptions)&int(AlignedMask)
9212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  };
9222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
9232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC explicit evaluator(const XprType& map)
9242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    : mapbase_evaluator<XprType, PlainObjectType>(map)
9252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  { }
9262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
9272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
9282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// -------------------- Ref --------------------
9292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
9302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename PlainObjectType, int RefOptions, typename StrideType>
9312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct evaluator<Ref<PlainObjectType, RefOptions, StrideType> >
9322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : public mapbase_evaluator<Ref<PlainObjectType, RefOptions, StrideType>, PlainObjectType>
9332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
9342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef Ref<PlainObjectType, RefOptions, StrideType> XprType;
9352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
9362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  enum {
9372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Flags = evaluator<Map<PlainObjectType, RefOptions, StrideType> >::Flags,
9382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Alignment = evaluator<Map<PlainObjectType, RefOptions, StrideType> >::Alignment
9392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  };
9402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
9412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC explicit evaluator(const XprType& ref)
9422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    : mapbase_evaluator<XprType, PlainObjectType>(ref)
9432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  { }
9442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
9452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
9462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// -------------------- Block --------------------
9472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
9482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename ArgType, int BlockRows, int BlockCols, bool InnerPanel,
9492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang         bool HasDirectAccess = internal::has_direct_access<ArgType>::ret> struct block_evaluator;
9502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
9512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename ArgType, int BlockRows, int BlockCols, bool InnerPanel>
9522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct evaluator<Block<ArgType, BlockRows, BlockCols, InnerPanel> >
9532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : block_evaluator<ArgType, BlockRows, BlockCols, InnerPanel>
9542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
9552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef Block<ArgType, BlockRows, BlockCols, InnerPanel> XprType;
9562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename XprType::Scalar Scalar;
9572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  // TODO: should check for smaller packet types once we can handle multi-sized packet types
9582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename packet_traits<Scalar>::type PacketScalar;
9592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
9602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  enum {
9612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    CoeffReadCost = evaluator<ArgType>::CoeffReadCost,
9622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
9632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    RowsAtCompileTime = traits<XprType>::RowsAtCompileTime,
9642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    ColsAtCompileTime = traits<XprType>::ColsAtCompileTime,
9652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    MaxRowsAtCompileTime = traits<XprType>::MaxRowsAtCompileTime,
9662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    MaxColsAtCompileTime = traits<XprType>::MaxColsAtCompileTime,
9672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
9682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    ArgTypeIsRowMajor = (int(evaluator<ArgType>::Flags)&RowMajorBit) != 0,
9692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    IsRowMajor = (MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1) ? 1
9702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang               : (MaxColsAtCompileTime==1 && MaxRowsAtCompileTime!=1) ? 0
9712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang               : ArgTypeIsRowMajor,
9722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    HasSameStorageOrderAsArgType = (IsRowMajor == ArgTypeIsRowMajor),
9732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    InnerSize = IsRowMajor ? int(ColsAtCompileTime) : int(RowsAtCompileTime),
9742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    InnerStrideAtCompileTime = HasSameStorageOrderAsArgType
9752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                             ? int(inner_stride_at_compile_time<ArgType>::ret)
9762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                             : int(outer_stride_at_compile_time<ArgType>::ret),
9772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    OuterStrideAtCompileTime = HasSameStorageOrderAsArgType
9782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                             ? int(outer_stride_at_compile_time<ArgType>::ret)
9792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                             : int(inner_stride_at_compile_time<ArgType>::ret),
9802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    MaskPacketAccessBit = (InnerStrideAtCompileTime == 1) ? PacketAccessBit : 0,
9812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
9822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    FlagsLinearAccessBit = (RowsAtCompileTime == 1 || ColsAtCompileTime == 1 || (InnerPanel && (evaluator<ArgType>::Flags&LinearAccessBit))) ? LinearAccessBit : 0,
9832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    FlagsRowMajorBit = XprType::Flags&RowMajorBit,
9842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Flags0 = evaluator<ArgType>::Flags & ( (HereditaryBits & ~RowMajorBit) |
9852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                                           DirectAccessBit |
9862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                                           MaskPacketAccessBit),
9872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Flags = Flags0 | FlagsLinearAccessBit | FlagsRowMajorBit,
9882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
9892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    PacketAlignment = unpacket_traits<PacketScalar>::alignment,
9902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Alignment0 = (InnerPanel && (OuterStrideAtCompileTime!=Dynamic) && (((OuterStrideAtCompileTime * int(sizeof(Scalar))) % int(PacketAlignment)) == 0)) ? int(PacketAlignment) : 0,
9912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Alignment = EIGEN_PLAIN_ENUM_MIN(evaluator<ArgType>::Alignment, Alignment0)
9922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  };
9932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef block_evaluator<ArgType, BlockRows, BlockCols, InnerPanel> block_evaluator_type;
9942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC explicit evaluator(const XprType& block) : block_evaluator_type(block)
9952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
9962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
9972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
9982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
9992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
10002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// no direct-access => dispatch to a unary evaluator
10012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename ArgType, int BlockRows, int BlockCols, bool InnerPanel>
10022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct block_evaluator<ArgType, BlockRows, BlockCols, InnerPanel, /*HasDirectAccess*/ false>
10032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : unary_evaluator<Block<ArgType, BlockRows, BlockCols, InnerPanel> >
10042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
10052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef Block<ArgType, BlockRows, BlockCols, InnerPanel> XprType;
10062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
10072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC explicit block_evaluator(const XprType& block)
10082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    : unary_evaluator<XprType>(block)
10092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {}
10102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
10112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
10122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename ArgType, int BlockRows, int BlockCols, bool InnerPanel>
10132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct unary_evaluator<Block<ArgType, BlockRows, BlockCols, InnerPanel>, IndexBased>
10142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : evaluator_base<Block<ArgType, BlockRows, BlockCols, InnerPanel> >
10152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
10162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef Block<ArgType, BlockRows, BlockCols, InnerPanel> XprType;
10172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
10182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC explicit unary_evaluator(const XprType& block)
10192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    : m_argImpl(block.nestedExpression()),
10202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      m_startRow(block.startRow()),
10212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      m_startCol(block.startCol())
10222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  { }
10232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
10242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename XprType::Scalar Scalar;
10252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename XprType::CoeffReturnType CoeffReturnType;
10262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
10272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  enum {
10282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    RowsAtCompileTime = XprType::RowsAtCompileTime
10292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  };
10302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
10312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
10322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  CoeffReturnType coeff(Index row, Index col) const
10332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
10342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_argImpl.coeff(m_startRow.value() + row, m_startCol.value() + col);
10352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
10362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
10372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
10382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  CoeffReturnType coeff(Index index) const
10392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
10402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return coeff(RowsAtCompileTime == 1 ? 0 : index, RowsAtCompileTime == 1 ? index : 0);
10412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
10422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
10432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
10442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Scalar& coeffRef(Index row, Index col)
10452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
10462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_argImpl.coeffRef(m_startRow.value() + row, m_startCol.value() + col);
10472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
10482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
10492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
10502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Scalar& coeffRef(Index index)
10512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
10522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return coeffRef(RowsAtCompileTime == 1 ? 0 : index, RowsAtCompileTime == 1 ? index : 0);
10532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
10542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
10552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int LoadMode, typename PacketType>
10562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
10572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  PacketType packet(Index row, Index col) const
10582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
10592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_argImpl.template packet<LoadMode,PacketType>(m_startRow.value() + row, m_startCol.value() + col);
10602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
10612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
10622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int LoadMode, typename PacketType>
10632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
10642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  PacketType packet(Index index) const
10652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
10662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return packet<LoadMode,PacketType>(RowsAtCompileTime == 1 ? 0 : index,
10672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                                       RowsAtCompileTime == 1 ? index : 0);
10682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
10692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
10702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int StoreMode, typename PacketType>
10712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
10722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  void writePacket(Index row, Index col, const PacketType& x)
10732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
10742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_argImpl.template writePacket<StoreMode,PacketType>(m_startRow.value() + row, m_startCol.value() + col, x);
10752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
10762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
10772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int StoreMode, typename PacketType>
10782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
10792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  void writePacket(Index index, const PacketType& x)
10802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
10812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return writePacket<StoreMode,PacketType>(RowsAtCompileTime == 1 ? 0 : index,
10822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                                             RowsAtCompileTime == 1 ? index : 0,
10832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                                             x);
10842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
10852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
10862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangprotected:
10872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  evaluator<ArgType> m_argImpl;
10882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  const variable_if_dynamic<Index, (ArgType::RowsAtCompileTime == 1 && BlockRows==1) ? 0 : Dynamic> m_startRow;
10892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  const variable_if_dynamic<Index, (ArgType::ColsAtCompileTime == 1 && BlockCols==1) ? 0 : Dynamic> m_startCol;
10902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
10912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
10922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// TODO: This evaluator does not actually use the child evaluator;
10932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// all action is via the data() as returned by the Block expression.
10942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
10952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename ArgType, int BlockRows, int BlockCols, bool InnerPanel>
10962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct block_evaluator<ArgType, BlockRows, BlockCols, InnerPanel, /* HasDirectAccess */ true>
10972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : mapbase_evaluator<Block<ArgType, BlockRows, BlockCols, InnerPanel>,
10982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                      typename Block<ArgType, BlockRows, BlockCols, InnerPanel>::PlainObject>
10992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
11002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef Block<ArgType, BlockRows, BlockCols, InnerPanel> XprType;
11012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename XprType::Scalar Scalar;
11022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
11032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC explicit block_evaluator(const XprType& block)
11042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    : mapbase_evaluator<XprType, typename XprType::PlainObject>(block)
11052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
11062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // TODO: for the 3.3 release, this should be turned to an internal assertion, but let's keep it as is for the beta lifetime
11072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    eigen_assert(((internal::UIntPtr(block.data()) % EIGEN_PLAIN_ENUM_MAX(1,evaluator<XprType>::Alignment)) == 0) && "data is not aligned");
11082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
11092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
11102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
11112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
11122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// -------------------- Select --------------------
11132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// NOTE shall we introduce a ternary_evaluator?
11142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
11152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// TODO enable vectorization for Select
11162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename ConditionMatrixType, typename ThenMatrixType, typename ElseMatrixType>
11172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct evaluator<Select<ConditionMatrixType, ThenMatrixType, ElseMatrixType> >
11182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : evaluator_base<Select<ConditionMatrixType, ThenMatrixType, ElseMatrixType> >
11192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
11202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef Select<ConditionMatrixType, ThenMatrixType, ElseMatrixType> XprType;
11212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  enum {
11222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    CoeffReadCost = evaluator<ConditionMatrixType>::CoeffReadCost
11232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                  + EIGEN_PLAIN_ENUM_MAX(evaluator<ThenMatrixType>::CoeffReadCost,
11242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                                         evaluator<ElseMatrixType>::CoeffReadCost),
11252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
11262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Flags = (unsigned int)evaluator<ThenMatrixType>::Flags & evaluator<ElseMatrixType>::Flags & HereditaryBits,
11272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
11282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Alignment = EIGEN_PLAIN_ENUM_MIN(evaluator<ThenMatrixType>::Alignment, evaluator<ElseMatrixType>::Alignment)
11292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  };
11302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
11312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC explicit evaluator(const XprType& select)
11322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    : m_conditionImpl(select.conditionMatrix()),
11332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      m_thenImpl(select.thenMatrix()),
11342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      m_elseImpl(select.elseMatrix())
11352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
11362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
11372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
11382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
11392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename XprType::CoeffReturnType CoeffReturnType;
11402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
11412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
11422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  CoeffReturnType coeff(Index row, Index col) const
11432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
11442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    if (m_conditionImpl.coeff(row, col))
11452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return m_thenImpl.coeff(row, col);
11462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    else
11472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return m_elseImpl.coeff(row, col);
11482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
11492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
11502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
11512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  CoeffReturnType coeff(Index index) const
11522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
11532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    if (m_conditionImpl.coeff(index))
11542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return m_thenImpl.coeff(index);
11552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    else
11562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return m_elseImpl.coeff(index);
11572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
11582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
11592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangprotected:
11602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  evaluator<ConditionMatrixType> m_conditionImpl;
11612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  evaluator<ThenMatrixType> m_thenImpl;
11622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  evaluator<ElseMatrixType> m_elseImpl;
11632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
11642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
11652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
11662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// -------------------- Replicate --------------------
11672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
11682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename ArgType, int RowFactor, int ColFactor>
11692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct unary_evaluator<Replicate<ArgType, RowFactor, ColFactor> >
11702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : evaluator_base<Replicate<ArgType, RowFactor, ColFactor> >
11712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
11722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef Replicate<ArgType, RowFactor, ColFactor> XprType;
11732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename XprType::CoeffReturnType CoeffReturnType;
11742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  enum {
11752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Factor = (RowFactor==Dynamic || ColFactor==Dynamic) ? Dynamic : RowFactor*ColFactor
11762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  };
11772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename internal::nested_eval<ArgType,Factor>::type ArgTypeNested;
11782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename internal::remove_all<ArgTypeNested>::type ArgTypeNestedCleaned;
11792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
11802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  enum {
11812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    CoeffReadCost = evaluator<ArgTypeNestedCleaned>::CoeffReadCost,
11822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    LinearAccessMask = XprType::IsVectorAtCompileTime ? LinearAccessBit : 0,
11832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Flags = (evaluator<ArgTypeNestedCleaned>::Flags & (HereditaryBits|LinearAccessMask) & ~RowMajorBit) | (traits<XprType>::Flags & RowMajorBit),
11842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
11852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Alignment = evaluator<ArgTypeNestedCleaned>::Alignment
11862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  };
11872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
11882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC explicit unary_evaluator(const XprType& replicate)
11892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    : m_arg(replicate.nestedExpression()),
11902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      m_argImpl(m_arg),
11912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      m_rows(replicate.nestedExpression().rows()),
11922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      m_cols(replicate.nestedExpression().cols())
11932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {}
11942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
11952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
11962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  CoeffReturnType coeff(Index row, Index col) const
11972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
11982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // try to avoid using modulo; this is a pure optimization strategy
11992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const Index actual_row = internal::traits<XprType>::RowsAtCompileTime==1 ? 0
12002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                           : RowFactor==1 ? row
12012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                           : row % m_rows.value();
12022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const Index actual_col = internal::traits<XprType>::ColsAtCompileTime==1 ? 0
12032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                           : ColFactor==1 ? col
12042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                           : col % m_cols.value();
12052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
12062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_argImpl.coeff(actual_row, actual_col);
12072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
12082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
12092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
12102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  CoeffReturnType coeff(Index index) const
12112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
12122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // try to avoid using modulo; this is a pure optimization strategy
12132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const Index actual_index = internal::traits<XprType>::RowsAtCompileTime==1
12142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                                  ? (ColFactor==1 ?  index : index%m_cols.value())
12152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                                  : (RowFactor==1 ?  index : index%m_rows.value());
12162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
12172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_argImpl.coeff(actual_index);
12182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
12192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
12202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int LoadMode, typename PacketType>
12212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
12222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  PacketType packet(Index row, Index col) const
12232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
12242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const Index actual_row = internal::traits<XprType>::RowsAtCompileTime==1 ? 0
12252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                           : RowFactor==1 ? row
12262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                           : row % m_rows.value();
12272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const Index actual_col = internal::traits<XprType>::ColsAtCompileTime==1 ? 0
12282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                           : ColFactor==1 ? col
12292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                           : col % m_cols.value();
12302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
12312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_argImpl.template packet<LoadMode,PacketType>(actual_row, actual_col);
12322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
12332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
12342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int LoadMode, typename PacketType>
12352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
12362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  PacketType packet(Index index) const
12372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
12382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const Index actual_index = internal::traits<XprType>::RowsAtCompileTime==1
12392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                                  ? (ColFactor==1 ?  index : index%m_cols.value())
12402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                                  : (RowFactor==1 ?  index : index%m_rows.value());
12412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
12422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_argImpl.template packet<LoadMode,PacketType>(actual_index);
12432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
12442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
12452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangprotected:
12462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  const ArgTypeNested m_arg;
12472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  evaluator<ArgTypeNestedCleaned> m_argImpl;
12482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  const variable_if_dynamic<Index, ArgType::RowsAtCompileTime> m_rows;
12492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  const variable_if_dynamic<Index, ArgType::ColsAtCompileTime> m_cols;
12502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
12512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
12522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
12532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// -------------------- PartialReduxExpr --------------------
12542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
12552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate< typename ArgType, typename MemberOp, int Direction>
12562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct evaluator<PartialReduxExpr<ArgType, MemberOp, Direction> >
12572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : evaluator_base<PartialReduxExpr<ArgType, MemberOp, Direction> >
12582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
12592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef PartialReduxExpr<ArgType, MemberOp, Direction> XprType;
12602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename internal::nested_eval<ArgType,1>::type ArgTypeNested;
12612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename internal::remove_all<ArgTypeNested>::type ArgTypeNestedCleaned;
12622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename ArgType::Scalar InputScalar;
12632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename XprType::Scalar Scalar;
12642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  enum {
12652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    TraversalSize = Direction==int(Vertical) ? int(ArgType::RowsAtCompileTime) :  int(ArgType::ColsAtCompileTime)
12662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  };
12672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename MemberOp::template Cost<InputScalar,int(TraversalSize)> CostOpType;
12682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  enum {
12692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    CoeffReadCost = TraversalSize==Dynamic ? HugeCost
12702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                  : TraversalSize * evaluator<ArgType>::CoeffReadCost + int(CostOpType::value),
12712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
12722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Flags = (traits<XprType>::Flags&RowMajorBit) | (evaluator<ArgType>::Flags&(HereditaryBits&(~RowMajorBit))) | LinearAccessBit,
12732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
12742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Alignment = 0 // FIXME this will need to be improved once PartialReduxExpr is vectorized
12752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  };
12762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
12772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC explicit evaluator(const XprType xpr)
12782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    : m_arg(xpr.nestedExpression()), m_functor(xpr.functor())
12792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
12802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_INTERNAL_CHECK_COST_VALUE(TraversalSize==Dynamic ? HugeCost : int(CostOpType::value));
12812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
12822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
12832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
12842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename XprType::CoeffReturnType CoeffReturnType;
12852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
12862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
12872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  const Scalar coeff(Index i, Index j) const
12882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
12892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    if (Direction==Vertical)
12902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return m_functor(m_arg.col(j));
12912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    else
12922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return m_functor(m_arg.row(i));
12932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
12942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
12952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
12962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  const Scalar coeff(Index index) const
12972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
12982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    if (Direction==Vertical)
12992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return m_functor(m_arg.col(index));
13002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    else
13012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return m_functor(m_arg.row(index));
13022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
13032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
13042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangprotected:
13052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typename internal::add_const_on_value_type<ArgTypeNested>::type m_arg;
13062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  const MemberOp m_functor;
13072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
13082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
13092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
13102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// -------------------- MatrixWrapper and ArrayWrapper --------------------
13112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang//
13122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// evaluator_wrapper_base<T> is a common base class for the
13132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// MatrixWrapper and ArrayWrapper evaluators.
13142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
13152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename XprType>
13162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct evaluator_wrapper_base
13172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : evaluator_base<XprType>
13182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
13192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename remove_all<typename XprType::NestedExpressionType>::type ArgType;
13202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  enum {
13212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    CoeffReadCost = evaluator<ArgType>::CoeffReadCost,
13222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Flags = evaluator<ArgType>::Flags,
13232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Alignment = evaluator<ArgType>::Alignment
13242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  };
13252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
13262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC explicit evaluator_wrapper_base(const ArgType& arg) : m_argImpl(arg) {}
13272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
13282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename ArgType::Scalar Scalar;
13292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename ArgType::CoeffReturnType CoeffReturnType;
13302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
13312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
13322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  CoeffReturnType coeff(Index row, Index col) const
13332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
13342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_argImpl.coeff(row, col);
13352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
13362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
13372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
13382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  CoeffReturnType coeff(Index index) const
13392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
13402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_argImpl.coeff(index);
13412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
13422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
13432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
13442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Scalar& coeffRef(Index row, Index col)
13452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
13462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_argImpl.coeffRef(row, col);
13472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
13482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
13492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
13502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Scalar& coeffRef(Index index)
13512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
13522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_argImpl.coeffRef(index);
13532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
13542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
13552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int LoadMode, typename PacketType>
13562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
13572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  PacketType packet(Index row, Index col) const
13582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
13592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_argImpl.template packet<LoadMode,PacketType>(row, col);
13602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
13612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
13622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int LoadMode, typename PacketType>
13632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
13642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  PacketType packet(Index index) const
13652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
13662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_argImpl.template packet<LoadMode,PacketType>(index);
13672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
13682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
13692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int StoreMode, typename PacketType>
13702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
13712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  void writePacket(Index row, Index col, const PacketType& x)
13722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
13732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    m_argImpl.template writePacket<StoreMode>(row, col, x);
13742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
13752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
13762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int StoreMode, typename PacketType>
13772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
13782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  void writePacket(Index index, const PacketType& x)
13792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
13802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    m_argImpl.template writePacket<StoreMode>(index, x);
13812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
13822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
13832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangprotected:
13842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  evaluator<ArgType> m_argImpl;
13852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
13862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
13872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename TArgType>
13882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct unary_evaluator<MatrixWrapper<TArgType> >
13892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : evaluator_wrapper_base<MatrixWrapper<TArgType> >
13902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
13912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef MatrixWrapper<TArgType> XprType;
13922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
13932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC explicit unary_evaluator(const XprType& wrapper)
13942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    : evaluator_wrapper_base<MatrixWrapper<TArgType> >(wrapper.nestedExpression())
13952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  { }
13962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
13972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
13982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename TArgType>
13992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct unary_evaluator<ArrayWrapper<TArgType> >
14002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : evaluator_wrapper_base<ArrayWrapper<TArgType> >
14012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
14022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef ArrayWrapper<TArgType> XprType;
14032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
14042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC explicit unary_evaluator(const XprType& wrapper)
14052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    : evaluator_wrapper_base<ArrayWrapper<TArgType> >(wrapper.nestedExpression())
14062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  { }
14072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
14082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
14092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
14102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// -------------------- Reverse --------------------
14112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
14122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// defined in Reverse.h:
14132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename PacketType, bool ReversePacket> struct reverse_packet_cond;
14142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
14152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename ArgType, int Direction>
14162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct unary_evaluator<Reverse<ArgType, Direction> >
14172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : evaluator_base<Reverse<ArgType, Direction> >
14182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
14192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef Reverse<ArgType, Direction> XprType;
14202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename XprType::Scalar Scalar;
14212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename XprType::CoeffReturnType CoeffReturnType;
14222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
14232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  enum {
14242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    IsRowMajor = XprType::IsRowMajor,
14252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    IsColMajor = !IsRowMajor,
14262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    ReverseRow = (Direction == Vertical)   || (Direction == BothDirections),
14272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    ReverseCol = (Direction == Horizontal) || (Direction == BothDirections),
14282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    ReversePacket = (Direction == BothDirections)
14292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                    || ((Direction == Vertical)   && IsColMajor)
14302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                    || ((Direction == Horizontal) && IsRowMajor),
14312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
14322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    CoeffReadCost = evaluator<ArgType>::CoeffReadCost,
14332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
14342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // let's enable LinearAccess only with vectorization because of the product overhead
14352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // FIXME enable DirectAccess with negative strides?
14362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Flags0 = evaluator<ArgType>::Flags,
14372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    LinearAccess = ( (Direction==BothDirections) && (int(Flags0)&PacketAccessBit) )
14382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                  || ((ReverseRow && XprType::ColsAtCompileTime==1) || (ReverseCol && XprType::RowsAtCompileTime==1))
14392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                 ? LinearAccessBit : 0,
14402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
14412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Flags = int(Flags0) & (HereditaryBits | PacketAccessBit | LinearAccess),
14422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
14432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Alignment = 0 // FIXME in some rare cases, Alignment could be preserved, like a Vector4f.
14442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  };
14452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
14462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC explicit unary_evaluator(const XprType& reverse)
14472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    : m_argImpl(reverse.nestedExpression()),
14482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      m_rows(ReverseRow ? reverse.nestedExpression().rows() : 1),
14492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      m_cols(ReverseCol ? reverse.nestedExpression().cols() : 1)
14502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  { }
14512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
14522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
14532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  CoeffReturnType coeff(Index row, Index col) const
14542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
14552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_argImpl.coeff(ReverseRow ? m_rows.value() - row - 1 : row,
14562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                           ReverseCol ? m_cols.value() - col - 1 : col);
14572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
14582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
14592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
14602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  CoeffReturnType coeff(Index index) const
14612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
14622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_argImpl.coeff(m_rows.value() * m_cols.value() - index - 1);
14632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
14642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
14652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
14662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Scalar& coeffRef(Index row, Index col)
14672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
14682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_argImpl.coeffRef(ReverseRow ? m_rows.value() - row - 1 : row,
14692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                              ReverseCol ? m_cols.value() - col - 1 : col);
14702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
14712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
14722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
14732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Scalar& coeffRef(Index index)
14742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
14752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_argImpl.coeffRef(m_rows.value() * m_cols.value() - index - 1);
14762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
14772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
14782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int LoadMode, typename PacketType>
14792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
14802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  PacketType packet(Index row, Index col) const
14812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
14822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    enum {
14832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      PacketSize = unpacket_traits<PacketType>::size,
14842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      OffsetRow  = ReverseRow && IsColMajor ? PacketSize : 1,
14852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      OffsetCol  = ReverseCol && IsRowMajor ? PacketSize : 1
14862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    };
14872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef internal::reverse_packet_cond<PacketType,ReversePacket> reverse_packet;
14882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return reverse_packet::run(m_argImpl.template packet<LoadMode,PacketType>(
14892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                                  ReverseRow ? m_rows.value() - row - OffsetRow : row,
14902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                                  ReverseCol ? m_cols.value() - col - OffsetCol : col));
14912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
14922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
14932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int LoadMode, typename PacketType>
14942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
14952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  PacketType packet(Index index) const
14962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
14972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    enum { PacketSize = unpacket_traits<PacketType>::size };
14982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return preverse(m_argImpl.template packet<LoadMode,PacketType>(m_rows.value() * m_cols.value() - index - PacketSize));
14992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
15002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
15012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int LoadMode, typename PacketType>
15022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
15032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  void writePacket(Index row, Index col, const PacketType& x)
15042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
15052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // FIXME we could factorize some code with packet(i,j)
15062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    enum {
15072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      PacketSize = unpacket_traits<PacketType>::size,
15082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      OffsetRow  = ReverseRow && IsColMajor ? PacketSize : 1,
15092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      OffsetCol  = ReverseCol && IsRowMajor ? PacketSize : 1
15102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    };
15112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef internal::reverse_packet_cond<PacketType,ReversePacket> reverse_packet;
15122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    m_argImpl.template writePacket<LoadMode>(
15132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                                  ReverseRow ? m_rows.value() - row - OffsetRow : row,
15142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                                  ReverseCol ? m_cols.value() - col - OffsetCol : col,
15152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                                  reverse_packet::run(x));
15162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
15172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
15182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  template<int LoadMode, typename PacketType>
15192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_STRONG_INLINE
15202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  void writePacket(Index index, const PacketType& x)
15212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
15222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    enum { PacketSize = unpacket_traits<PacketType>::size };
15232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    m_argImpl.template writePacket<LoadMode>
15242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      (m_rows.value() * m_cols.value() - index - PacketSize, preverse(x));
15252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
15262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
15272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangprotected:
15282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  evaluator<ArgType> m_argImpl;
15292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
15302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  // If we do not reverse rows, then we do not need to know the number of rows; same for columns
15312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  // Nonetheless, in this case it is important to set to 1 such that the coeff(index) method works fine for vectors.
15322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  const variable_if_dynamic<Index, ReverseRow ? ArgType::RowsAtCompileTime : 1> m_rows;
15332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  const variable_if_dynamic<Index, ReverseCol ? ArgType::ColsAtCompileTime : 1> m_cols;
15342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
15352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
15362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
15372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// -------------------- Diagonal --------------------
15382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
15392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename ArgType, int DiagIndex>
15402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct evaluator<Diagonal<ArgType, DiagIndex> >
15412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : evaluator_base<Diagonal<ArgType, DiagIndex> >
15422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
15432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef Diagonal<ArgType, DiagIndex> XprType;
15442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
15452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  enum {
15462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    CoeffReadCost = evaluator<ArgType>::CoeffReadCost,
15472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
15482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Flags = (unsigned int)(evaluator<ArgType>::Flags & (HereditaryBits | DirectAccessBit) & ~RowMajorBit) | LinearAccessBit,
15492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
15502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    Alignment = 0
15512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  };
15522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
15532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC explicit evaluator(const XprType& diagonal)
15542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    : m_argImpl(diagonal.nestedExpression()),
15552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      m_index(diagonal.index())
15562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  { }
15572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
15582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename XprType::Scalar Scalar;
15592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename XprType::CoeffReturnType CoeffReturnType;
15602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
15612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
15622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  CoeffReturnType coeff(Index row, Index) const
15632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
15642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_argImpl.coeff(row + rowOffset(), row + colOffset());
15652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
15662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
15672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
15682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  CoeffReturnType coeff(Index index) const
15692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
15702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_argImpl.coeff(index + rowOffset(), index + colOffset());
15712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
15722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
15732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
15742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Scalar& coeffRef(Index row, Index)
15752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
15762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_argImpl.coeffRef(row + rowOffset(), row + colOffset());
15772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
15782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
15792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
15802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Scalar& coeffRef(Index index)
15812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
15822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_argImpl.coeffRef(index + rowOffset(), index + colOffset());
15832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
15842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
15852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangprotected:
15862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  evaluator<ArgType> m_argImpl;
15872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  const internal::variable_if_dynamicindex<Index, XprType::DiagIndex> m_index;
15882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
15892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangprivate:
15902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index rowOffset() const { return m_index.value() > 0 ? 0 : -m_index.value(); }
15912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index colOffset() const { return m_index.value() > 0 ? m_index.value() : 0; }
15922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
15932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
15942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
15952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang//----------------------------------------------------------------------
15962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// deprecated code
15972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang//----------------------------------------------------------------------
15982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
15992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// -------------------- EvalToTemp --------------------
16002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
16012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// expression class for evaluating nested expression to a temporary
16022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
16032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename ArgType> class EvalToTemp;
16042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
16052b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename ArgType>
16062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct traits<EvalToTemp<ArgType> >
16072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : public traits<ArgType>
16082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{ };
16092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
16102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename ArgType>
16112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangclass EvalToTemp
16122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : public dense_xpr_base<EvalToTemp<ArgType> >::type
16132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
16142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang public:
16152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
16162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename dense_xpr_base<EvalToTemp>::type Base;
16172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_GENERIC_PUBLIC_INTERFACE(EvalToTemp)
16182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
16192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  explicit EvalToTemp(const ArgType& arg)
16202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    : m_arg(arg)
16212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  { }
16222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
16232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  const ArgType& arg() const
16242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
16252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_arg;
16262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
16272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
16282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Index rows() const
16292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
16302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_arg.rows();
16312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
16322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
16332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Index cols() const
16342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
16352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    return m_arg.cols();
16362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
16372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
16382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang private:
16392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  const ArgType& m_arg;
16402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
16412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
16422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangtemplate<typename ArgType>
16432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstruct evaluator<EvalToTemp<ArgType> >
16442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  : public evaluator<typename ArgType::PlainObject>
16452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
16462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef EvalToTemp<ArgType>                   XprType;
16472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef typename ArgType::PlainObject         PlainObject;
16482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef evaluator<PlainObject> Base;
16492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
16502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC explicit evaluator(const XprType& xpr)
16512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    : m_result(xpr.arg())
16522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
16532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    ::new (static_cast<Base*>(this)) Base(m_result);
16542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
16552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
16562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  // This constructor is used when nesting an EvalTo evaluator in another evaluator
16572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  EIGEN_DEVICE_FUNC evaluator(const ArgType& arg)
16582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    : m_result(arg)
16592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  {
16602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    ::new (static_cast<Base*>(this)) Base(m_result);
16612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
16622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
16632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangprotected:
16642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  PlainObject m_result;
16652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang};
16662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
16672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} // namespace internal
16682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
16692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang} // end namespace Eigen
16702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
16712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#endif // EIGEN_COREEVALUATORS_H
1672