1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr> 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla 7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed 8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_FUNCTORS_H 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_FUNCTORS_H 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen { 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal { 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// associative functors: 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the sum of two scalars 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseBinaryOp, MatrixBase::operator+, class VectorwiseOp, MatrixBase::sum() 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_sum_op { 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_sum_op) 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a, const Scalar& b) const { return a + b; } 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::padd(a,b); } 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Scalar predux(const Packet& a) const 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::predux(a); } 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_sum_op<Scalar> > { 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = NumTraits<Scalar>::AddCost, 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = packet_traits<Scalar>::HasAdd 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the product of two scalars 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseBinaryOp, Cwise::operator*(), class VectorwiseOp, MatrixBase::redux() 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename LhsScalar,typename RhsScalar> struct scalar_product_op { 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // TODO vectorize mixed product 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Vectorizable = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasMul && packet_traits<RhsScalar>::HasMul 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename scalar_product_traits<LhsScalar,RhsScalar>::ReturnType result_type; 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_product_op) 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return a * b; } 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::pmul(a,b); } 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const result_type predux(const Packet& a) const 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::predux_mul(a); } 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename LhsScalar,typename RhsScalar> 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_product_op<LhsScalar,RhsScalar> > { 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = (NumTraits<LhsScalar>::MulCost + NumTraits<RhsScalar>::MulCost)/2, // rough estimate! 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = scalar_product_op<LhsScalar,RhsScalar>::Vectorizable 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the conjugate product of two scalars 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This is a short cut for conj(x) * y which is needed for optimization purpose; in Eigen2 support mode, this becomes x * conj(y) 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename LhsScalar,typename RhsScalar> struct scalar_conj_product_op { 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Conj = NumTraits<LhsScalar>::IsComplex 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename scalar_product_traits<LhsScalar,RhsScalar>::ReturnType result_type; 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_conj_product_op) 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return conj_helper<LhsScalar,RhsScalar,Conj,false>().pmul(a,b); } 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return conj_helper<Packet,Packet,Conj,false>().pmul(a,b); } 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename LhsScalar,typename RhsScalar> 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_conj_product_op<LhsScalar,RhsScalar> > { 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = NumTraits<LhsScalar>::MulCost, 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = internal::is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasMul 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the min of two scalars 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseBinaryOp, MatrixBase::cwiseMin, class VectorwiseOp, MatrixBase::minCoeff() 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_min_op { 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_min_op) 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a, const Scalar& b) const { using std::min; return (min)(a, b); } 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::pmin(a,b); } 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Scalar predux(const Packet& a) const 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::predux_min(a); } 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_min_op<Scalar> > { 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = NumTraits<Scalar>::AddCost, 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = packet_traits<Scalar>::HasMin 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the max of two scalars 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseBinaryOp, MatrixBase::cwiseMax, class VectorwiseOp, MatrixBase::maxCoeff() 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_max_op { 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_max_op) 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a, const Scalar& b) const { using std::max; return (max)(a, b); } 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const 132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::pmax(a,b); } 133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Scalar predux(const Packet& a) const 135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::predux_max(a); } 136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_max_op<Scalar> > { 139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = NumTraits<Scalar>::AddCost, 141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = packet_traits<Scalar>::HasMax 142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the hypot of two scalars 147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa MatrixBase::stableNorm(), class Redux 149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_hypot_op { 151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_hypot_op) 152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// typedef typename NumTraits<Scalar>::Real result_type; 153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& _x, const Scalar& _y) const 154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using std::max; 156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using std::min; 157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar p = (max)(_x, _y); 158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar q = (min)(_x, _y); 159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar qp = q/p; 160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return p * sqrt(Scalar(1) + qp*qp); 161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_hypot_op<Scalar> > { 165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess=0 }; 166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the pow of two scalars 170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, typename OtherScalar> struct scalar_binary_pow_op { 172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_binary_pow_op) 173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Scalar operator() (const Scalar& a, const OtherScalar& b) const { return internal::pow(a, b); } 174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, typename OtherScalar> 176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_binary_pow_op<Scalar,OtherScalar> > { 177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false }; 178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// other binary functors: 181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the difference of two scalars 184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseBinaryOp, MatrixBase::operator- 186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_difference_op { 188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_difference_op) 189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a, const Scalar& b) const { return a - b; } 190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const 192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::psub(a,b); } 193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_difference_op<Scalar> > { 196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = NumTraits<Scalar>::AddCost, 198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = packet_traits<Scalar>::HasSub 199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the quotient of two scalars 204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseBinaryOp, Cwise::operator/() 206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_quotient_op { 208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_quotient_op) 209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a, const Scalar& b) const { return a / b; } 210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const 212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::pdiv(a,b); } 213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_quotient_op<Scalar> > { 216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = 2 * NumTraits<Scalar>::MulCost, 218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = packet_traits<Scalar>::HasDiv 219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the and of two booleans 224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseBinaryOp, ArrayBase::operator&& 226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_boolean_and_op { 228c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_and_op) 229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE bool operator() (const bool& a, const bool& b) const { return a && b; } 230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 231c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<> struct functor_traits<scalar_boolean_and_op> { 232c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 233c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = NumTraits<bool>::AddCost, 234c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = false 235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 238c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 239c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the or of two booleans 240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseBinaryOp, ArrayBase::operator|| 242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 243c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_boolean_or_op { 244c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_or_op) 245c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE bool operator() (const bool& a, const bool& b) const { return a || b; } 246c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 247c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<> struct functor_traits<scalar_boolean_or_op> { 248c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 249c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = NumTraits<bool>::AddCost, 250c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = false 251c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 252c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 253c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 254c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// unary functors: 255c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 256c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 257c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the opposite of a scalar 258c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 259c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, MatrixBase::operator- 260c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 261c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_opposite_op { 262c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_opposite_op) 263c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return -a; } 264c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 265c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const 266c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::pnegate(a); } 267c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 268c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 269c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_opposite_op<Scalar> > 270c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { 271c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = NumTraits<Scalar>::AddCost, 272c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = packet_traits<Scalar>::HasNegate }; 273c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 274c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 275c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 276c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the absolute value of a scalar 277c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 278c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, Cwise::abs 279c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 280c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_abs_op { 281c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_abs_op) 282c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename NumTraits<Scalar>::Real result_type; 283c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a) const { return internal::abs(a); } 284c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 285c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const 286c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::pabs(a); } 287c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 288c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 289c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_abs_op<Scalar> > 290c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 291c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 292c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = NumTraits<Scalar>::AddCost, 293c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = packet_traits<Scalar>::HasAbs 294c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 295c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 296c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 297c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 298c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the squared absolute value of a scalar 299c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 300c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, Cwise::abs2 301c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 302c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_abs2_op { 303c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_abs2_op) 304c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename NumTraits<Scalar>::Real result_type; 305c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a) const { return internal::abs2(a); } 306c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 307c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const 308c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::pmul(a,a); } 309c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 310c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 311c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_abs2_op<Scalar> > 312c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasAbs2 }; }; 313c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 314c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 315c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the conjugate of a complex value 316c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 317c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, MatrixBase::conjugate() 318c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 319c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_conjugate_op { 320c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_conjugate_op) 321c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return internal::conj(a); } 322c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 323c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const { return internal::pconj(a); } 324c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 325c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 326c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_conjugate_op<Scalar> > 327c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 328c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 329c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = NumTraits<Scalar>::IsComplex ? NumTraits<Scalar>::AddCost : 0, 330c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = packet_traits<Scalar>::HasConj 331c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 332c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 333c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 334c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 335c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to cast a scalar to another type 336c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 337c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, MatrixBase::cast() 338c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 339c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, typename NewType> 340c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_cast_op { 341c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_cast_op) 342c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef NewType result_type; 343c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const NewType operator() (const Scalar& a) const { return cast<Scalar, NewType>(a); } 344c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 345c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, typename NewType> 346c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_cast_op<Scalar,NewType> > 347c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = is_same<Scalar, NewType>::value ? 0 : NumTraits<NewType>::AddCost, PacketAccess = false }; }; 348c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 349c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 350c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to extract the real part of a complex 351c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 352c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, MatrixBase::real() 353c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 354c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 355c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_real_op { 356c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_real_op) 357c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename NumTraits<Scalar>::Real result_type; 358c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return internal::real(a); } 359c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 360c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 361c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_real_op<Scalar> > 362c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 0, PacketAccess = false }; }; 363c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 364c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 365c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to extract the imaginary part of a complex 366c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 367c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, MatrixBase::imag() 368c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 369c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 370c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_imag_op { 371c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_imag_op) 372c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename NumTraits<Scalar>::Real result_type; 373c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return internal::imag(a); } 374c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 375c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 376c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_imag_op<Scalar> > 377c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 0, PacketAccess = false }; }; 378c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 379c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 380c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to extract the real part of a complex as a reference 381c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 382c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, MatrixBase::real() 383c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 384c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 385c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_real_ref_op { 386c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_real_ref_op) 387c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename NumTraits<Scalar>::Real result_type; 388c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE result_type& operator() (const Scalar& a) const { return internal::real_ref(*const_cast<Scalar*>(&a)); } 389c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 390c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 391c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_real_ref_op<Scalar> > 392c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 0, PacketAccess = false }; }; 393c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 394c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 395c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to extract the imaginary part of a complex as a reference 396c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 397c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, MatrixBase::imag() 398c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 399c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 400c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_imag_ref_op { 401c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_imag_ref_op) 402c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename NumTraits<Scalar>::Real result_type; 403c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE result_type& operator() (const Scalar& a) const { return internal::imag_ref(*const_cast<Scalar*>(&a)); } 404c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 405c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 406c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_imag_ref_op<Scalar> > 407c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 0, PacketAccess = false }; }; 408c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 409c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 410c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 411c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the exponential of a scalar 412c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 413c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, Cwise::exp() 414c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 415c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_exp_op { 416c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_exp_op) 417c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const Scalar operator() (const Scalar& a) const { return internal::exp(a); } 418c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename packet_traits<Scalar>::type Packet; 419c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Packet packetOp(const Packet& a) const { return internal::pexp(a); } 420c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 421c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 422c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_exp_op<Scalar> > 423c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasExp }; }; 424c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 425c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 426c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 427c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the logarithm of a scalar 428c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 429c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, Cwise::log() 430c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 431c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_log_op { 432c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_log_op) 433c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const Scalar operator() (const Scalar& a) const { return internal::log(a); } 434c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename packet_traits<Scalar>::type Packet; 435c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Packet packetOp(const Packet& a) const { return internal::plog(a); } 436c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 437c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 438c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_log_op<Scalar> > 439c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasLog }; }; 440c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 441c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 442c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to multiply a scalar by a fixed other one 443c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 444c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, MatrixBase::operator*, MatrixBase::operator/ 445c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 446c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/* NOTE why doing the pset1() in packetOp *is* an optimization ? 447c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * indeed it seems better to declare m_other as a Packet and do the pset1() once 448c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * in the constructor. However, in practice: 449c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * - GCC does not like m_other as a Packet and generate a load every time it needs it 450c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * - on the other hand GCC is able to moves the pset1() away the loop :) 451c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * - simpler code ;) 452c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * (ICC and gcc 4.4 seems to perform well in both cases, the issue is visible with y = a*x + b*y) 453c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 454c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 455c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_multiple_op { 456c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename packet_traits<Scalar>::type Packet; 457c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // FIXME default copy constructors seems bugged with std::complex<> 458c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE scalar_multiple_op(const scalar_multiple_op& other) : m_other(other.m_other) { } 459c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE scalar_multiple_op(const Scalar& other) : m_other(other) { } 460c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE Scalar operator() (const Scalar& a) const { return a * m_other; } 461c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const 462c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::pmul(a, pset1<Packet>(m_other)); } 463c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename add_const_on_value_type<typename NumTraits<Scalar>::Nested>::type m_other; 464c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 465c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 466c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_multiple_op<Scalar> > 467c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; }; 468c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 469c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar1, typename Scalar2> 470c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_multiple2_op { 471c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename scalar_product_traits<Scalar1,Scalar2>::ReturnType result_type; 472c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE scalar_multiple2_op(const scalar_multiple2_op& other) : m_other(other.m_other) { } 473c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE scalar_multiple2_op(const Scalar2& other) : m_other(other) { } 474c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE result_type operator() (const Scalar1& a) const { return a * m_other; } 475c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename add_const_on_value_type<typename NumTraits<Scalar2>::Nested>::type m_other; 476c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 477c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar1,typename Scalar2> 478c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_multiple2_op<Scalar1,Scalar2> > 479c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = NumTraits<Scalar1>::MulCost, PacketAccess = false }; }; 480c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 481c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, bool IsInteger> 482c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_quotient1_impl { 483c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename packet_traits<Scalar>::type Packet; 484c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // FIXME default copy constructors seems bugged with std::complex<> 485c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE scalar_quotient1_impl(const scalar_quotient1_impl& other) : m_other(other.m_other) { } 486c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE scalar_quotient1_impl(const Scalar& other) : m_other(static_cast<Scalar>(1) / other) {} 487c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE Scalar operator() (const Scalar& a) const { return a * m_other; } 488c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const 489c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::pmul(a, pset1<Packet>(m_other)); } 490c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Scalar m_other; 491c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 492c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 493c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_quotient1_impl<Scalar,false> > 494c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; }; 495c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 496c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 497c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_quotient1_impl<Scalar,true> { 498c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // FIXME default copy constructors seems bugged with std::complex<> 499c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE scalar_quotient1_impl(const scalar_quotient1_impl& other) : m_other(other.m_other) { } 500c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE scalar_quotient1_impl(const Scalar& other) : m_other(other) {} 501c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE Scalar operator() (const Scalar& a) const { return a / m_other; } 502c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename add_const_on_value_type<typename NumTraits<Scalar>::Nested>::type m_other; 503c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 504c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 505c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_quotient1_impl<Scalar,true> > 506c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 2 * NumTraits<Scalar>::MulCost, PacketAccess = false }; }; 507c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 508c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 509c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to divide a scalar by a fixed other one 510c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 511c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This functor is used to implement the quotient of a matrix by 512c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * a scalar where the scalar type is not necessarily a floating point type. 513c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 514c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, MatrixBase::operator/ 515c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 516c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 517c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_quotient1_op : scalar_quotient1_impl<Scalar, NumTraits<Scalar>::IsInteger > { 518c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE scalar_quotient1_op(const Scalar& other) 519c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : scalar_quotient1_impl<Scalar, NumTraits<Scalar>::IsInteger >(other) {} 520c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 521c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 522c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_quotient1_op<Scalar> > 523c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath: functor_traits<scalar_quotient1_impl<Scalar, NumTraits<Scalar>::IsInteger> > 524c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{}; 525c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 526c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// nullary functors 527c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 528c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 529c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_constant_op { 530c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename packet_traits<Scalar>::type Packet; 531c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE scalar_constant_op(const scalar_constant_op& other) : m_other(other.m_other) { } 532c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE scalar_constant_op(const Scalar& other) : m_other(other) { } 533c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Index> 534c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Scalar operator() (Index, Index = 0) const { return m_other; } 535c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Index> 536c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(Index, Index = 0) const { return internal::pset1<Packet>(m_other); } 537c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Scalar m_other; 538c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 539c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 540c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_constant_op<Scalar> > 541c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// FIXME replace this packet test by a safe one 542c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 1, PacketAccess = packet_traits<Scalar>::Vectorizable, IsRepeatable = true }; }; 543c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 544c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_identity_op { 545c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_identity_op) 546c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Index> 547c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Scalar operator() (Index row, Index col) const { return row==col ? Scalar(1) : Scalar(0); } 548c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 549c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 550c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_identity_op<Scalar> > 551c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = false, IsRepeatable = true }; }; 552c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 553c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename Scalar, bool RandomAccess> struct linspaced_op_impl; 554c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 555c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// linear access for packet ops: 556c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 1) initialization 557c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// base = [low, ..., low] + ([step, ..., step] * [-size, ..., 0]) 558c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 2) each step 559c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// base += [size*step, ..., size*step] 560c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename Scalar> 561c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct linspaced_op_impl<Scalar,false> 562c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 563c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename packet_traits<Scalar>::type Packet; 564c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 565c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath linspaced_op_impl(Scalar low, Scalar step) : 566c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_low(low), m_step(step), 567c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_packetStep(pset1<Packet>(packet_traits<Scalar>::size*step)), 568c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_base(padd(pset1<Packet>(low),pmul(pset1<Packet>(step),plset<Scalar>(-packet_traits<Scalar>::size)))) {} 569c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 570c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Index> 571c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Scalar operator() (Index i) const { return m_low+i*m_step; } 572c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Index> 573c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(Index) const { return m_base = padd(m_base,m_packetStep); } 574c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 575c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Scalar m_low; 576c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Scalar m_step; 577c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Packet m_packetStep; 578c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath mutable Packet m_base; 579c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 580c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 581c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// random access for packet ops: 582c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 1) each step 583c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// [low, ..., low] + ( [step, ..., step] * ( [i, ..., i] + [0, ..., size] ) ) 584c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename Scalar> 585c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct linspaced_op_impl<Scalar,true> 586c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 587c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename packet_traits<Scalar>::type Packet; 588c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 589c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath linspaced_op_impl(Scalar low, Scalar step) : 590c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_low(low), m_step(step), 591c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_lowPacket(pset1<Packet>(m_low)), m_stepPacket(pset1<Packet>(m_step)), m_interPacket(plset<Scalar>(0)) {} 592c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 593c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Index> 594c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Scalar operator() (Index i) const { return m_low+i*m_step; } 595c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 596c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Index> 597c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(Index i) const 598c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::padd(m_lowPacket, pmul(m_stepPacket, padd(pset1<Packet>(i),m_interPacket))); } 599c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 600c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Scalar m_low; 601c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Scalar m_step; 602c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Packet m_lowPacket; 603c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Packet m_stepPacket; 604c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Packet m_interPacket; 605c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 606c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 607c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// ----- Linspace functor ---------------------------------------------------------------- 608c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 609c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Forward declaration (we default to random access which does not really give 610c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// us a speed gain when using packet access but it allows to use the functor in 611c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// nested expressions). 612c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename Scalar, bool RandomAccess = true> struct linspaced_op; 613c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename Scalar, bool RandomAccess> struct functor_traits< linspaced_op<Scalar,RandomAccess> > 614c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 1, PacketAccess = packet_traits<Scalar>::HasSetLinear, IsRepeatable = true }; }; 615c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename Scalar, bool RandomAccess> struct linspaced_op 616c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 617c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename packet_traits<Scalar>::type Packet; 618c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath linspaced_op(Scalar low, Scalar high, int num_steps) : impl((num_steps==1 ? high : low), (num_steps==1 ? Scalar() : (high-low)/(num_steps-1))) {} 619c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 620c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Index> 621c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Scalar operator() (Index i) const { return impl(i); } 622c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 623c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // We need this function when assigning e.g. a RowVectorXd to a MatrixXd since 624c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // there row==0 and col is used for the actual iteration. 625c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Index> 626c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Scalar operator() (Index row, Index col) const 627c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 628c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_assert(col==0 || row==0); 629c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return impl(col + row); 630c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 631c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 632c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Index> 633c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(Index i) const { return impl.packetOp(i); } 634c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 635c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // We need this function when assigning e.g. a RowVectorXd to a MatrixXd since 636c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // there row==0 and col is used for the actual iteration. 637c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Index> 638c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(Index row, Index col) const 639c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 640c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_assert(col==0 || row==0); 641c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return impl.packetOp(col + row); 642c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 643c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 644c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // This proxy object handles the actual required temporaries, the different 645c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // implementations (random vs. sequential access) as well as the 646c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // correct piping to size 2/4 packet operations. 647c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const linspaced_op_impl<Scalar,RandomAccess> impl; 648c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 649c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 650c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// all functors allow linear access, except scalar_identity_op. So we fix here a quick meta 651c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// to indicate whether a functor allows linear access, just always answering 'yes' except for 652c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// scalar_identity_op. 653c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// FIXME move this to functor_traits adding a functor_default 654c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Functor> struct functor_has_linear_access { enum { ret = 1 }; }; 655c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct functor_has_linear_access<scalar_identity_op<Scalar> > { enum { ret = 0 }; }; 656c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 657c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// in CwiseBinaryOp, we require the Lhs and Rhs to have the same scalar type, except for multiplication 658c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// where we only require them to have the same _real_ scalar type so one may multiply, say, float by complex<float>. 659c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// FIXME move this to functor_traits adding a functor_default 660c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Functor> struct functor_allows_mixing_real_and_complex { enum { ret = 0 }; }; 661c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename LhsScalar,typename RhsScalar> struct functor_allows_mixing_real_and_complex<scalar_product_op<LhsScalar,RhsScalar> > { enum { ret = 1 }; }; 662c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename LhsScalar,typename RhsScalar> struct functor_allows_mixing_real_and_complex<scalar_conj_product_op<LhsScalar,RhsScalar> > { enum { ret = 1 }; }; 663c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 664c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 665c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 666c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to add a scalar to a fixed other one 667c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, Array::operator+ 668c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 669c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/* If you wonder why doing the pset1() in packetOp() is an optimization check scalar_multiple_op */ 670c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 671c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_add_op { 672c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename packet_traits<Scalar>::type Packet; 673c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // FIXME default copy constructors seems bugged with std::complex<> 674c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline scalar_add_op(const scalar_add_op& other) : m_other(other.m_other) { } 675c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline scalar_add_op(const Scalar& other) : m_other(other) { } 676c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Scalar operator() (const Scalar& a) const { return a + m_other; } 677c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const Packet packetOp(const Packet& a) const 678c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::padd(a, pset1<Packet>(m_other)); } 679c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Scalar m_other; 680c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 681c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 682c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_add_op<Scalar> > 683c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasAdd }; }; 684c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 685c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 686c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the square root of a scalar 687c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, Cwise::sqrt() 688c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 689c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_sqrt_op { 690c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_sqrt_op) 691c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const Scalar operator() (const Scalar& a) const { return internal::sqrt(a); } 692c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename packet_traits<Scalar>::type Packet; 693c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Packet packetOp(const Packet& a) const { return internal::psqrt(a); } 694c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 695c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 696c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_sqrt_op<Scalar> > 697c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { 698c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = 5 * NumTraits<Scalar>::MulCost, 699c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = packet_traits<Scalar>::HasSqrt 700c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 701c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 702c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 703c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 704c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the cosine of a scalar 705c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, ArrayBase::cos() 706c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 707c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_cos_op { 708c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_cos_op) 709c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Scalar operator() (const Scalar& a) const { return internal::cos(a); } 710c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename packet_traits<Scalar>::type Packet; 711c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Packet packetOp(const Packet& a) const { return internal::pcos(a); } 712c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 713c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 714c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_cos_op<Scalar> > 715c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 716c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 717c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = 5 * NumTraits<Scalar>::MulCost, 718c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = packet_traits<Scalar>::HasCos 719c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 720c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 721c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 722c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 723c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the sine of a scalar 724c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, ArrayBase::sin() 725c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 726c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_sin_op { 727c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_sin_op) 728c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const Scalar operator() (const Scalar& a) const { return internal::sin(a); } 729c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename packet_traits<Scalar>::type Packet; 730c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Packet packetOp(const Packet& a) const { return internal::psin(a); } 731c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 732c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 733c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_sin_op<Scalar> > 734c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 735c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 736c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = 5 * NumTraits<Scalar>::MulCost, 737c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = packet_traits<Scalar>::HasSin 738c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 739c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 740c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 741c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 742c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 743c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the tan of a scalar 744c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, ArrayBase::tan() 745c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 746c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_tan_op { 747c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_tan_op) 748c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const Scalar operator() (const Scalar& a) const { return internal::tan(a); } 749c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename packet_traits<Scalar>::type Packet; 750c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Packet packetOp(const Packet& a) const { return internal::ptan(a); } 751c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 752c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 753c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_tan_op<Scalar> > 754c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 755c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 756c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = 5 * NumTraits<Scalar>::MulCost, 757c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = packet_traits<Scalar>::HasTan 758c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 759c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 760c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 761c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 762c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the arc cosine of a scalar 763c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, ArrayBase::acos() 764c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 765c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_acos_op { 766c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_acos_op) 767c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const Scalar operator() (const Scalar& a) const { return internal::acos(a); } 768c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename packet_traits<Scalar>::type Packet; 769c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Packet packetOp(const Packet& a) const { return internal::pacos(a); } 770c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 771c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 772c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_acos_op<Scalar> > 773c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 774c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 775c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = 5 * NumTraits<Scalar>::MulCost, 776c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = packet_traits<Scalar>::HasACos 777c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 778c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 779c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 780c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 781c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the arc sine of a scalar 782c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, ArrayBase::asin() 783c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 784c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_asin_op { 785c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_asin_op) 786c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const Scalar operator() (const Scalar& a) const { return internal::asin(a); } 787c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename packet_traits<Scalar>::type Packet; 788c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Packet packetOp(const Packet& a) const { return internal::pasin(a); } 789c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 790c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 791c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_asin_op<Scalar> > 792c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 793c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 794c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = 5 * NumTraits<Scalar>::MulCost, 795c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = packet_traits<Scalar>::HasASin 796c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 797c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 798c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 799c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 800c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to raise a scalar to a power 801c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, Cwise::pow 802c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 803c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 804c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_pow_op { 805c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // FIXME default copy constructors seems bugged with std::complex<> 806c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline scalar_pow_op(const scalar_pow_op& other) : m_exponent(other.m_exponent) { } 807c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline scalar_pow_op(const Scalar& exponent) : m_exponent(exponent) {} 808c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Scalar operator() (const Scalar& a) const { return internal::pow(a, m_exponent); } 809c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Scalar m_exponent; 810c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 811c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 812c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_pow_op<Scalar> > 813c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false }; }; 814c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 815c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 816c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the quotient between a scalar and array entries. 817c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, Cwise::inverse() 818c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 819c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 820c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_inverse_mult_op { 821c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath scalar_inverse_mult_op(const Scalar& other) : m_other(other) {} 822c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Scalar operator() (const Scalar& a) const { return m_other / a; } 823c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 824c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const Packet packetOp(const Packet& a) const 825c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::pdiv(pset1<Packet>(m_other),a); } 826c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar m_other; 827c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 828c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 829c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 830c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the inverse of a scalar 831c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, Cwise::inverse() 832c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 833c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 834c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_inverse_op { 835c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_inverse_op) 836c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Scalar operator() (const Scalar& a) const { return Scalar(1)/a; } 837c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 838c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const Packet packetOp(const Packet& a) const 839c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::pdiv(pset1<Packet>(Scalar(1)),a); } 840c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 841c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 842c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_inverse_op<Scalar> > 843c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasDiv }; }; 844c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 845c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 846c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the square of a scalar 847c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, Cwise::square() 848c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 849c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 850c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_square_op { 851c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_square_op) 852c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Scalar operator() (const Scalar& a) const { return a*a; } 853c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 854c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const Packet packetOp(const Packet& a) const 855c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::pmul(a,a); } 856c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 857c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 858c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_square_op<Scalar> > 859c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; }; 860c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 861c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 862c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the cube of a scalar 863c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, Cwise::cube() 864c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 865c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 866c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_cube_op { 867c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_cube_op) 868c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Scalar operator() (const Scalar& a) const { return a*a*a; } 869c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 870c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const Packet packetOp(const Packet& a) const 871c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::pmul(a,pmul(a,a)); } 872c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 873c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 874c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_cube_op<Scalar> > 875c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 2*NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; }; 876c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 877c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// default functor traits for STL functors: 878c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 879c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 880c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::multiplies<T> > 881c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = NumTraits<T>::MulCost, PacketAccess = false }; }; 882c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 883c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 884c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::divides<T> > 885c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = NumTraits<T>::MulCost, PacketAccess = false }; }; 886c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 887c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 888c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::plus<T> > 889c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = NumTraits<T>::AddCost, PacketAccess = false }; }; 890c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 891c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 892c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::minus<T> > 893c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = NumTraits<T>::AddCost, PacketAccess = false }; }; 894c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 895c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 896c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::negate<T> > 897c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = NumTraits<T>::AddCost, PacketAccess = false }; }; 898c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 899c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 900c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::logical_or<T> > 901c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 1, PacketAccess = false }; }; 902c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 903c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 904c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::logical_and<T> > 905c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 1, PacketAccess = false }; }; 906c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 907c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 908c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::logical_not<T> > 909c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 1, PacketAccess = false }; }; 910c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 911c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 912c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::greater<T> > 913c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 1, PacketAccess = false }; }; 914c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 915c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 916c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::less<T> > 917c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 1, PacketAccess = false }; }; 918c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 919c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 920c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::greater_equal<T> > 921c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 1, PacketAccess = false }; }; 922c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 923c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 924c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::less_equal<T> > 925c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 1, PacketAccess = false }; }; 926c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 927c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 928c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::equal_to<T> > 929c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 1, PacketAccess = false }; }; 930c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 931c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 932c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::not_equal_to<T> > 933c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 1, PacketAccess = false }; }; 934c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 935c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 936c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::binder2nd<T> > 937c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = functor_traits<T>::Cost, PacketAccess = false }; }; 938c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 939c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 940c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::binder1st<T> > 941c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = functor_traits<T>::Cost, PacketAccess = false }; }; 942c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 943c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 944c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::unary_negate<T> > 945c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 1 + functor_traits<T>::Cost, PacketAccess = false }; }; 946c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 947c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 948c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::binary_negate<T> > 949c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 1 + functor_traits<T>::Cost, PacketAccess = false }; }; 950c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 951c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifdef EIGEN_STDEXT_SUPPORT 952c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 953c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T0,typename T1> 954c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::project1st<T0,T1> > 955c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 0, PacketAccess = false }; }; 956c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 957c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T0,typename T1> 958c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::project2nd<T0,T1> > 959c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 0, PacketAccess = false }; }; 960c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 961c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T0,typename T1> 962c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::select2nd<std::pair<T0,T1> > > 963c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 0, PacketAccess = false }; }; 964c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 965c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T0,typename T1> 966c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::select1st<std::pair<T0,T1> > > 967c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 0, PacketAccess = false }; }; 968c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 969c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T0,typename T1> 970c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::unary_compose<T0,T1> > 971c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = functor_traits<T0>::Cost + functor_traits<T1>::Cost, PacketAccess = false }; }; 972c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 973c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T0,typename T1,typename T2> 974c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::binary_compose<T0,T1,T2> > 975c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = functor_traits<T0>::Cost + functor_traits<T1>::Cost + functor_traits<T2>::Cost, PacketAccess = false }; }; 976c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 977c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_STDEXT_SUPPORT 978c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 979c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// allow to add new functors and specializations of functor_traits from outside Eigen. 980c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// this macro is really needed because functor_traits must be specialized after it is declared but before it is used... 981c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifdef EIGEN_FUNCTORS_PLUGIN 982c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include EIGEN_FUNCTORS_PLUGIN 983c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif 984c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 985c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace internal 986c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 987c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen 988c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 989c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_FUNCTORS_H 990