Eigen  5.0.1
 
Loading...
Searching...
No Matches
StlFunctors.h
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@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// SPDX-License-Identifier: MPL-2.0
10
11#ifndef EIGEN_STL_FUNCTORS_H
12#define EIGEN_STL_FUNCTORS_H
13
14// IWYU pragma: private
15#include "../InternalHeaderCheck.h"
16
17namespace Eigen {
18namespace internal {
19
20// default functor traits for STL functors:
21
22template <typename T>
23struct functor_traits<std::multiplies<T> > {
24 enum { Cost = NumTraits<T>::MulCost, PacketAccess = false };
25};
26
27template <typename T>
28struct functor_traits<std::divides<T> > {
29 enum { Cost = NumTraits<T>::MulCost, PacketAccess = false };
30};
31
32template <typename T>
33struct functor_traits<std::plus<T> > {
34 enum { Cost = NumTraits<T>::AddCost, PacketAccess = false };
35};
36
37template <typename T>
38struct functor_traits<std::minus<T> > {
39 enum { Cost = NumTraits<T>::AddCost, PacketAccess = false };
40};
41
42template <typename T>
43struct functor_traits<std::negate<T> > {
44 enum { Cost = NumTraits<T>::AddCost, PacketAccess = false };
45};
46
47template <typename T>
48struct functor_traits<std::logical_or<T> > {
49 enum { Cost = 1, PacketAccess = false };
50};
51
52template <typename T>
53struct functor_traits<std::logical_and<T> > {
54 enum { Cost = 1, PacketAccess = false };
55};
56
57template <typename T>
58struct functor_traits<std::logical_not<T> > {
59 enum { Cost = 1, PacketAccess = false };
60};
61
62template <typename T>
63struct functor_traits<std::greater<T> > {
64 enum { Cost = 1, PacketAccess = false };
65};
66
67template <typename T>
68struct functor_traits<std::less<T> > {
69 enum { Cost = 1, PacketAccess = false };
70};
71
72template <typename T>
73struct functor_traits<std::greater_equal<T> > {
74 enum { Cost = 1, PacketAccess = false };
75};
76
77template <typename T>
78struct functor_traits<std::less_equal<T> > {
79 enum { Cost = 1, PacketAccess = false };
80};
81
82template <typename T>
83struct functor_traits<std::equal_to<T> > {
84 enum { Cost = 1, PacketAccess = false };
85};
86
87template <typename T>
88struct functor_traits<std::not_equal_to<T> > {
89 enum { Cost = 1, PacketAccess = false };
90};
91
92#if (EIGEN_COMP_CXXVER < 17)
93// std::unary_negate is deprecated since c++17 and will be removed in c++20
94template <typename T>
95struct functor_traits<std::unary_negate<T> > {
96 enum { Cost = 1 + functor_traits<T>::Cost, PacketAccess = false };
97};
98
99// std::binary_negate is deprecated since c++17 and will be removed in c++20
100template <typename T>
101struct functor_traits<std::binary_negate<T> > {
102 enum { Cost = 1 + functor_traits<T>::Cost, PacketAccess = false };
103};
104#endif
105
106#ifdef EIGEN_STDEXT_SUPPORT
107
108template <typename T0, typename T1>
109struct functor_traits<std::project1st<T0, T1> > {
110 enum { Cost = 0, PacketAccess = false };
111};
112
113template <typename T0, typename T1>
114struct functor_traits<std::project2nd<T0, T1> > {
115 enum { Cost = 0, PacketAccess = false };
116};
117
118template <typename T0, typename T1>
119struct functor_traits<std::select2nd<std::pair<T0, T1> > > {
120 enum { Cost = 0, PacketAccess = false };
121};
122
123template <typename T0, typename T1>
124struct functor_traits<std::select1st<std::pair<T0, T1> > > {
125 enum { Cost = 0, PacketAccess = false };
126};
127
128template <typename T0, typename T1>
129struct functor_traits<std::unary_compose<T0, T1> > {
130 enum { Cost = functor_traits<T0>::Cost + functor_traits<T1>::Cost, PacketAccess = false };
131};
132
133template <typename T0, typename T1, typename T2>
134struct functor_traits<std::binary_compose<T0, T1, T2> > {
135 enum { Cost = functor_traits<T0>::Cost + functor_traits<T1>::Cost + functor_traits<T2>::Cost, PacketAccess = false };
136};
137
138#endif // EIGEN_STDEXT_SUPPORT
139
140// allow to add new functors and specializations of functor_traits from outside Eigen.
141// this macro is really needed because functor_traits must be specialized after it is declared but before it is used...
142#ifdef EIGEN_FUNCTORS_PLUGIN
143#include EIGEN_FUNCTORS_PLUGIN
144#endif
145
146} // end namespace internal
147
148} // end namespace Eigen
149
150#endif // EIGEN_STL_FUNCTORS_H