![]() |
Eigen
3.3.3
|
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