Eigen  3.3.3
StlFunctors.h
00001 // This file is part of Eigen, a lightweight C++ template library
00002 // for linear algebra.
00003 //
00004 // Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>
00005 //
00006 // This Source Code Form is subject to the terms of the Mozilla
00007 // Public License v. 2.0. If a copy of the MPL was not distributed
00008 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
00009 
00010 #ifndef EIGEN_STL_FUNCTORS_H
00011 #define EIGEN_STL_FUNCTORS_H
00012 
00013 namespace Eigen {
00014 
00015 namespace internal {
00016 
00017 // default functor traits for STL functors:
00018 
00019 template<typename T>
00020 struct functor_traits<std::multiplies<T> >
00021 { enum { Cost = NumTraits<T>::MulCost, PacketAccess = false }; };
00022 
00023 template<typename T>
00024 struct functor_traits<std::divides<T> >
00025 { enum { Cost = NumTraits<T>::MulCost, PacketAccess = false }; };
00026 
00027 template<typename T>
00028 struct functor_traits<std::plus<T> >
00029 { enum { Cost = NumTraits<T>::AddCost, PacketAccess = false }; };
00030 
00031 template<typename T>
00032 struct functor_traits<std::minus<T> >
00033 { enum { Cost = NumTraits<T>::AddCost, PacketAccess = false }; };
00034 
00035 template<typename T>
00036 struct functor_traits<std::negate<T> >
00037 { enum { Cost = NumTraits<T>::AddCost, PacketAccess = false }; };
00038 
00039 template<typename T>
00040 struct functor_traits<std::logical_or<T> >
00041 { enum { Cost = 1, PacketAccess = false }; };
00042 
00043 template<typename T>
00044 struct functor_traits<std::logical_and<T> >
00045 { enum { Cost = 1, PacketAccess = false }; };
00046 
00047 template<typename T>
00048 struct functor_traits<std::logical_not<T> >
00049 { enum { Cost = 1, PacketAccess = false }; };
00050 
00051 template<typename T>
00052 struct functor_traits<std::greater<T> >
00053 { enum { Cost = 1, PacketAccess = false }; };
00054 
00055 template<typename T>
00056 struct functor_traits<std::less<T> >
00057 { enum { Cost = 1, PacketAccess = false }; };
00058 
00059 template<typename T>
00060 struct functor_traits<std::greater_equal<T> >
00061 { enum { Cost = 1, PacketAccess = false }; };
00062 
00063 template<typename T>
00064 struct functor_traits<std::less_equal<T> >
00065 { enum { Cost = 1, PacketAccess = false }; };
00066 
00067 template<typename T>
00068 struct functor_traits<std::equal_to<T> >
00069 { enum { Cost = 1, PacketAccess = false }; };
00070 
00071 template<typename T>
00072 struct functor_traits<std::not_equal_to<T> >
00073 { enum { Cost = 1, PacketAccess = false }; };
00074 
00075 #if (__cplusplus < 201103L) && (EIGEN_COMP_MSVC <= 1900)
00076 // std::binder* are deprecated since c++11 and will be removed in c++17
00077 template<typename T>
00078 struct functor_traits<std::binder2nd<T> >
00079 { enum { Cost = functor_traits<T>::Cost, PacketAccess = false }; };
00080 
00081 template<typename T>
00082 struct functor_traits<std::binder1st<T> >
00083 { enum { Cost = functor_traits<T>::Cost, PacketAccess = false }; };
00084 #endif
00085 
00086 template<typename T>
00087 struct functor_traits<std::unary_negate<T> >
00088 { enum { Cost = 1 + functor_traits<T>::Cost, PacketAccess = false }; };
00089 
00090 template<typename T>
00091 struct functor_traits<std::binary_negate<T> >
00092 { enum { Cost = 1 + functor_traits<T>::Cost, PacketAccess = false }; };
00093 
00094 #ifdef EIGEN_STDEXT_SUPPORT
00095 
00096 template<typename T0,typename T1>
00097 struct functor_traits<std::project1st<T0,T1> >
00098 { enum { Cost = 0, PacketAccess = false }; };
00099 
00100 template<typename T0,typename T1>
00101 struct functor_traits<std::project2nd<T0,T1> >
00102 { enum { Cost = 0, PacketAccess = false }; };
00103 
00104 template<typename T0,typename T1>
00105 struct functor_traits<std::select2nd<std::pair<T0,T1> > >
00106 { enum { Cost = 0, PacketAccess = false }; };
00107 
00108 template<typename T0,typename T1>
00109 struct functor_traits<std::select1st<std::pair<T0,T1> > >
00110 { enum { Cost = 0, PacketAccess = false }; };
00111 
00112 template<typename T0,typename T1>
00113 struct functor_traits<std::unary_compose<T0,T1> >
00114 { enum { Cost = functor_traits<T0>::Cost + functor_traits<T1>::Cost, PacketAccess = false }; };
00115 
00116 template<typename T0,typename T1,typename T2>
00117 struct functor_traits<std::binary_compose<T0,T1,T2> >
00118 { enum { Cost = functor_traits<T0>::Cost + functor_traits<T1>::Cost + functor_traits<T2>::Cost, PacketAccess = false }; };
00119 
00120 #endif // EIGEN_STDEXT_SUPPORT
00121 
00122 // allow to add new functors and specializations of functor_traits from outside Eigen.
00123 // this macro is really needed because functor_traits must be specialized after it is declared but before it is used...
00124 #ifdef EIGEN_FUNCTORS_PLUGIN
00125 #include EIGEN_FUNCTORS_PLUGIN
00126 #endif
00127 
00128 } // end namespace internal
00129 
00130 } // end namespace Eigen
00131 
00132 #endif // EIGEN_STL_FUNCTORS_H
 All Classes Functions Variables Typedefs Enumerations Enumerator Friends