For obj-c stage-final re-use the checksum from the previous stage
[official-gcc.git] / libstdc++-v3 / include / bits / stl_function.h
blob073018d522d7d5f9f9bed3ac8381b7935ab5c72e
1 // Functor implementations -*- C++ -*-
3 // Copyright (C) 2001-2021 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library. This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
9 // any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // Under Section 7 of GPL version 3, you are granted additional
17 // permissions described in the GCC Runtime Library Exception, version
18 // 3.1, as published by the Free Software Foundation.
20 // You should have received a copy of the GNU General Public License and
21 // a copy of the GCC Runtime Library Exception along with this program;
22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 // <http://www.gnu.org/licenses/>.
27 * Copyright (c) 1994
28 * Hewlett-Packard Company
30 * Permission to use, copy, modify, distribute and sell this software
31 * and its documentation for any purpose is hereby granted without fee,
32 * provided that the above copyright notice appear in all copies and
33 * that both that copyright notice and this permission notice appear
34 * in supporting documentation. Hewlett-Packard Company makes no
35 * representations about the suitability of this software for any
36 * purpose. It is provided "as is" without express or implied warranty.
39 * Copyright (c) 1996-1998
40 * Silicon Graphics Computer Systems, Inc.
42 * Permission to use, copy, modify, distribute and sell this software
43 * and its documentation for any purpose is hereby granted without fee,
44 * provided that the above copyright notice appear in all copies and
45 * that both that copyright notice and this permission notice appear
46 * in supporting documentation. Silicon Graphics makes no
47 * representations about the suitability of this software for any
48 * purpose. It is provided "as is" without express or implied warranty.
51 /** @file bits/stl_function.h
52 * This is an internal header file, included by other library headers.
53 * Do not attempt to use it directly. @headername{functional}
56 #ifndef _STL_FUNCTION_H
57 #define _STL_FUNCTION_H 1
59 #if __cplusplus > 201103L
60 #include <bits/move.h>
61 #endif
63 namespace std _GLIBCXX_VISIBILITY(default)
65 _GLIBCXX_BEGIN_NAMESPACE_VERSION
67 // 20.3.1 base classes
68 /** @defgroup functors Function Objects
69 * @ingroup utilities
71 * Function objects, or @e functors, are objects with an @c operator()
72 * defined and accessible. They can be passed as arguments to algorithm
73 * templates and used in place of a function pointer. Not only is the
74 * resulting expressiveness of the library increased, but the generated
75 * code can be more efficient than what you might write by hand. When we
76 * refer to @a functors, then, generally we include function pointers in
77 * the description as well.
79 * Often, functors are only created as temporaries passed to algorithm
80 * calls, rather than being created as named variables.
82 * Two examples taken from the standard itself follow. To perform a
83 * by-element addition of two vectors @c a and @c b containing @c double,
84 * and put the result in @c a, use
85 * \code
86 * transform (a.begin(), a.end(), b.begin(), a.begin(), plus<double>());
87 * \endcode
88 * To negate every element in @c a, use
89 * \code
90 * transform(a.begin(), a.end(), a.begin(), negate<double>());
91 * \endcode
92 * The addition and negation functions will be inlined directly.
94 * The standard functors are derived from structs named @c unary_function
95 * and @c binary_function. These two classes contain nothing but typedefs,
96 * to aid in generic (template) programming. If you write your own
97 * functors, you might consider doing the same.
99 * @{
102 * This is one of the @link functors functor base classes@endlink.
104 template<typename _Arg, typename _Result>
105 struct unary_function
107 /// @c argument_type is the type of the argument
108 typedef _Arg argument_type;
110 /// @c result_type is the return type
111 typedef _Result result_type;
115 * This is one of the @link functors functor base classes@endlink.
117 template<typename _Arg1, typename _Arg2, typename _Result>
118 struct binary_function
120 /// @c first_argument_type is the type of the first argument
121 typedef _Arg1 first_argument_type;
123 /// @c second_argument_type is the type of the second argument
124 typedef _Arg2 second_argument_type;
126 /// @c result_type is the return type
127 typedef _Result result_type;
129 /** @} */
131 // 20.3.2 arithmetic
132 /** @defgroup arithmetic_functors Arithmetic Classes
133 * @ingroup functors
135 * Because basic math often needs to be done during an algorithm,
136 * the library provides functors for those operations. See the
137 * documentation for @link functors the base classes@endlink
138 * for examples of their use.
140 * @{
143 #if __cplusplus > 201103L
144 struct __is_transparent; // undefined
146 template<typename _Tp = void>
147 struct plus;
149 template<typename _Tp = void>
150 struct minus;
152 template<typename _Tp = void>
153 struct multiplies;
155 template<typename _Tp = void>
156 struct divides;
158 template<typename _Tp = void>
159 struct modulus;
161 template<typename _Tp = void>
162 struct negate;
163 #endif
165 /// One of the @link arithmetic_functors math functors@endlink.
166 template<typename _Tp>
167 struct plus : public binary_function<_Tp, _Tp, _Tp>
169 _GLIBCXX14_CONSTEXPR
171 operator()(const _Tp& __x, const _Tp& __y) const
172 { return __x + __y; }
175 /// One of the @link arithmetic_functors math functors@endlink.
176 template<typename _Tp>
177 struct minus : public binary_function<_Tp, _Tp, _Tp>
179 _GLIBCXX14_CONSTEXPR
181 operator()(const _Tp& __x, const _Tp& __y) const
182 { return __x - __y; }
185 /// One of the @link arithmetic_functors math functors@endlink.
186 template<typename _Tp>
187 struct multiplies : public binary_function<_Tp, _Tp, _Tp>
189 _GLIBCXX14_CONSTEXPR
191 operator()(const _Tp& __x, const _Tp& __y) const
192 { return __x * __y; }
195 /// One of the @link arithmetic_functors math functors@endlink.
196 template<typename _Tp>
197 struct divides : public binary_function<_Tp, _Tp, _Tp>
199 _GLIBCXX14_CONSTEXPR
201 operator()(const _Tp& __x, const _Tp& __y) const
202 { return __x / __y; }
205 /// One of the @link arithmetic_functors math functors@endlink.
206 template<typename _Tp>
207 struct modulus : public binary_function<_Tp, _Tp, _Tp>
209 _GLIBCXX14_CONSTEXPR
211 operator()(const _Tp& __x, const _Tp& __y) const
212 { return __x % __y; }
215 /// One of the @link arithmetic_functors math functors@endlink.
216 template<typename _Tp>
217 struct negate : public unary_function<_Tp, _Tp>
219 _GLIBCXX14_CONSTEXPR
221 operator()(const _Tp& __x) const
222 { return -__x; }
225 #if __cplusplus > 201103L
227 #define __cpp_lib_transparent_operators 201510
229 template<>
230 struct plus<void>
232 template <typename _Tp, typename _Up>
233 _GLIBCXX14_CONSTEXPR
234 auto
235 operator()(_Tp&& __t, _Up&& __u) const
236 noexcept(noexcept(std::forward<_Tp>(__t) + std::forward<_Up>(__u)))
237 -> decltype(std::forward<_Tp>(__t) + std::forward<_Up>(__u))
238 { return std::forward<_Tp>(__t) + std::forward<_Up>(__u); }
240 typedef __is_transparent is_transparent;
243 /// One of the @link arithmetic_functors math functors@endlink.
244 template<>
245 struct minus<void>
247 template <typename _Tp, typename _Up>
248 _GLIBCXX14_CONSTEXPR
249 auto
250 operator()(_Tp&& __t, _Up&& __u) const
251 noexcept(noexcept(std::forward<_Tp>(__t) - std::forward<_Up>(__u)))
252 -> decltype(std::forward<_Tp>(__t) - std::forward<_Up>(__u))
253 { return std::forward<_Tp>(__t) - std::forward<_Up>(__u); }
255 typedef __is_transparent is_transparent;
258 /// One of the @link arithmetic_functors math functors@endlink.
259 template<>
260 struct multiplies<void>
262 template <typename _Tp, typename _Up>
263 _GLIBCXX14_CONSTEXPR
264 auto
265 operator()(_Tp&& __t, _Up&& __u) const
266 noexcept(noexcept(std::forward<_Tp>(__t) * std::forward<_Up>(__u)))
267 -> decltype(std::forward<_Tp>(__t) * std::forward<_Up>(__u))
268 { return std::forward<_Tp>(__t) * std::forward<_Up>(__u); }
270 typedef __is_transparent is_transparent;
273 /// One of the @link arithmetic_functors math functors@endlink.
274 template<>
275 struct divides<void>
277 template <typename _Tp, typename _Up>
278 _GLIBCXX14_CONSTEXPR
279 auto
280 operator()(_Tp&& __t, _Up&& __u) const
281 noexcept(noexcept(std::forward<_Tp>(__t) / std::forward<_Up>(__u)))
282 -> decltype(std::forward<_Tp>(__t) / std::forward<_Up>(__u))
283 { return std::forward<_Tp>(__t) / std::forward<_Up>(__u); }
285 typedef __is_transparent is_transparent;
288 /// One of the @link arithmetic_functors math functors@endlink.
289 template<>
290 struct modulus<void>
292 template <typename _Tp, typename _Up>
293 _GLIBCXX14_CONSTEXPR
294 auto
295 operator()(_Tp&& __t, _Up&& __u) const
296 noexcept(noexcept(std::forward<_Tp>(__t) % std::forward<_Up>(__u)))
297 -> decltype(std::forward<_Tp>(__t) % std::forward<_Up>(__u))
298 { return std::forward<_Tp>(__t) % std::forward<_Up>(__u); }
300 typedef __is_transparent is_transparent;
303 /// One of the @link arithmetic_functors math functors@endlink.
304 template<>
305 struct negate<void>
307 template <typename _Tp>
308 _GLIBCXX14_CONSTEXPR
309 auto
310 operator()(_Tp&& __t) const
311 noexcept(noexcept(-std::forward<_Tp>(__t)))
312 -> decltype(-std::forward<_Tp>(__t))
313 { return -std::forward<_Tp>(__t); }
315 typedef __is_transparent is_transparent;
317 #endif
318 /** @} */
320 // 20.3.3 comparisons
321 /** @defgroup comparison_functors Comparison Classes
322 * @ingroup functors
324 * The library provides six wrapper functors for all the basic comparisons
325 * in C++, like @c <.
327 * @{
329 #if __cplusplus > 201103L
330 template<typename _Tp = void>
331 struct equal_to;
333 template<typename _Tp = void>
334 struct not_equal_to;
336 template<typename _Tp = void>
337 struct greater;
339 template<typename _Tp = void>
340 struct less;
342 template<typename _Tp = void>
343 struct greater_equal;
345 template<typename _Tp = void>
346 struct less_equal;
347 #endif
349 /// One of the @link comparison_functors comparison functors@endlink.
350 template<typename _Tp>
351 struct equal_to : public binary_function<_Tp, _Tp, bool>
353 _GLIBCXX14_CONSTEXPR
354 bool
355 operator()(const _Tp& __x, const _Tp& __y) const
356 { return __x == __y; }
359 /// One of the @link comparison_functors comparison functors@endlink.
360 template<typename _Tp>
361 struct not_equal_to : public binary_function<_Tp, _Tp, bool>
363 _GLIBCXX14_CONSTEXPR
364 bool
365 operator()(const _Tp& __x, const _Tp& __y) const
366 { return __x != __y; }
369 /// One of the @link comparison_functors comparison functors@endlink.
370 template<typename _Tp>
371 struct greater : public binary_function<_Tp, _Tp, bool>
373 _GLIBCXX14_CONSTEXPR
374 bool
375 operator()(const _Tp& __x, const _Tp& __y) const
376 { return __x > __y; }
379 /// One of the @link comparison_functors comparison functors@endlink.
380 template<typename _Tp>
381 struct less : public binary_function<_Tp, _Tp, bool>
383 _GLIBCXX14_CONSTEXPR
384 bool
385 operator()(const _Tp& __x, const _Tp& __y) const
386 { return __x < __y; }
389 /// One of the @link comparison_functors comparison functors@endlink.
390 template<typename _Tp>
391 struct greater_equal : public binary_function<_Tp, _Tp, bool>
393 _GLIBCXX14_CONSTEXPR
394 bool
395 operator()(const _Tp& __x, const _Tp& __y) const
396 { return __x >= __y; }
399 /// One of the @link comparison_functors comparison functors@endlink.
400 template<typename _Tp>
401 struct less_equal : public binary_function<_Tp, _Tp, bool>
403 _GLIBCXX14_CONSTEXPR
404 bool
405 operator()(const _Tp& __x, const _Tp& __y) const
406 { return __x <= __y; }
409 // Partial specialization of std::greater for pointers.
410 template<typename _Tp>
411 struct greater<_Tp*> : public binary_function<_Tp*, _Tp*, bool>
413 _GLIBCXX14_CONSTEXPR bool
414 operator()(_Tp* __x, _Tp* __y) const _GLIBCXX_NOTHROW
416 #if __cplusplus >= 201402L
417 #ifdef _GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED
418 if (__builtin_is_constant_evaluated())
419 #else
420 if (__builtin_constant_p(__x > __y))
421 #endif
422 return __x > __y;
423 #endif
424 return (__UINTPTR_TYPE__)__x > (__UINTPTR_TYPE__)__y;
428 // Partial specialization of std::less for pointers.
429 template<typename _Tp>
430 struct less<_Tp*> : public binary_function<_Tp*, _Tp*, bool>
432 _GLIBCXX14_CONSTEXPR bool
433 operator()(_Tp* __x, _Tp* __y) const _GLIBCXX_NOTHROW
435 #if __cplusplus >= 201402L
436 #ifdef _GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED
437 if (__builtin_is_constant_evaluated())
438 #else
439 if (__builtin_constant_p(__x < __y))
440 #endif
441 return __x < __y;
442 #endif
443 return (__UINTPTR_TYPE__)__x < (__UINTPTR_TYPE__)__y;
447 // Partial specialization of std::greater_equal for pointers.
448 template<typename _Tp>
449 struct greater_equal<_Tp*> : public binary_function<_Tp*, _Tp*, bool>
451 _GLIBCXX14_CONSTEXPR bool
452 operator()(_Tp* __x, _Tp* __y) const _GLIBCXX_NOTHROW
454 #if __cplusplus >= 201402L
455 #ifdef _GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED
456 if (__builtin_is_constant_evaluated())
457 #else
458 if (__builtin_constant_p(__x >= __y))
459 #endif
460 return __x >= __y;
461 #endif
462 return (__UINTPTR_TYPE__)__x >= (__UINTPTR_TYPE__)__y;
466 // Partial specialization of std::less_equal for pointers.
467 template<typename _Tp>
468 struct less_equal<_Tp*> : public binary_function<_Tp*, _Tp*, bool>
470 _GLIBCXX14_CONSTEXPR bool
471 operator()(_Tp* __x, _Tp* __y) const _GLIBCXX_NOTHROW
473 #if __cplusplus >= 201402L
474 #ifdef _GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED
475 if (__builtin_is_constant_evaluated())
476 #else
477 if (__builtin_constant_p(__x <= __y))
478 #endif
479 return __x <= __y;
480 #endif
481 return (__UINTPTR_TYPE__)__x <= (__UINTPTR_TYPE__)__y;
485 #if __cplusplus >= 201402L
486 /// One of the @link comparison_functors comparison functors@endlink.
487 template<>
488 struct equal_to<void>
490 template <typename _Tp, typename _Up>
491 constexpr auto
492 operator()(_Tp&& __t, _Up&& __u) const
493 noexcept(noexcept(std::forward<_Tp>(__t) == std::forward<_Up>(__u)))
494 -> decltype(std::forward<_Tp>(__t) == std::forward<_Up>(__u))
495 { return std::forward<_Tp>(__t) == std::forward<_Up>(__u); }
497 typedef __is_transparent is_transparent;
500 /// One of the @link comparison_functors comparison functors@endlink.
501 template<>
502 struct not_equal_to<void>
504 template <typename _Tp, typename _Up>
505 constexpr auto
506 operator()(_Tp&& __t, _Up&& __u) const
507 noexcept(noexcept(std::forward<_Tp>(__t) != std::forward<_Up>(__u)))
508 -> decltype(std::forward<_Tp>(__t) != std::forward<_Up>(__u))
509 { return std::forward<_Tp>(__t) != std::forward<_Up>(__u); }
511 typedef __is_transparent is_transparent;
514 /// One of the @link comparison_functors comparison functors@endlink.
515 template<>
516 struct greater<void>
518 template <typename _Tp, typename _Up>
519 constexpr auto
520 operator()(_Tp&& __t, _Up&& __u) const
521 noexcept(noexcept(std::forward<_Tp>(__t) > std::forward<_Up>(__u)))
522 -> decltype(std::forward<_Tp>(__t) > std::forward<_Up>(__u))
524 return _S_cmp(std::forward<_Tp>(__t), std::forward<_Up>(__u),
525 __ptr_cmp<_Tp, _Up>{});
528 template<typename _Tp, typename _Up>
529 constexpr bool
530 operator()(_Tp* __t, _Up* __u) const noexcept
531 { return greater<common_type_t<_Tp*, _Up*>>{}(__t, __u); }
533 typedef __is_transparent is_transparent;
535 private:
536 template <typename _Tp, typename _Up>
537 static constexpr decltype(auto)
538 _S_cmp(_Tp&& __t, _Up&& __u, false_type)
539 { return std::forward<_Tp>(__t) > std::forward<_Up>(__u); }
541 template <typename _Tp, typename _Up>
542 static constexpr bool
543 _S_cmp(_Tp&& __t, _Up&& __u, true_type) noexcept
545 return greater<const volatile void*>{}(
546 static_cast<const volatile void*>(std::forward<_Tp>(__t)),
547 static_cast<const volatile void*>(std::forward<_Up>(__u)));
550 // True if there is no viable operator> member function.
551 template<typename _Tp, typename _Up, typename = void>
552 struct __not_overloaded2 : true_type { };
554 // False if we can call T.operator>(U)
555 template<typename _Tp, typename _Up>
556 struct __not_overloaded2<_Tp, _Up, __void_t<
557 decltype(std::declval<_Tp>().operator>(std::declval<_Up>()))>>
558 : false_type { };
560 // True if there is no overloaded operator> for these operands.
561 template<typename _Tp, typename _Up, typename = void>
562 struct __not_overloaded : __not_overloaded2<_Tp, _Up> { };
564 // False if we can call operator>(T,U)
565 template<typename _Tp, typename _Up>
566 struct __not_overloaded<_Tp, _Up, __void_t<
567 decltype(operator>(std::declval<_Tp>(), std::declval<_Up>()))>>
568 : false_type { };
570 template<typename _Tp, typename _Up>
571 using __ptr_cmp = __and_<__not_overloaded<_Tp, _Up>,
572 is_convertible<_Tp, const volatile void*>,
573 is_convertible<_Up, const volatile void*>>;
576 /// One of the @link comparison_functors comparison functors@endlink.
577 template<>
578 struct less<void>
580 template <typename _Tp, typename _Up>
581 constexpr auto
582 operator()(_Tp&& __t, _Up&& __u) const
583 noexcept(noexcept(std::forward<_Tp>(__t) < std::forward<_Up>(__u)))
584 -> decltype(std::forward<_Tp>(__t) < std::forward<_Up>(__u))
586 return _S_cmp(std::forward<_Tp>(__t), std::forward<_Up>(__u),
587 __ptr_cmp<_Tp, _Up>{});
590 template<typename _Tp, typename _Up>
591 constexpr bool
592 operator()(_Tp* __t, _Up* __u) const noexcept
593 { return less<common_type_t<_Tp*, _Up*>>{}(__t, __u); }
595 typedef __is_transparent is_transparent;
597 private:
598 template <typename _Tp, typename _Up>
599 static constexpr decltype(auto)
600 _S_cmp(_Tp&& __t, _Up&& __u, false_type)
601 { return std::forward<_Tp>(__t) < std::forward<_Up>(__u); }
603 template <typename _Tp, typename _Up>
604 static constexpr bool
605 _S_cmp(_Tp&& __t, _Up&& __u, true_type) noexcept
607 return less<const volatile void*>{}(
608 static_cast<const volatile void*>(std::forward<_Tp>(__t)),
609 static_cast<const volatile void*>(std::forward<_Up>(__u)));
612 // True if there is no viable operator< member function.
613 template<typename _Tp, typename _Up, typename = void>
614 struct __not_overloaded2 : true_type { };
616 // False if we can call T.operator<(U)
617 template<typename _Tp, typename _Up>
618 struct __not_overloaded2<_Tp, _Up, __void_t<
619 decltype(std::declval<_Tp>().operator<(std::declval<_Up>()))>>
620 : false_type { };
622 // True if there is no overloaded operator< for these operands.
623 template<typename _Tp, typename _Up, typename = void>
624 struct __not_overloaded : __not_overloaded2<_Tp, _Up> { };
626 // False if we can call operator<(T,U)
627 template<typename _Tp, typename _Up>
628 struct __not_overloaded<_Tp, _Up, __void_t<
629 decltype(operator<(std::declval<_Tp>(), std::declval<_Up>()))>>
630 : false_type { };
632 template<typename _Tp, typename _Up>
633 using __ptr_cmp = __and_<__not_overloaded<_Tp, _Up>,
634 is_convertible<_Tp, const volatile void*>,
635 is_convertible<_Up, const volatile void*>>;
638 /// One of the @link comparison_functors comparison functors@endlink.
639 template<>
640 struct greater_equal<void>
642 template <typename _Tp, typename _Up>
643 constexpr auto
644 operator()(_Tp&& __t, _Up&& __u) const
645 noexcept(noexcept(std::forward<_Tp>(__t) >= std::forward<_Up>(__u)))
646 -> decltype(std::forward<_Tp>(__t) >= std::forward<_Up>(__u))
648 return _S_cmp(std::forward<_Tp>(__t), std::forward<_Up>(__u),
649 __ptr_cmp<_Tp, _Up>{});
652 template<typename _Tp, typename _Up>
653 constexpr bool
654 operator()(_Tp* __t, _Up* __u) const noexcept
655 { return greater_equal<common_type_t<_Tp*, _Up*>>{}(__t, __u); }
657 typedef __is_transparent is_transparent;
659 private:
660 template <typename _Tp, typename _Up>
661 static constexpr decltype(auto)
662 _S_cmp(_Tp&& __t, _Up&& __u, false_type)
663 { return std::forward<_Tp>(__t) >= std::forward<_Up>(__u); }
665 template <typename _Tp, typename _Up>
666 static constexpr bool
667 _S_cmp(_Tp&& __t, _Up&& __u, true_type) noexcept
669 return greater_equal<const volatile void*>{}(
670 static_cast<const volatile void*>(std::forward<_Tp>(__t)),
671 static_cast<const volatile void*>(std::forward<_Up>(__u)));
674 // True if there is no viable operator>= member function.
675 template<typename _Tp, typename _Up, typename = void>
676 struct __not_overloaded2 : true_type { };
678 // False if we can call T.operator>=(U)
679 template<typename _Tp, typename _Up>
680 struct __not_overloaded2<_Tp, _Up, __void_t<
681 decltype(std::declval<_Tp>().operator>=(std::declval<_Up>()))>>
682 : false_type { };
684 // True if there is no overloaded operator>= for these operands.
685 template<typename _Tp, typename _Up, typename = void>
686 struct __not_overloaded : __not_overloaded2<_Tp, _Up> { };
688 // False if we can call operator>=(T,U)
689 template<typename _Tp, typename _Up>
690 struct __not_overloaded<_Tp, _Up, __void_t<
691 decltype(operator>=(std::declval<_Tp>(), std::declval<_Up>()))>>
692 : false_type { };
694 template<typename _Tp, typename _Up>
695 using __ptr_cmp = __and_<__not_overloaded<_Tp, _Up>,
696 is_convertible<_Tp, const volatile void*>,
697 is_convertible<_Up, const volatile void*>>;
700 /// One of the @link comparison_functors comparison functors@endlink.
701 template<>
702 struct less_equal<void>
704 template <typename _Tp, typename _Up>
705 constexpr auto
706 operator()(_Tp&& __t, _Up&& __u) const
707 noexcept(noexcept(std::forward<_Tp>(__t) <= std::forward<_Up>(__u)))
708 -> decltype(std::forward<_Tp>(__t) <= std::forward<_Up>(__u))
710 return _S_cmp(std::forward<_Tp>(__t), std::forward<_Up>(__u),
711 __ptr_cmp<_Tp, _Up>{});
714 template<typename _Tp, typename _Up>
715 constexpr bool
716 operator()(_Tp* __t, _Up* __u) const noexcept
717 { return less_equal<common_type_t<_Tp*, _Up*>>{}(__t, __u); }
719 typedef __is_transparent is_transparent;
721 private:
722 template <typename _Tp, typename _Up>
723 static constexpr decltype(auto)
724 _S_cmp(_Tp&& __t, _Up&& __u, false_type)
725 { return std::forward<_Tp>(__t) <= std::forward<_Up>(__u); }
727 template <typename _Tp, typename _Up>
728 static constexpr bool
729 _S_cmp(_Tp&& __t, _Up&& __u, true_type) noexcept
731 return less_equal<const volatile void*>{}(
732 static_cast<const volatile void*>(std::forward<_Tp>(__t)),
733 static_cast<const volatile void*>(std::forward<_Up>(__u)));
736 // True if there is no viable operator<= member function.
737 template<typename _Tp, typename _Up, typename = void>
738 struct __not_overloaded2 : true_type { };
740 // False if we can call T.operator<=(U)
741 template<typename _Tp, typename _Up>
742 struct __not_overloaded2<_Tp, _Up, __void_t<
743 decltype(std::declval<_Tp>().operator<=(std::declval<_Up>()))>>
744 : false_type { };
746 // True if there is no overloaded operator<= for these operands.
747 template<typename _Tp, typename _Up, typename = void>
748 struct __not_overloaded : __not_overloaded2<_Tp, _Up> { };
750 // False if we can call operator<=(T,U)
751 template<typename _Tp, typename _Up>
752 struct __not_overloaded<_Tp, _Up, __void_t<
753 decltype(operator<=(std::declval<_Tp>(), std::declval<_Up>()))>>
754 : false_type { };
756 template<typename _Tp, typename _Up>
757 using __ptr_cmp = __and_<__not_overloaded<_Tp, _Up>,
758 is_convertible<_Tp, const volatile void*>,
759 is_convertible<_Up, const volatile void*>>;
761 #endif // C++14
762 /** @} */
764 // 20.3.4 logical operations
765 /** @defgroup logical_functors Boolean Operations Classes
766 * @ingroup functors
768 * Here are wrapper functors for Boolean operations: @c &&, @c ||,
769 * and @c !.
771 * @{
773 #if __cplusplus > 201103L
774 template<typename _Tp = void>
775 struct logical_and;
777 template<typename _Tp = void>
778 struct logical_or;
780 template<typename _Tp = void>
781 struct logical_not;
782 #endif
784 /// One of the @link logical_functors Boolean operations functors@endlink.
785 template<typename _Tp>
786 struct logical_and : public binary_function<_Tp, _Tp, bool>
788 _GLIBCXX14_CONSTEXPR
789 bool
790 operator()(const _Tp& __x, const _Tp& __y) const
791 { return __x && __y; }
794 /// One of the @link logical_functors Boolean operations functors@endlink.
795 template<typename _Tp>
796 struct logical_or : public binary_function<_Tp, _Tp, bool>
798 _GLIBCXX14_CONSTEXPR
799 bool
800 operator()(const _Tp& __x, const _Tp& __y) const
801 { return __x || __y; }
804 /// One of the @link logical_functors Boolean operations functors@endlink.
805 template<typename _Tp>
806 struct logical_not : public unary_function<_Tp, bool>
808 _GLIBCXX14_CONSTEXPR
809 bool
810 operator()(const _Tp& __x) const
811 { return !__x; }
814 #if __cplusplus > 201103L
815 /// One of the @link logical_functors Boolean operations functors@endlink.
816 template<>
817 struct logical_and<void>
819 template <typename _Tp, typename _Up>
820 _GLIBCXX14_CONSTEXPR
821 auto
822 operator()(_Tp&& __t, _Up&& __u) const
823 noexcept(noexcept(std::forward<_Tp>(__t) && std::forward<_Up>(__u)))
824 -> decltype(std::forward<_Tp>(__t) && std::forward<_Up>(__u))
825 { return std::forward<_Tp>(__t) && std::forward<_Up>(__u); }
827 typedef __is_transparent is_transparent;
830 /// One of the @link logical_functors Boolean operations functors@endlink.
831 template<>
832 struct logical_or<void>
834 template <typename _Tp, typename _Up>
835 _GLIBCXX14_CONSTEXPR
836 auto
837 operator()(_Tp&& __t, _Up&& __u) const
838 noexcept(noexcept(std::forward<_Tp>(__t) || std::forward<_Up>(__u)))
839 -> decltype(std::forward<_Tp>(__t) || std::forward<_Up>(__u))
840 { return std::forward<_Tp>(__t) || std::forward<_Up>(__u); }
842 typedef __is_transparent is_transparent;
845 /// One of the @link logical_functors Boolean operations functors@endlink.
846 template<>
847 struct logical_not<void>
849 template <typename _Tp>
850 _GLIBCXX14_CONSTEXPR
851 auto
852 operator()(_Tp&& __t) const
853 noexcept(noexcept(!std::forward<_Tp>(__t)))
854 -> decltype(!std::forward<_Tp>(__t))
855 { return !std::forward<_Tp>(__t); }
857 typedef __is_transparent is_transparent;
859 #endif
860 /** @} */
862 #if __cplusplus > 201103L
863 template<typename _Tp = void>
864 struct bit_and;
866 template<typename _Tp = void>
867 struct bit_or;
869 template<typename _Tp = void>
870 struct bit_xor;
872 template<typename _Tp = void>
873 struct bit_not;
874 #endif
876 // _GLIBCXX_RESOLVE_LIB_DEFECTS
877 // DR 660. Missing Bitwise Operations.
878 template<typename _Tp>
879 struct bit_and : public binary_function<_Tp, _Tp, _Tp>
881 _GLIBCXX14_CONSTEXPR
883 operator()(const _Tp& __x, const _Tp& __y) const
884 { return __x & __y; }
887 template<typename _Tp>
888 struct bit_or : public binary_function<_Tp, _Tp, _Tp>
890 _GLIBCXX14_CONSTEXPR
892 operator()(const _Tp& __x, const _Tp& __y) const
893 { return __x | __y; }
896 template<typename _Tp>
897 struct bit_xor : public binary_function<_Tp, _Tp, _Tp>
899 _GLIBCXX14_CONSTEXPR
901 operator()(const _Tp& __x, const _Tp& __y) const
902 { return __x ^ __y; }
905 template<typename _Tp>
906 struct bit_not : public unary_function<_Tp, _Tp>
908 _GLIBCXX14_CONSTEXPR
910 operator()(const _Tp& __x) const
911 { return ~__x; }
914 #if __cplusplus > 201103L
915 template <>
916 struct bit_and<void>
918 template <typename _Tp, typename _Up>
919 _GLIBCXX14_CONSTEXPR
920 auto
921 operator()(_Tp&& __t, _Up&& __u) const
922 noexcept(noexcept(std::forward<_Tp>(__t) & std::forward<_Up>(__u)))
923 -> decltype(std::forward<_Tp>(__t) & std::forward<_Up>(__u))
924 { return std::forward<_Tp>(__t) & std::forward<_Up>(__u); }
926 typedef __is_transparent is_transparent;
929 template <>
930 struct bit_or<void>
932 template <typename _Tp, typename _Up>
933 _GLIBCXX14_CONSTEXPR
934 auto
935 operator()(_Tp&& __t, _Up&& __u) const
936 noexcept(noexcept(std::forward<_Tp>(__t) | std::forward<_Up>(__u)))
937 -> decltype(std::forward<_Tp>(__t) | std::forward<_Up>(__u))
938 { return std::forward<_Tp>(__t) | std::forward<_Up>(__u); }
940 typedef __is_transparent is_transparent;
943 template <>
944 struct bit_xor<void>
946 template <typename _Tp, typename _Up>
947 _GLIBCXX14_CONSTEXPR
948 auto
949 operator()(_Tp&& __t, _Up&& __u) const
950 noexcept(noexcept(std::forward<_Tp>(__t) ^ std::forward<_Up>(__u)))
951 -> decltype(std::forward<_Tp>(__t) ^ std::forward<_Up>(__u))
952 { return std::forward<_Tp>(__t) ^ std::forward<_Up>(__u); }
954 typedef __is_transparent is_transparent;
957 template <>
958 struct bit_not<void>
960 template <typename _Tp>
961 _GLIBCXX14_CONSTEXPR
962 auto
963 operator()(_Tp&& __t) const
964 noexcept(noexcept(~std::forward<_Tp>(__t)))
965 -> decltype(~std::forward<_Tp>(__t))
966 { return ~std::forward<_Tp>(__t); }
968 typedef __is_transparent is_transparent;
970 #endif
972 // 20.3.5 negators
973 /** @defgroup negators Negators
974 * @ingroup functors
976 * The functions @c not1 and @c not2 each take a predicate functor
977 * and return an instance of @c unary_negate or
978 * @c binary_negate, respectively. These classes are functors whose
979 * @c operator() performs the stored predicate function and then returns
980 * the negation of the result.
982 * For example, given a vector of integers and a trivial predicate,
983 * \code
984 * struct IntGreaterThanThree
985 * : public std::unary_function<int, bool>
987 * bool operator() (int x) { return x > 3; }
988 * };
990 * std::find_if (v.begin(), v.end(), not1(IntGreaterThanThree()));
991 * \endcode
992 * The call to @c find_if will locate the first index (i) of @c v for which
993 * <code>!(v[i] > 3)</code> is true.
995 * The not1/unary_negate combination works on predicates taking a single
996 * argument. The not2/binary_negate combination works on predicates which
997 * take two arguments.
999 * @{
1001 /// One of the @link negators negation functors@endlink.
1002 template<typename _Predicate>
1003 class unary_negate
1004 : public unary_function<typename _Predicate::argument_type, bool>
1006 protected:
1007 _Predicate _M_pred;
1009 public:
1010 _GLIBCXX14_CONSTEXPR
1011 explicit
1012 unary_negate(const _Predicate& __x) : _M_pred(__x) { }
1014 _GLIBCXX14_CONSTEXPR
1015 bool
1016 operator()(const typename _Predicate::argument_type& __x) const
1017 { return !_M_pred(__x); }
1020 /// One of the @link negators negation functors@endlink.
1021 template<typename _Predicate>
1022 _GLIBCXX14_CONSTEXPR
1023 inline unary_negate<_Predicate>
1024 not1(const _Predicate& __pred)
1025 { return unary_negate<_Predicate>(__pred); }
1027 /// One of the @link negators negation functors@endlink.
1028 template<typename _Predicate>
1029 class binary_negate
1030 : public binary_function<typename _Predicate::first_argument_type,
1031 typename _Predicate::second_argument_type, bool>
1033 protected:
1034 _Predicate _M_pred;
1036 public:
1037 _GLIBCXX14_CONSTEXPR
1038 explicit
1039 binary_negate(const _Predicate& __x) : _M_pred(__x) { }
1041 _GLIBCXX14_CONSTEXPR
1042 bool
1043 operator()(const typename _Predicate::first_argument_type& __x,
1044 const typename _Predicate::second_argument_type& __y) const
1045 { return !_M_pred(__x, __y); }
1048 /// One of the @link negators negation functors@endlink.
1049 template<typename _Predicate>
1050 _GLIBCXX14_CONSTEXPR
1051 inline binary_negate<_Predicate>
1052 not2(const _Predicate& __pred)
1053 { return binary_negate<_Predicate>(__pred); }
1054 /** @} */
1056 // 20.3.7 adaptors pointers functions
1057 /** @defgroup pointer_adaptors Adaptors for pointers to functions
1058 * @ingroup functors
1060 * The advantage of function objects over pointers to functions is that
1061 * the objects in the standard library declare nested typedefs describing
1062 * their argument and result types with uniform names (e.g., @c result_type
1063 * from the base classes @c unary_function and @c binary_function).
1064 * Sometimes those typedefs are required, not just optional.
1066 * Adaptors are provided to turn pointers to unary (single-argument) and
1067 * binary (double-argument) functions into function objects. The
1068 * long-winded functor @c pointer_to_unary_function is constructed with a
1069 * function pointer @c f, and its @c operator() called with argument @c x
1070 * returns @c f(x). The functor @c pointer_to_binary_function does the same
1071 * thing, but with a double-argument @c f and @c operator().
1073 * The function @c ptr_fun takes a pointer-to-function @c f and constructs
1074 * an instance of the appropriate functor.
1076 * @{
1078 /// One of the @link pointer_adaptors adaptors for function pointers@endlink.
1079 template<typename _Arg, typename _Result>
1080 class pointer_to_unary_function : public unary_function<_Arg, _Result>
1082 protected:
1083 _Result (*_M_ptr)(_Arg);
1085 public:
1086 pointer_to_unary_function() { }
1088 explicit
1089 pointer_to_unary_function(_Result (*__x)(_Arg))
1090 : _M_ptr(__x) { }
1092 _Result
1093 operator()(_Arg __x) const
1094 { return _M_ptr(__x); }
1097 /// One of the @link pointer_adaptors adaptors for function pointers@endlink.
1098 template<typename _Arg, typename _Result>
1099 inline pointer_to_unary_function<_Arg, _Result>
1100 ptr_fun(_Result (*__x)(_Arg))
1101 { return pointer_to_unary_function<_Arg, _Result>(__x); }
1103 /// One of the @link pointer_adaptors adaptors for function pointers@endlink.
1104 template<typename _Arg1, typename _Arg2, typename _Result>
1105 class pointer_to_binary_function
1106 : public binary_function<_Arg1, _Arg2, _Result>
1108 protected:
1109 _Result (*_M_ptr)(_Arg1, _Arg2);
1111 public:
1112 pointer_to_binary_function() { }
1114 explicit
1115 pointer_to_binary_function(_Result (*__x)(_Arg1, _Arg2))
1116 : _M_ptr(__x) { }
1118 _Result
1119 operator()(_Arg1 __x, _Arg2 __y) const
1120 { return _M_ptr(__x, __y); }
1123 /// One of the @link pointer_adaptors adaptors for function pointers@endlink.
1124 template<typename _Arg1, typename _Arg2, typename _Result>
1125 inline pointer_to_binary_function<_Arg1, _Arg2, _Result>
1126 ptr_fun(_Result (*__x)(_Arg1, _Arg2))
1127 { return pointer_to_binary_function<_Arg1, _Arg2, _Result>(__x); }
1128 /** @} */
1130 template<typename _Tp>
1131 struct _Identity
1132 : public unary_function<_Tp, _Tp>
1134 _Tp&
1135 operator()(_Tp& __x) const
1136 { return __x; }
1138 const _Tp&
1139 operator()(const _Tp& __x) const
1140 { return __x; }
1143 // Partial specialization, avoids confusing errors in e.g. std::set<const T>.
1144 template<typename _Tp> struct _Identity<const _Tp> : _Identity<_Tp> { };
1146 template<typename _Pair>
1147 struct _Select1st
1148 : public unary_function<_Pair, typename _Pair::first_type>
1150 typename _Pair::first_type&
1151 operator()(_Pair& __x) const
1152 { return __x.first; }
1154 const typename _Pair::first_type&
1155 operator()(const _Pair& __x) const
1156 { return __x.first; }
1158 #if __cplusplus >= 201103L
1159 template<typename _Pair2>
1160 typename _Pair2::first_type&
1161 operator()(_Pair2& __x) const
1162 { return __x.first; }
1164 template<typename _Pair2>
1165 const typename _Pair2::first_type&
1166 operator()(const _Pair2& __x) const
1167 { return __x.first; }
1168 #endif
1171 template<typename _Pair>
1172 struct _Select2nd
1173 : public unary_function<_Pair, typename _Pair::second_type>
1175 typename _Pair::second_type&
1176 operator()(_Pair& __x) const
1177 { return __x.second; }
1179 const typename _Pair::second_type&
1180 operator()(const _Pair& __x) const
1181 { return __x.second; }
1184 // 20.3.8 adaptors pointers members
1185 /** @defgroup memory_adaptors Adaptors for pointers to members
1186 * @ingroup functors
1188 * There are a total of 8 = 2^3 function objects in this family.
1189 * (1) Member functions taking no arguments vs member functions taking
1190 * one argument.
1191 * (2) Call through pointer vs call through reference.
1192 * (3) Const vs non-const member function.
1194 * All of this complexity is in the function objects themselves. You can
1195 * ignore it by using the helper function mem_fun and mem_fun_ref,
1196 * which create whichever type of adaptor is appropriate.
1198 * @{
1200 /// One of the @link memory_adaptors adaptors for member
1201 /// pointers@endlink.
1202 template<typename _Ret, typename _Tp>
1203 class mem_fun_t : public unary_function<_Tp*, _Ret>
1205 public:
1206 explicit
1207 mem_fun_t(_Ret (_Tp::*__pf)())
1208 : _M_f(__pf) { }
1210 _Ret
1211 operator()(_Tp* __p) const
1212 { return (__p->*_M_f)(); }
1214 private:
1215 _Ret (_Tp::*_M_f)();
1218 /// One of the @link memory_adaptors adaptors for member
1219 /// pointers@endlink.
1220 template<typename _Ret, typename _Tp>
1221 class const_mem_fun_t : public unary_function<const _Tp*, _Ret>
1223 public:
1224 explicit
1225 const_mem_fun_t(_Ret (_Tp::*__pf)() const)
1226 : _M_f(__pf) { }
1228 _Ret
1229 operator()(const _Tp* __p) const
1230 { return (__p->*_M_f)(); }
1232 private:
1233 _Ret (_Tp::*_M_f)() const;
1236 /// One of the @link memory_adaptors adaptors for member
1237 /// pointers@endlink.
1238 template<typename _Ret, typename _Tp>
1239 class mem_fun_ref_t : public unary_function<_Tp, _Ret>
1241 public:
1242 explicit
1243 mem_fun_ref_t(_Ret (_Tp::*__pf)())
1244 : _M_f(__pf) { }
1246 _Ret
1247 operator()(_Tp& __r) const
1248 { return (__r.*_M_f)(); }
1250 private:
1251 _Ret (_Tp::*_M_f)();
1254 /// One of the @link memory_adaptors adaptors for member
1255 /// pointers@endlink.
1256 template<typename _Ret, typename _Tp>
1257 class const_mem_fun_ref_t : public unary_function<_Tp, _Ret>
1259 public:
1260 explicit
1261 const_mem_fun_ref_t(_Ret (_Tp::*__pf)() const)
1262 : _M_f(__pf) { }
1264 _Ret
1265 operator()(const _Tp& __r) const
1266 { return (__r.*_M_f)(); }
1268 private:
1269 _Ret (_Tp::*_M_f)() const;
1272 /// One of the @link memory_adaptors adaptors for member
1273 /// pointers@endlink.
1274 template<typename _Ret, typename _Tp, typename _Arg>
1275 class mem_fun1_t : public binary_function<_Tp*, _Arg, _Ret>
1277 public:
1278 explicit
1279 mem_fun1_t(_Ret (_Tp::*__pf)(_Arg))
1280 : _M_f(__pf) { }
1282 _Ret
1283 operator()(_Tp* __p, _Arg __x) const
1284 { return (__p->*_M_f)(__x); }
1286 private:
1287 _Ret (_Tp::*_M_f)(_Arg);
1290 /// One of the @link memory_adaptors adaptors for member
1291 /// pointers@endlink.
1292 template<typename _Ret, typename _Tp, typename _Arg>
1293 class const_mem_fun1_t : public binary_function<const _Tp*, _Arg, _Ret>
1295 public:
1296 explicit
1297 const_mem_fun1_t(_Ret (_Tp::*__pf)(_Arg) const)
1298 : _M_f(__pf) { }
1300 _Ret
1301 operator()(const _Tp* __p, _Arg __x) const
1302 { return (__p->*_M_f)(__x); }
1304 private:
1305 _Ret (_Tp::*_M_f)(_Arg) const;
1308 /// One of the @link memory_adaptors adaptors for member
1309 /// pointers@endlink.
1310 template<typename _Ret, typename _Tp, typename _Arg>
1311 class mem_fun1_ref_t : public binary_function<_Tp, _Arg, _Ret>
1313 public:
1314 explicit
1315 mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg))
1316 : _M_f(__pf) { }
1318 _Ret
1319 operator()(_Tp& __r, _Arg __x) const
1320 { return (__r.*_M_f)(__x); }
1322 private:
1323 _Ret (_Tp::*_M_f)(_Arg);
1326 /// One of the @link memory_adaptors adaptors for member
1327 /// pointers@endlink.
1328 template<typename _Ret, typename _Tp, typename _Arg>
1329 class const_mem_fun1_ref_t : public binary_function<_Tp, _Arg, _Ret>
1331 public:
1332 explicit
1333 const_mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg) const)
1334 : _M_f(__pf) { }
1336 _Ret
1337 operator()(const _Tp& __r, _Arg __x) const
1338 { return (__r.*_M_f)(__x); }
1340 private:
1341 _Ret (_Tp::*_M_f)(_Arg) const;
1344 // Mem_fun adaptor helper functions. There are only two:
1345 // mem_fun and mem_fun_ref.
1346 template<typename _Ret, typename _Tp>
1347 inline mem_fun_t<_Ret, _Tp>
1348 mem_fun(_Ret (_Tp::*__f)())
1349 { return mem_fun_t<_Ret, _Tp>(__f); }
1351 template<typename _Ret, typename _Tp>
1352 inline const_mem_fun_t<_Ret, _Tp>
1353 mem_fun(_Ret (_Tp::*__f)() const)
1354 { return const_mem_fun_t<_Ret, _Tp>(__f); }
1356 template<typename _Ret, typename _Tp>
1357 inline mem_fun_ref_t<_Ret, _Tp>
1358 mem_fun_ref(_Ret (_Tp::*__f)())
1359 { return mem_fun_ref_t<_Ret, _Tp>(__f); }
1361 template<typename _Ret, typename _Tp>
1362 inline const_mem_fun_ref_t<_Ret, _Tp>
1363 mem_fun_ref(_Ret (_Tp::*__f)() const)
1364 { return const_mem_fun_ref_t<_Ret, _Tp>(__f); }
1366 template<typename _Ret, typename _Tp, typename _Arg>
1367 inline mem_fun1_t<_Ret, _Tp, _Arg>
1368 mem_fun(_Ret (_Tp::*__f)(_Arg))
1369 { return mem_fun1_t<_Ret, _Tp, _Arg>(__f); }
1371 template<typename _Ret, typename _Tp, typename _Arg>
1372 inline const_mem_fun1_t<_Ret, _Tp, _Arg>
1373 mem_fun(_Ret (_Tp::*__f)(_Arg) const)
1374 { return const_mem_fun1_t<_Ret, _Tp, _Arg>(__f); }
1376 template<typename _Ret, typename _Tp, typename _Arg>
1377 inline mem_fun1_ref_t<_Ret, _Tp, _Arg>
1378 mem_fun_ref(_Ret (_Tp::*__f)(_Arg))
1379 { return mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); }
1381 template<typename _Ret, typename _Tp, typename _Arg>
1382 inline const_mem_fun1_ref_t<_Ret, _Tp, _Arg>
1383 mem_fun_ref(_Ret (_Tp::*__f)(_Arg) const)
1384 { return const_mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); }
1386 /** @} */
1388 #if __cplusplus >= 201402L
1389 template<typename _Func, typename _SfinaeType, typename = __void_t<>>
1390 struct __has_is_transparent
1391 { };
1393 template<typename _Func, typename _SfinaeType>
1394 struct __has_is_transparent<_Func, _SfinaeType,
1395 __void_t<typename _Func::is_transparent>>
1396 { typedef void type; };
1398 template<typename _Func, typename _SfinaeType>
1399 using __has_is_transparent_t
1400 = typename __has_is_transparent<_Func, _SfinaeType>::type;
1401 #endif
1403 _GLIBCXX_END_NAMESPACE_VERSION
1404 } // namespace
1406 #if (__cplusplus < 201103L) || _GLIBCXX_USE_DEPRECATED
1407 # include <backward/binders.h>
1408 #endif
1410 #endif /* _STL_FUNCTION_H */