Home | History | Annotate | Download | only in functors
      1 // This file is part of Eigen, a lightweight C++ template library
      2 // for linear algebra.
      3 //
      4 // Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud (at) inria.fr>
      5 //
      6 // This Source Code Form is subject to the terms of the Mozilla
      7 // Public License v. 2.0. If a copy of the MPL was not distributed
      8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
      9 
     10 #ifndef EIGEN_STL_FUNCTORS_H
     11 #define EIGEN_STL_FUNCTORS_H
     12 
     13 namespace Eigen {
     14 
     15 namespace internal {
     16 
     17 // default functor traits for STL functors:
     18 
     19 template<typename T>
     20 struct functor_traits<std::multiplies<T> >
     21 { enum { Cost = NumTraits<T>::MulCost, PacketAccess = false }; };
     22 
     23 template<typename T>
     24 struct functor_traits<std::divides<T> >
     25 { enum { Cost = NumTraits<T>::MulCost, PacketAccess = false }; };
     26 
     27 template<typename T>
     28 struct functor_traits<std::plus<T> >
     29 { enum { Cost = NumTraits<T>::AddCost, PacketAccess = false }; };
     30 
     31 template<typename T>
     32 struct functor_traits<std::minus<T> >
     33 { enum { Cost = NumTraits<T>::AddCost, PacketAccess = false }; };
     34 
     35 template<typename T>
     36 struct functor_traits<std::negate<T> >
     37 { enum { Cost = NumTraits<T>::AddCost, PacketAccess = false }; };
     38 
     39 template<typename T>
     40 struct functor_traits<std::logical_or<T> >
     41 { enum { Cost = 1, PacketAccess = false }; };
     42 
     43 template<typename T>
     44 struct functor_traits<std::logical_and<T> >
     45 { enum { Cost = 1, PacketAccess = false }; };
     46 
     47 template<typename T>
     48 struct functor_traits<std::logical_not<T> >
     49 { enum { Cost = 1, PacketAccess = false }; };
     50 
     51 template<typename T>
     52 struct functor_traits<std::greater<T> >
     53 { enum { Cost = 1, PacketAccess = false }; };
     54 
     55 template<typename T>
     56 struct functor_traits<std::less<T> >
     57 { enum { Cost = 1, PacketAccess = false }; };
     58 
     59 template<typename T>
     60 struct functor_traits<std::greater_equal<T> >
     61 { enum { Cost = 1, PacketAccess = false }; };
     62 
     63 template<typename T>
     64 struct functor_traits<std::less_equal<T> >
     65 { enum { Cost = 1, PacketAccess = false }; };
     66 
     67 template<typename T>
     68 struct functor_traits<std::equal_to<T> >
     69 { enum { Cost = 1, PacketAccess = false }; };
     70 
     71 template<typename T>
     72 struct functor_traits<std::not_equal_to<T> >
     73 { enum { Cost = 1, PacketAccess = false }; };
     74 
     75 #if (__cplusplus < 201103L) && (EIGEN_COMP_MSVC <= 1900)
     76 // std::binder* are deprecated since c++11 and will be removed in c++17
     77 template<typename T>
     78 struct functor_traits<std::binder2nd<T> >
     79 { enum { Cost = functor_traits<T>::Cost, PacketAccess = false }; };
     80 
     81 template<typename T>
     82 struct functor_traits<std::binder1st<T> >
     83 { enum { Cost = functor_traits<T>::Cost, PacketAccess = false }; };
     84 #endif
     85 
     86 template<typename T>
     87 struct functor_traits<std::unary_negate<T> >
     88 { enum { Cost = 1 + functor_traits<T>::Cost, PacketAccess = false }; };
     89 
     90 template<typename T>
     91 struct functor_traits<std::binary_negate<T> >
     92 { enum { Cost = 1 + functor_traits<T>::Cost, PacketAccess = false }; };
     93 
     94 #ifdef EIGEN_STDEXT_SUPPORT
     95 
     96 template<typename T0,typename T1>
     97 struct functor_traits<std::project1st<T0,T1> >
     98 { enum { Cost = 0, PacketAccess = false }; };
     99 
    100 template<typename T0,typename T1>
    101 struct functor_traits<std::project2nd<T0,T1> >
    102 { enum { Cost = 0, PacketAccess = false }; };
    103 
    104 template<typename T0,typename T1>
    105 struct functor_traits<std::select2nd<std::pair<T0,T1> > >
    106 { enum { Cost = 0, PacketAccess = false }; };
    107 
    108 template<typename T0,typename T1>
    109 struct functor_traits<std::select1st<std::pair<T0,T1> > >
    110 { enum { Cost = 0, PacketAccess = false }; };
    111 
    112 template<typename T0,typename T1>
    113 struct functor_traits<std::unary_compose<T0,T1> >
    114 { enum { Cost = functor_traits<T0>::Cost + functor_traits<T1>::Cost, PacketAccess = false }; };
    115 
    116 template<typename T0,typename T1,typename T2>
    117 struct functor_traits<std::binary_compose<T0,T1,T2> >
    118 { enum { Cost = functor_traits<T0>::Cost + functor_traits<T1>::Cost + functor_traits<T2>::Cost, PacketAccess = false }; };
    119 
    120 #endif // EIGEN_STDEXT_SUPPORT
    121 
    122 // allow to add new functors and specializations of functor_traits from outside Eigen.
    123 // this macro is really needed because functor_traits must be specialized after it is declared but before it is used...
    124 #ifdef EIGEN_FUNCTORS_PLUGIN
    125 #include EIGEN_FUNCTORS_PLUGIN
    126 #endif
    127 
    128 } // end namespace internal
    129 
    130 } // end namespace Eigen
    131 
    132 #endif // EIGEN_STL_FUNCTORS_H
    133