]> git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/include/bits/stl_function.h
Update copyright years.
[thirdparty/gcc.git] / libstdc++-v3 / include / bits / stl_function.h
1 // Functor implementations -*- C++ -*-
2
3 // Copyright (C) 2001-2023 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.
10
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.
15
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.
19
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/>.
24
25 /*
26 *
27 * Copyright (c) 1994
28 * Hewlett-Packard Company
29 *
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.
37 *
38 *
39 * Copyright (c) 1996-1998
40 * Silicon Graphics Computer Systems, Inc.
41 *
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.
49 */
50
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}
54 */
55
56 #ifndef _STL_FUNCTION_H
57 #define _STL_FUNCTION_H 1
58
59 #if __cplusplus > 201103L
60 #include <bits/move.h>
61 #endif
62
63 namespace std _GLIBCXX_VISIBILITY(default)
64 {
65 _GLIBCXX_BEGIN_NAMESPACE_VERSION
66
67 // 20.3.1 base classes
68 /** @defgroup functors Function Objects
69 * @ingroup utilities
70 *
71 * Function objects, or _functors_, are objects with an `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 _functors_, then, generally we include function pointers in
77 * the description as well.
78 *
79 * Often, functors are only created as temporaries passed to algorithm
80 * calls, rather than being created as named variables.
81 *
82 * Two examples taken from the standard itself follow. To perform a
83 * by-element addition of two vectors `a` and `b` containing `double`,
84 * and put the result in `a`, use
85 * \code
86 * transform (a.begin(), a.end(), b.begin(), a.begin(), plus<double>());
87 * \endcode
88 * To negate every element in `a`, use
89 * \code
90 * transform(a.begin(), a.end(), a.begin(), negate<double>());
91 * \endcode
92 * The addition and negation functions will usually be inlined directly.
93 *
94 * An _adaptable function object_ is one which provides nested typedefs
95 * `result_type` and either `argument_type` (for a unary function) or
96 * `first_argument_type` and `second_argument_type` (for a binary function).
97 * Those typedefs are used by function object adaptors such as `bind2nd`.
98 * The standard library provides two class templates, `unary_function` and
99 * `binary_function`, which define those typedefs and so can be used as
100 * base classes of adaptable function objects.
101 *
102 * Since C++11 the use of function object adaptors has been superseded by
103 * more powerful tools such as lambda expressions, `function<>`, and more
104 * powerful type deduction (using `auto` and `decltype`). The helpers for
105 * defining adaptable function objects are deprecated since C++11, and no
106 * longer part of the standard library since C++17. However, they are still
107 * defined and used by libstdc++ after C++17, as a conforming extension.
108 *
109 * @{
110 */
111
112 /**
113 * Helper for defining adaptable unary function objects.
114 * @deprecated Deprecated in C++11, no longer in the standard since C++17.
115 */
116 template<typename _Arg, typename _Result>
117 struct unary_function
118 {
119 /// @c argument_type is the type of the argument
120 typedef _Arg argument_type;
121
122 /// @c result_type is the return type
123 typedef _Result result_type;
124 } _GLIBCXX11_DEPRECATED;
125
126 /**
127 * Helper for defining adaptable binary function objects.
128 * @deprecated Deprecated in C++11, no longer in the standard since C++17.
129 */
130 template<typename _Arg1, typename _Arg2, typename _Result>
131 struct binary_function
132 {
133 /// @c first_argument_type is the type of the first argument
134 typedef _Arg1 first_argument_type;
135
136 /// @c second_argument_type is the type of the second argument
137 typedef _Arg2 second_argument_type;
138
139 /// @c result_type is the return type
140 typedef _Result result_type;
141 } _GLIBCXX11_DEPRECATED;
142 /** @} */
143
144 // 20.3.2 arithmetic
145
146 /** @defgroup arithmetic_functors Arithmetic Function Object Classes
147 * @ingroup functors
148 *
149 * The library provides function objects for basic arithmetic operations.
150 * See the documentation for @link functors function objects @endlink
151 * for examples of their use.
152 *
153 * @{
154 */
155
156 #if __cplusplus > 201103L
157 struct __is_transparent; // undefined
158
159 template<typename _Tp = void>
160 struct plus;
161
162 template<typename _Tp = void>
163 struct minus;
164
165 template<typename _Tp = void>
166 struct multiplies;
167
168 template<typename _Tp = void>
169 struct divides;
170
171 template<typename _Tp = void>
172 struct modulus;
173
174 template<typename _Tp = void>
175 struct negate;
176 #endif
177
178 // Ignore warnings about unary_function and binary_function.
179 #pragma GCC diagnostic push
180 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
181
182 /// One of the @link arithmetic_functors math functors@endlink.
183 template<typename _Tp>
184 struct plus : public binary_function<_Tp, _Tp, _Tp>
185 {
186 /// Returns the sum
187 _GLIBCXX14_CONSTEXPR
188 _Tp
189 operator()(const _Tp& __x, const _Tp& __y) const
190 { return __x + __y; }
191 };
192
193 /// One of the @link arithmetic_functors math functors@endlink.
194 template<typename _Tp>
195 struct minus : public binary_function<_Tp, _Tp, _Tp>
196 {
197 _GLIBCXX14_CONSTEXPR
198 _Tp
199 operator()(const _Tp& __x, const _Tp& __y) const
200 { return __x - __y; }
201 };
202
203 /// One of the @link arithmetic_functors math functors@endlink.
204 template<typename _Tp>
205 struct multiplies : public binary_function<_Tp, _Tp, _Tp>
206 {
207 _GLIBCXX14_CONSTEXPR
208 _Tp
209 operator()(const _Tp& __x, const _Tp& __y) const
210 { return __x * __y; }
211 };
212
213 /// One of the @link arithmetic_functors math functors@endlink.
214 template<typename _Tp>
215 struct divides : public binary_function<_Tp, _Tp, _Tp>
216 {
217 _GLIBCXX14_CONSTEXPR
218 _Tp
219 operator()(const _Tp& __x, const _Tp& __y) const
220 { return __x / __y; }
221 };
222
223 /// One of the @link arithmetic_functors math functors@endlink.
224 template<typename _Tp>
225 struct modulus : public binary_function<_Tp, _Tp, _Tp>
226 {
227 _GLIBCXX14_CONSTEXPR
228 _Tp
229 operator()(const _Tp& __x, const _Tp& __y) const
230 { return __x % __y; }
231 };
232
233 /// One of the @link arithmetic_functors math functors@endlink.
234 template<typename _Tp>
235 struct negate : public unary_function<_Tp, _Tp>
236 {
237 _GLIBCXX14_CONSTEXPR
238 _Tp
239 operator()(const _Tp& __x) const
240 { return -__x; }
241 };
242 #pragma GCC diagnostic pop
243
244 #if __cplusplus > 201103L
245
246 #define __cpp_lib_transparent_operators 201510L
247
248 template<>
249 struct plus<void>
250 {
251 template <typename _Tp, typename _Up>
252 _GLIBCXX14_CONSTEXPR
253 auto
254 operator()(_Tp&& __t, _Up&& __u) const
255 noexcept(noexcept(std::forward<_Tp>(__t) + std::forward<_Up>(__u)))
256 -> decltype(std::forward<_Tp>(__t) + std::forward<_Up>(__u))
257 { return std::forward<_Tp>(__t) + std::forward<_Up>(__u); }
258
259 typedef __is_transparent is_transparent;
260 };
261
262 /// One of the @link arithmetic_functors math functors@endlink.
263 template<>
264 struct minus<void>
265 {
266 template <typename _Tp, typename _Up>
267 _GLIBCXX14_CONSTEXPR
268 auto
269 operator()(_Tp&& __t, _Up&& __u) const
270 noexcept(noexcept(std::forward<_Tp>(__t) - std::forward<_Up>(__u)))
271 -> decltype(std::forward<_Tp>(__t) - std::forward<_Up>(__u))
272 { return std::forward<_Tp>(__t) - std::forward<_Up>(__u); }
273
274 typedef __is_transparent is_transparent;
275 };
276
277 /// One of the @link arithmetic_functors math functors@endlink.
278 template<>
279 struct multiplies<void>
280 {
281 template <typename _Tp, typename _Up>
282 _GLIBCXX14_CONSTEXPR
283 auto
284 operator()(_Tp&& __t, _Up&& __u) const
285 noexcept(noexcept(std::forward<_Tp>(__t) * std::forward<_Up>(__u)))
286 -> decltype(std::forward<_Tp>(__t) * std::forward<_Up>(__u))
287 { return std::forward<_Tp>(__t) * std::forward<_Up>(__u); }
288
289 typedef __is_transparent is_transparent;
290 };
291
292 /// One of the @link arithmetic_functors math functors@endlink.
293 template<>
294 struct divides<void>
295 {
296 template <typename _Tp, typename _Up>
297 _GLIBCXX14_CONSTEXPR
298 auto
299 operator()(_Tp&& __t, _Up&& __u) const
300 noexcept(noexcept(std::forward<_Tp>(__t) / std::forward<_Up>(__u)))
301 -> decltype(std::forward<_Tp>(__t) / std::forward<_Up>(__u))
302 { return std::forward<_Tp>(__t) / std::forward<_Up>(__u); }
303
304 typedef __is_transparent is_transparent;
305 };
306
307 /// One of the @link arithmetic_functors math functors@endlink.
308 template<>
309 struct modulus<void>
310 {
311 template <typename _Tp, typename _Up>
312 _GLIBCXX14_CONSTEXPR
313 auto
314 operator()(_Tp&& __t, _Up&& __u) const
315 noexcept(noexcept(std::forward<_Tp>(__t) % std::forward<_Up>(__u)))
316 -> decltype(std::forward<_Tp>(__t) % std::forward<_Up>(__u))
317 { return std::forward<_Tp>(__t) % std::forward<_Up>(__u); }
318
319 typedef __is_transparent is_transparent;
320 };
321
322 /// One of the @link arithmetic_functors math functors@endlink.
323 template<>
324 struct negate<void>
325 {
326 template <typename _Tp>
327 _GLIBCXX14_CONSTEXPR
328 auto
329 operator()(_Tp&& __t) const
330 noexcept(noexcept(-std::forward<_Tp>(__t)))
331 -> decltype(-std::forward<_Tp>(__t))
332 { return -std::forward<_Tp>(__t); }
333
334 typedef __is_transparent is_transparent;
335 };
336 #endif
337 /** @} */
338
339 // 20.3.3 comparisons
340 /** @defgroup comparison_functors Comparison Classes
341 * @ingroup functors
342 *
343 * The library provides six wrapper functors for all the basic comparisons
344 * in C++, like @c <.
345 *
346 * @{
347 */
348 #if __cplusplus > 201103L
349 template<typename _Tp = void>
350 struct equal_to;
351
352 template<typename _Tp = void>
353 struct not_equal_to;
354
355 template<typename _Tp = void>
356 struct greater;
357
358 template<typename _Tp = void>
359 struct less;
360
361 template<typename _Tp = void>
362 struct greater_equal;
363
364 template<typename _Tp = void>
365 struct less_equal;
366 #endif
367
368 #pragma GCC diagnostic push
369 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
370
371 /// One of the @link comparison_functors comparison functors@endlink.
372 template<typename _Tp>
373 struct equal_to : public binary_function<_Tp, _Tp, bool>
374 {
375 _GLIBCXX14_CONSTEXPR
376 bool
377 operator()(const _Tp& __x, const _Tp& __y) const
378 { return __x == __y; }
379 };
380
381 /// One of the @link comparison_functors comparison functors@endlink.
382 template<typename _Tp>
383 struct not_equal_to : public binary_function<_Tp, _Tp, bool>
384 {
385 _GLIBCXX14_CONSTEXPR
386 bool
387 operator()(const _Tp& __x, const _Tp& __y) const
388 { return __x != __y; }
389 };
390
391 /// One of the @link comparison_functors comparison functors@endlink.
392 template<typename _Tp>
393 struct greater : public binary_function<_Tp, _Tp, bool>
394 {
395 _GLIBCXX14_CONSTEXPR
396 bool
397 operator()(const _Tp& __x, const _Tp& __y) const
398 { return __x > __y; }
399 };
400
401 /// One of the @link comparison_functors comparison functors@endlink.
402 template<typename _Tp>
403 struct less : public binary_function<_Tp, _Tp, bool>
404 {
405 _GLIBCXX14_CONSTEXPR
406 bool
407 operator()(const _Tp& __x, const _Tp& __y) const
408 { return __x < __y; }
409 };
410
411 /// One of the @link comparison_functors comparison functors@endlink.
412 template<typename _Tp>
413 struct greater_equal : public binary_function<_Tp, _Tp, bool>
414 {
415 _GLIBCXX14_CONSTEXPR
416 bool
417 operator()(const _Tp& __x, const _Tp& __y) const
418 { return __x >= __y; }
419 };
420
421 /// One of the @link comparison_functors comparison functors@endlink.
422 template<typename _Tp>
423 struct less_equal : public binary_function<_Tp, _Tp, bool>
424 {
425 _GLIBCXX14_CONSTEXPR
426 bool
427 operator()(const _Tp& __x, const _Tp& __y) const
428 { return __x <= __y; }
429 };
430
431 // Partial specialization of std::greater for pointers.
432 template<typename _Tp>
433 struct greater<_Tp*> : public binary_function<_Tp*, _Tp*, bool>
434 {
435 _GLIBCXX14_CONSTEXPR bool
436 operator()(_Tp* __x, _Tp* __y) const _GLIBCXX_NOTHROW
437 {
438 #if __cplusplus >= 201402L
439 if (std::__is_constant_evaluated())
440 return __x > __y;
441 #endif
442 return (__UINTPTR_TYPE__)__x > (__UINTPTR_TYPE__)__y;
443 }
444 };
445
446 // Partial specialization of std::less for pointers.
447 template<typename _Tp>
448 struct less<_Tp*> : public binary_function<_Tp*, _Tp*, bool>
449 {
450 _GLIBCXX14_CONSTEXPR bool
451 operator()(_Tp* __x, _Tp* __y) const _GLIBCXX_NOTHROW
452 {
453 #if __cplusplus >= 201402L
454 if (std::__is_constant_evaluated())
455 return __x < __y;
456 #endif
457 return (__UINTPTR_TYPE__)__x < (__UINTPTR_TYPE__)__y;
458 }
459 };
460
461 // Partial specialization of std::greater_equal for pointers.
462 template<typename _Tp>
463 struct greater_equal<_Tp*> : public binary_function<_Tp*, _Tp*, bool>
464 {
465 _GLIBCXX14_CONSTEXPR bool
466 operator()(_Tp* __x, _Tp* __y) const _GLIBCXX_NOTHROW
467 {
468 #if __cplusplus >= 201402L
469 if (std::__is_constant_evaluated())
470 return __x >= __y;
471 #endif
472 return (__UINTPTR_TYPE__)__x >= (__UINTPTR_TYPE__)__y;
473 }
474 };
475
476 // Partial specialization of std::less_equal for pointers.
477 template<typename _Tp>
478 struct less_equal<_Tp*> : public binary_function<_Tp*, _Tp*, bool>
479 {
480 _GLIBCXX14_CONSTEXPR bool
481 operator()(_Tp* __x, _Tp* __y) const _GLIBCXX_NOTHROW
482 {
483 #if __cplusplus >= 201402L
484 if (std::__is_constant_evaluated())
485 return __x <= __y;
486 #endif
487 return (__UINTPTR_TYPE__)__x <= (__UINTPTR_TYPE__)__y;
488 }
489 };
490 #pragma GCC diagnostic pop
491
492 #if __cplusplus >= 201402L
493 /// One of the @link comparison_functors comparison functors@endlink.
494 template<>
495 struct equal_to<void>
496 {
497 template <typename _Tp, typename _Up>
498 constexpr auto
499 operator()(_Tp&& __t, _Up&& __u) const
500 noexcept(noexcept(std::forward<_Tp>(__t) == std::forward<_Up>(__u)))
501 -> decltype(std::forward<_Tp>(__t) == std::forward<_Up>(__u))
502 { return std::forward<_Tp>(__t) == std::forward<_Up>(__u); }
503
504 typedef __is_transparent is_transparent;
505 };
506
507 /// One of the @link comparison_functors comparison functors@endlink.
508 template<>
509 struct not_equal_to<void>
510 {
511 template <typename _Tp, typename _Up>
512 constexpr auto
513 operator()(_Tp&& __t, _Up&& __u) const
514 noexcept(noexcept(std::forward<_Tp>(__t) != std::forward<_Up>(__u)))
515 -> decltype(std::forward<_Tp>(__t) != std::forward<_Up>(__u))
516 { return std::forward<_Tp>(__t) != std::forward<_Up>(__u); }
517
518 typedef __is_transparent is_transparent;
519 };
520
521 /// One of the @link comparison_functors comparison functors@endlink.
522 template<>
523 struct greater<void>
524 {
525 template <typename _Tp, typename _Up>
526 constexpr auto
527 operator()(_Tp&& __t, _Up&& __u) const
528 noexcept(noexcept(std::forward<_Tp>(__t) > std::forward<_Up>(__u)))
529 -> decltype(std::forward<_Tp>(__t) > std::forward<_Up>(__u))
530 {
531 return _S_cmp(std::forward<_Tp>(__t), std::forward<_Up>(__u),
532 __ptr_cmp<_Tp, _Up>{});
533 }
534
535 template<typename _Tp, typename _Up>
536 constexpr bool
537 operator()(_Tp* __t, _Up* __u) const noexcept
538 { return greater<common_type_t<_Tp*, _Up*>>{}(__t, __u); }
539
540 typedef __is_transparent is_transparent;
541
542 private:
543 template <typename _Tp, typename _Up>
544 static constexpr decltype(auto)
545 _S_cmp(_Tp&& __t, _Up&& __u, false_type)
546 { return std::forward<_Tp>(__t) > std::forward<_Up>(__u); }
547
548 template <typename _Tp, typename _Up>
549 static constexpr bool
550 _S_cmp(_Tp&& __t, _Up&& __u, true_type) noexcept
551 {
552 return greater<const volatile void*>{}(
553 static_cast<const volatile void*>(std::forward<_Tp>(__t)),
554 static_cast<const volatile void*>(std::forward<_Up>(__u)));
555 }
556
557 // True if there is no viable operator> member function.
558 template<typename _Tp, typename _Up, typename = void>
559 struct __not_overloaded2 : true_type { };
560
561 // False if we can call T.operator>(U)
562 template<typename _Tp, typename _Up>
563 struct __not_overloaded2<_Tp, _Up, __void_t<
564 decltype(std::declval<_Tp>().operator>(std::declval<_Up>()))>>
565 : false_type { };
566
567 // True if there is no overloaded operator> for these operands.
568 template<typename _Tp, typename _Up, typename = void>
569 struct __not_overloaded : __not_overloaded2<_Tp, _Up> { };
570
571 // False if we can call operator>(T,U)
572 template<typename _Tp, typename _Up>
573 struct __not_overloaded<_Tp, _Up, __void_t<
574 decltype(operator>(std::declval<_Tp>(), std::declval<_Up>()))>>
575 : false_type { };
576
577 template<typename _Tp, typename _Up>
578 using __ptr_cmp = __and_<__not_overloaded<_Tp, _Up>,
579 is_convertible<_Tp, const volatile void*>,
580 is_convertible<_Up, const volatile void*>>;
581 };
582
583 /// One of the @link comparison_functors comparison functors@endlink.
584 template<>
585 struct less<void>
586 {
587 template <typename _Tp, typename _Up>
588 constexpr auto
589 operator()(_Tp&& __t, _Up&& __u) const
590 noexcept(noexcept(std::forward<_Tp>(__t) < std::forward<_Up>(__u)))
591 -> decltype(std::forward<_Tp>(__t) < std::forward<_Up>(__u))
592 {
593 return _S_cmp(std::forward<_Tp>(__t), std::forward<_Up>(__u),
594 __ptr_cmp<_Tp, _Up>{});
595 }
596
597 template<typename _Tp, typename _Up>
598 constexpr bool
599 operator()(_Tp* __t, _Up* __u) const noexcept
600 { return less<common_type_t<_Tp*, _Up*>>{}(__t, __u); }
601
602 typedef __is_transparent is_transparent;
603
604 private:
605 template <typename _Tp, typename _Up>
606 static constexpr decltype(auto)
607 _S_cmp(_Tp&& __t, _Up&& __u, false_type)
608 { return std::forward<_Tp>(__t) < std::forward<_Up>(__u); }
609
610 template <typename _Tp, typename _Up>
611 static constexpr bool
612 _S_cmp(_Tp&& __t, _Up&& __u, true_type) noexcept
613 {
614 return less<const volatile void*>{}(
615 static_cast<const volatile void*>(std::forward<_Tp>(__t)),
616 static_cast<const volatile void*>(std::forward<_Up>(__u)));
617 }
618
619 // True if there is no viable operator< member function.
620 template<typename _Tp, typename _Up, typename = void>
621 struct __not_overloaded2 : true_type { };
622
623 // False if we can call T.operator<(U)
624 template<typename _Tp, typename _Up>
625 struct __not_overloaded2<_Tp, _Up, __void_t<
626 decltype(std::declval<_Tp>().operator<(std::declval<_Up>()))>>
627 : false_type { };
628
629 // True if there is no overloaded operator< for these operands.
630 template<typename _Tp, typename _Up, typename = void>
631 struct __not_overloaded : __not_overloaded2<_Tp, _Up> { };
632
633 // False if we can call operator<(T,U)
634 template<typename _Tp, typename _Up>
635 struct __not_overloaded<_Tp, _Up, __void_t<
636 decltype(operator<(std::declval<_Tp>(), std::declval<_Up>()))>>
637 : false_type { };
638
639 template<typename _Tp, typename _Up>
640 using __ptr_cmp = __and_<__not_overloaded<_Tp, _Up>,
641 is_convertible<_Tp, const volatile void*>,
642 is_convertible<_Up, const volatile void*>>;
643 };
644
645 /// One of the @link comparison_functors comparison functors@endlink.
646 template<>
647 struct greater_equal<void>
648 {
649 template <typename _Tp, typename _Up>
650 constexpr auto
651 operator()(_Tp&& __t, _Up&& __u) const
652 noexcept(noexcept(std::forward<_Tp>(__t) >= std::forward<_Up>(__u)))
653 -> decltype(std::forward<_Tp>(__t) >= std::forward<_Up>(__u))
654 {
655 return _S_cmp(std::forward<_Tp>(__t), std::forward<_Up>(__u),
656 __ptr_cmp<_Tp, _Up>{});
657 }
658
659 template<typename _Tp, typename _Up>
660 constexpr bool
661 operator()(_Tp* __t, _Up* __u) const noexcept
662 { return greater_equal<common_type_t<_Tp*, _Up*>>{}(__t, __u); }
663
664 typedef __is_transparent is_transparent;
665
666 private:
667 template <typename _Tp, typename _Up>
668 static constexpr decltype(auto)
669 _S_cmp(_Tp&& __t, _Up&& __u, false_type)
670 { return std::forward<_Tp>(__t) >= std::forward<_Up>(__u); }
671
672 template <typename _Tp, typename _Up>
673 static constexpr bool
674 _S_cmp(_Tp&& __t, _Up&& __u, true_type) noexcept
675 {
676 return greater_equal<const volatile void*>{}(
677 static_cast<const volatile void*>(std::forward<_Tp>(__t)),
678 static_cast<const volatile void*>(std::forward<_Up>(__u)));
679 }
680
681 // True if there is no viable operator>= member function.
682 template<typename _Tp, typename _Up, typename = void>
683 struct __not_overloaded2 : true_type { };
684
685 // False if we can call T.operator>=(U)
686 template<typename _Tp, typename _Up>
687 struct __not_overloaded2<_Tp, _Up, __void_t<
688 decltype(std::declval<_Tp>().operator>=(std::declval<_Up>()))>>
689 : false_type { };
690
691 // True if there is no overloaded operator>= for these operands.
692 template<typename _Tp, typename _Up, typename = void>
693 struct __not_overloaded : __not_overloaded2<_Tp, _Up> { };
694
695 // False if we can call operator>=(T,U)
696 template<typename _Tp, typename _Up>
697 struct __not_overloaded<_Tp, _Up, __void_t<
698 decltype(operator>=(std::declval<_Tp>(), std::declval<_Up>()))>>
699 : false_type { };
700
701 template<typename _Tp, typename _Up>
702 using __ptr_cmp = __and_<__not_overloaded<_Tp, _Up>,
703 is_convertible<_Tp, const volatile void*>,
704 is_convertible<_Up, const volatile void*>>;
705 };
706
707 /// One of the @link comparison_functors comparison functors@endlink.
708 template<>
709 struct less_equal<void>
710 {
711 template <typename _Tp, typename _Up>
712 constexpr auto
713 operator()(_Tp&& __t, _Up&& __u) const
714 noexcept(noexcept(std::forward<_Tp>(__t) <= std::forward<_Up>(__u)))
715 -> decltype(std::forward<_Tp>(__t) <= std::forward<_Up>(__u))
716 {
717 return _S_cmp(std::forward<_Tp>(__t), std::forward<_Up>(__u),
718 __ptr_cmp<_Tp, _Up>{});
719 }
720
721 template<typename _Tp, typename _Up>
722 constexpr bool
723 operator()(_Tp* __t, _Up* __u) const noexcept
724 { return less_equal<common_type_t<_Tp*, _Up*>>{}(__t, __u); }
725
726 typedef __is_transparent is_transparent;
727
728 private:
729 template <typename _Tp, typename _Up>
730 static constexpr decltype(auto)
731 _S_cmp(_Tp&& __t, _Up&& __u, false_type)
732 { return std::forward<_Tp>(__t) <= std::forward<_Up>(__u); }
733
734 template <typename _Tp, typename _Up>
735 static constexpr bool
736 _S_cmp(_Tp&& __t, _Up&& __u, true_type) noexcept
737 {
738 return less_equal<const volatile void*>{}(
739 static_cast<const volatile void*>(std::forward<_Tp>(__t)),
740 static_cast<const volatile void*>(std::forward<_Up>(__u)));
741 }
742
743 // True if there is no viable operator<= member function.
744 template<typename _Tp, typename _Up, typename = void>
745 struct __not_overloaded2 : true_type { };
746
747 // False if we can call T.operator<=(U)
748 template<typename _Tp, typename _Up>
749 struct __not_overloaded2<_Tp, _Up, __void_t<
750 decltype(std::declval<_Tp>().operator<=(std::declval<_Up>()))>>
751 : false_type { };
752
753 // True if there is no overloaded operator<= for these operands.
754 template<typename _Tp, typename _Up, typename = void>
755 struct __not_overloaded : __not_overloaded2<_Tp, _Up> { };
756
757 // False if we can call operator<=(T,U)
758 template<typename _Tp, typename _Up>
759 struct __not_overloaded<_Tp, _Up, __void_t<
760 decltype(operator<=(std::declval<_Tp>(), std::declval<_Up>()))>>
761 : false_type { };
762
763 template<typename _Tp, typename _Up>
764 using __ptr_cmp = __and_<__not_overloaded<_Tp, _Up>,
765 is_convertible<_Tp, const volatile void*>,
766 is_convertible<_Up, const volatile void*>>;
767 };
768 #endif // C++14
769 /** @} */
770
771 // 20.3.4 logical operations
772 /** @defgroup logical_functors Boolean Operations Classes
773 * @ingroup functors
774 *
775 * The library provides function objects for the logical operations:
776 * `&&`, `||`, and `!`.
777 *
778 * @{
779 */
780 #if __cplusplus > 201103L
781 template<typename _Tp = void>
782 struct logical_and;
783
784 template<typename _Tp = void>
785 struct logical_or;
786
787 template<typename _Tp = void>
788 struct logical_not;
789 #endif
790
791 #pragma GCC diagnostic push
792 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
793
794 /// One of the @link logical_functors Boolean operations functors@endlink.
795 template<typename _Tp>
796 struct logical_and : public binary_function<_Tp, _Tp, bool>
797 {
798 _GLIBCXX14_CONSTEXPR
799 bool
800 operator()(const _Tp& __x, const _Tp& __y) const
801 { return __x && __y; }
802 };
803
804 /// One of the @link logical_functors Boolean operations functors@endlink.
805 template<typename _Tp>
806 struct logical_or : public binary_function<_Tp, _Tp, bool>
807 {
808 _GLIBCXX14_CONSTEXPR
809 bool
810 operator()(const _Tp& __x, const _Tp& __y) const
811 { return __x || __y; }
812 };
813
814 /// One of the @link logical_functors Boolean operations functors@endlink.
815 template<typename _Tp>
816 struct logical_not : public unary_function<_Tp, bool>
817 {
818 _GLIBCXX14_CONSTEXPR
819 bool
820 operator()(const _Tp& __x) const
821 { return !__x; }
822 };
823 #pragma GCC diagnostic pop
824
825 #if __cplusplus > 201103L
826 /// One of the @link logical_functors Boolean operations functors@endlink.
827 template<>
828 struct logical_and<void>
829 {
830 template <typename _Tp, typename _Up>
831 _GLIBCXX14_CONSTEXPR
832 auto
833 operator()(_Tp&& __t, _Up&& __u) const
834 noexcept(noexcept(std::forward<_Tp>(__t) && std::forward<_Up>(__u)))
835 -> decltype(std::forward<_Tp>(__t) && std::forward<_Up>(__u))
836 { return std::forward<_Tp>(__t) && std::forward<_Up>(__u); }
837
838 typedef __is_transparent is_transparent;
839 };
840
841 /// One of the @link logical_functors Boolean operations functors@endlink.
842 template<>
843 struct logical_or<void>
844 {
845 template <typename _Tp, typename _Up>
846 _GLIBCXX14_CONSTEXPR
847 auto
848 operator()(_Tp&& __t, _Up&& __u) const
849 noexcept(noexcept(std::forward<_Tp>(__t) || std::forward<_Up>(__u)))
850 -> decltype(std::forward<_Tp>(__t) || std::forward<_Up>(__u))
851 { return std::forward<_Tp>(__t) || std::forward<_Up>(__u); }
852
853 typedef __is_transparent is_transparent;
854 };
855
856 /// One of the @link logical_functors Boolean operations functors@endlink.
857 template<>
858 struct logical_not<void>
859 {
860 template <typename _Tp>
861 _GLIBCXX14_CONSTEXPR
862 auto
863 operator()(_Tp&& __t) const
864 noexcept(noexcept(!std::forward<_Tp>(__t)))
865 -> decltype(!std::forward<_Tp>(__t))
866 { return !std::forward<_Tp>(__t); }
867
868 typedef __is_transparent is_transparent;
869 };
870 #endif
871 /** @} */
872
873 #if __cplusplus > 201103L
874 template<typename _Tp = void>
875 struct bit_and;
876
877 template<typename _Tp = void>
878 struct bit_or;
879
880 template<typename _Tp = void>
881 struct bit_xor;
882
883 template<typename _Tp = void>
884 struct bit_not;
885 #endif
886
887 #pragma GCC diagnostic push
888 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
889
890 // _GLIBCXX_RESOLVE_LIB_DEFECTS
891 // DR 660. Missing Bitwise Operations.
892 template<typename _Tp>
893 struct bit_and : public binary_function<_Tp, _Tp, _Tp>
894 {
895 _GLIBCXX14_CONSTEXPR
896 _Tp
897 operator()(const _Tp& __x, const _Tp& __y) const
898 { return __x & __y; }
899 };
900
901 template<typename _Tp>
902 struct bit_or : public binary_function<_Tp, _Tp, _Tp>
903 {
904 _GLIBCXX14_CONSTEXPR
905 _Tp
906 operator()(const _Tp& __x, const _Tp& __y) const
907 { return __x | __y; }
908 };
909
910 template<typename _Tp>
911 struct bit_xor : public binary_function<_Tp, _Tp, _Tp>
912 {
913 _GLIBCXX14_CONSTEXPR
914 _Tp
915 operator()(const _Tp& __x, const _Tp& __y) const
916 { return __x ^ __y; }
917 };
918
919 template<typename _Tp>
920 struct bit_not : public unary_function<_Tp, _Tp>
921 {
922 _GLIBCXX14_CONSTEXPR
923 _Tp
924 operator()(const _Tp& __x) const
925 { return ~__x; }
926 };
927 #pragma GCC diagnostic pop
928
929 #if __cplusplus > 201103L
930 template <>
931 struct bit_and<void>
932 {
933 template <typename _Tp, typename _Up>
934 _GLIBCXX14_CONSTEXPR
935 auto
936 operator()(_Tp&& __t, _Up&& __u) const
937 noexcept(noexcept(std::forward<_Tp>(__t) & std::forward<_Up>(__u)))
938 -> decltype(std::forward<_Tp>(__t) & std::forward<_Up>(__u))
939 { return std::forward<_Tp>(__t) & std::forward<_Up>(__u); }
940
941 typedef __is_transparent is_transparent;
942 };
943
944 template <>
945 struct bit_or<void>
946 {
947 template <typename _Tp, typename _Up>
948 _GLIBCXX14_CONSTEXPR
949 auto
950 operator()(_Tp&& __t, _Up&& __u) const
951 noexcept(noexcept(std::forward<_Tp>(__t) | std::forward<_Up>(__u)))
952 -> decltype(std::forward<_Tp>(__t) | std::forward<_Up>(__u))
953 { return std::forward<_Tp>(__t) | std::forward<_Up>(__u); }
954
955 typedef __is_transparent is_transparent;
956 };
957
958 template <>
959 struct bit_xor<void>
960 {
961 template <typename _Tp, typename _Up>
962 _GLIBCXX14_CONSTEXPR
963 auto
964 operator()(_Tp&& __t, _Up&& __u) const
965 noexcept(noexcept(std::forward<_Tp>(__t) ^ std::forward<_Up>(__u)))
966 -> decltype(std::forward<_Tp>(__t) ^ std::forward<_Up>(__u))
967 { return std::forward<_Tp>(__t) ^ std::forward<_Up>(__u); }
968
969 typedef __is_transparent is_transparent;
970 };
971
972 template <>
973 struct bit_not<void>
974 {
975 template <typename _Tp>
976 _GLIBCXX14_CONSTEXPR
977 auto
978 operator()(_Tp&& __t) const
979 noexcept(noexcept(~std::forward<_Tp>(__t)))
980 -> decltype(~std::forward<_Tp>(__t))
981 { return ~std::forward<_Tp>(__t); }
982
983 typedef __is_transparent is_transparent;
984 };
985 #endif // C++14
986
987 #pragma GCC diagnostic push
988 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
989
990 // 20.3.5 negators
991 /** @defgroup negators Negators
992 * @ingroup functors
993 *
994 * The function templates `not1` and `not2` are function object adaptors,
995 * which each take a predicate functor and wrap it in an instance of
996 * `unary_negate` or `binary_negate`, respectively. Those classes are
997 * functors whose `operator()` evaluates the wrapped predicate function
998 * and then returns the negation of the result.
999 *
1000 * For example, given a vector of integers and a trivial predicate,
1001 * \code
1002 * struct IntGreaterThanThree
1003 * : public std::unary_function<int, bool>
1004 * {
1005 * bool operator() (int x) const { return x > 3; }
1006 * };
1007 *
1008 * std::find_if (v.begin(), v.end(), not1(IntGreaterThanThree()));
1009 * \endcode
1010 * The call to `find_if` will locate the first index (i) of `v` for which
1011 * `!(v[i] > 3)` is true.
1012 *
1013 * The not1/unary_negate combination works on predicates taking a single
1014 * argument. The not2/binary_negate combination works on predicates taking
1015 * two arguments.
1016 *
1017 * @deprecated Deprecated in C++17, no longer in the standard since C++20.
1018 * Use `not_fn` instead.
1019 *
1020 * @{
1021 */
1022 /// One of the @link negators negation functors@endlink.
1023 template<typename _Predicate>
1024 class _GLIBCXX17_DEPRECATED unary_negate
1025 : public unary_function<typename _Predicate::argument_type, bool>
1026 {
1027 protected:
1028 _Predicate _M_pred;
1029
1030 public:
1031 _GLIBCXX14_CONSTEXPR
1032 explicit
1033 unary_negate(const _Predicate& __x) : _M_pred(__x) { }
1034
1035 _GLIBCXX14_CONSTEXPR
1036 bool
1037 operator()(const typename _Predicate::argument_type& __x) const
1038 { return !_M_pred(__x); }
1039 };
1040
1041 /// One of the @link negators negation functors@endlink.
1042 template<typename _Predicate>
1043 _GLIBCXX17_DEPRECATED_SUGGEST("std::not_fn")
1044 _GLIBCXX14_CONSTEXPR
1045 inline unary_negate<_Predicate>
1046 not1(const _Predicate& __pred)
1047 { return unary_negate<_Predicate>(__pred); }
1048
1049 /// One of the @link negators negation functors@endlink.
1050 template<typename _Predicate>
1051 class _GLIBCXX17_DEPRECATED binary_negate
1052 : public binary_function<typename _Predicate::first_argument_type,
1053 typename _Predicate::second_argument_type, bool>
1054 {
1055 protected:
1056 _Predicate _M_pred;
1057
1058 public:
1059 _GLIBCXX14_CONSTEXPR
1060 explicit
1061 binary_negate(const _Predicate& __x) : _M_pred(__x) { }
1062
1063 _GLIBCXX14_CONSTEXPR
1064 bool
1065 operator()(const typename _Predicate::first_argument_type& __x,
1066 const typename _Predicate::second_argument_type& __y) const
1067 { return !_M_pred(__x, __y); }
1068 };
1069
1070 /// One of the @link negators negation functors@endlink.
1071 template<typename _Predicate>
1072 _GLIBCXX17_DEPRECATED_SUGGEST("std::not_fn")
1073 _GLIBCXX14_CONSTEXPR
1074 inline binary_negate<_Predicate>
1075 not2(const _Predicate& __pred)
1076 { return binary_negate<_Predicate>(__pred); }
1077 /** @} */
1078
1079 // 20.3.7 adaptors pointers functions
1080 /** @defgroup pointer_adaptors Adaptors for pointers to functions
1081 * @ingroup functors
1082 *
1083 * The advantage of function objects over pointers to functions is that
1084 * the objects in the standard library declare nested typedefs describing
1085 * their argument and result types with uniform names (e.g., `result_type`
1086 * from the base classes `unary_function` and `binary_function`).
1087 * Sometimes those typedefs are required, not just optional.
1088 *
1089 * Adaptors are provided to turn pointers to unary (single-argument) and
1090 * binary (double-argument) functions into function objects. The
1091 * long-winded functor `pointer_to_unary_function` is constructed with a
1092 * function pointer `f`, and its `operator()` called with argument `x`
1093 * returns `f(x)`. The functor `pointer_to_binary_function` does the same
1094 * thing, but with a double-argument `f` and `operator()`.
1095 *
1096 * The function `ptr_fun` takes a pointer-to-function `f` and constructs
1097 * an instance of the appropriate functor.
1098 *
1099 * @deprecated Deprecated in C++11, no longer in the standard since C++17.
1100 *
1101 * @{
1102 */
1103 /// One of the @link pointer_adaptors adaptors for function pointers@endlink.
1104 template<typename _Arg, typename _Result>
1105 class pointer_to_unary_function : public unary_function<_Arg, _Result>
1106 {
1107 protected:
1108 _Result (*_M_ptr)(_Arg);
1109
1110 public:
1111 pointer_to_unary_function() { }
1112
1113 explicit
1114 pointer_to_unary_function(_Result (*__x)(_Arg))
1115 : _M_ptr(__x) { }
1116
1117 _Result
1118 operator()(_Arg __x) const
1119 { return _M_ptr(__x); }
1120 } _GLIBCXX11_DEPRECATED;
1121
1122 /// One of the @link pointer_adaptors adaptors for function pointers@endlink.
1123 template<typename _Arg, typename _Result>
1124 _GLIBCXX11_DEPRECATED_SUGGEST("std::function")
1125 inline pointer_to_unary_function<_Arg, _Result>
1126 ptr_fun(_Result (*__x)(_Arg))
1127 { return pointer_to_unary_function<_Arg, _Result>(__x); }
1128
1129 /// One of the @link pointer_adaptors adaptors for function pointers@endlink.
1130 template<typename _Arg1, typename _Arg2, typename _Result>
1131 class pointer_to_binary_function
1132 : public binary_function<_Arg1, _Arg2, _Result>
1133 {
1134 protected:
1135 _Result (*_M_ptr)(_Arg1, _Arg2);
1136
1137 public:
1138 pointer_to_binary_function() { }
1139
1140 explicit
1141 pointer_to_binary_function(_Result (*__x)(_Arg1, _Arg2))
1142 : _M_ptr(__x) { }
1143
1144 _Result
1145 operator()(_Arg1 __x, _Arg2 __y) const
1146 { return _M_ptr(__x, __y); }
1147 } _GLIBCXX11_DEPRECATED;
1148
1149 /// One of the @link pointer_adaptors adaptors for function pointers@endlink.
1150 template<typename _Arg1, typename _Arg2, typename _Result>
1151 _GLIBCXX11_DEPRECATED_SUGGEST("std::function")
1152 inline pointer_to_binary_function<_Arg1, _Arg2, _Result>
1153 ptr_fun(_Result (*__x)(_Arg1, _Arg2))
1154 { return pointer_to_binary_function<_Arg1, _Arg2, _Result>(__x); }
1155 /** @} */
1156
1157 template<typename _Tp>
1158 struct _Identity
1159 : public unary_function<_Tp, _Tp>
1160 {
1161 _Tp&
1162 operator()(_Tp& __x) const
1163 { return __x; }
1164
1165 const _Tp&
1166 operator()(const _Tp& __x) const
1167 { return __x; }
1168 };
1169
1170 // Partial specialization, avoids confusing errors in e.g. std::set<const T>.
1171 template<typename _Tp> struct _Identity<const _Tp> : _Identity<_Tp> { };
1172
1173 template<typename _Pair>
1174 struct _Select1st
1175 : public unary_function<_Pair, typename _Pair::first_type>
1176 {
1177 typename _Pair::first_type&
1178 operator()(_Pair& __x) const
1179 { return __x.first; }
1180
1181 const typename _Pair::first_type&
1182 operator()(const _Pair& __x) const
1183 { return __x.first; }
1184
1185 #if __cplusplus >= 201103L
1186 template<typename _Pair2>
1187 typename _Pair2::first_type&
1188 operator()(_Pair2& __x) const
1189 { return __x.first; }
1190
1191 template<typename _Pair2>
1192 const typename _Pair2::first_type&
1193 operator()(const _Pair2& __x) const
1194 { return __x.first; }
1195 #endif
1196 };
1197
1198 template<typename _Pair>
1199 struct _Select2nd
1200 : public unary_function<_Pair, typename _Pair::second_type>
1201 {
1202 typename _Pair::second_type&
1203 operator()(_Pair& __x) const
1204 { return __x.second; }
1205
1206 const typename _Pair::second_type&
1207 operator()(const _Pair& __x) const
1208 { return __x.second; }
1209 };
1210
1211 // 20.3.8 adaptors pointers members
1212 /** @defgroup ptrmem_adaptors Adaptors for pointers to members
1213 * @ingroup functors
1214 *
1215 * There are a total of 8 = 2^3 function objects in this family.
1216 * (1) Member functions taking no arguments vs member functions taking
1217 * one argument.
1218 * (2) Call through pointer vs call through reference.
1219 * (3) Const vs non-const member function.
1220 *
1221 * All of this complexity is in the function objects themselves. You can
1222 * ignore it by using the helper function `mem_fun` and `mem_fun_ref`,
1223 * which create whichever type of adaptor is appropriate.
1224 *
1225 * @deprecated Deprecated in C++11, no longer in the standard since C++17.
1226 * Use `mem_fn` instead.
1227 *
1228 * @{
1229 */
1230 /// One of the @link ptrmem_adaptors adaptors for member pointers@endlink.
1231 template<typename _Ret, typename _Tp>
1232 class mem_fun_t : public unary_function<_Tp*, _Ret>
1233 {
1234 public:
1235 explicit
1236 mem_fun_t(_Ret (_Tp::*__pf)())
1237 : _M_f(__pf) { }
1238
1239 _Ret
1240 operator()(_Tp* __p) const
1241 { return (__p->*_M_f)(); }
1242
1243 private:
1244 _Ret (_Tp::*_M_f)();
1245 } _GLIBCXX11_DEPRECATED;
1246
1247 /// One of the @link ptrmem_adaptors adaptors for member pointers@endlink.
1248 template<typename _Ret, typename _Tp>
1249 class const_mem_fun_t : public unary_function<const _Tp*, _Ret>
1250 {
1251 public:
1252 explicit
1253 const_mem_fun_t(_Ret (_Tp::*__pf)() const)
1254 : _M_f(__pf) { }
1255
1256 _Ret
1257 operator()(const _Tp* __p) const
1258 { return (__p->*_M_f)(); }
1259
1260 private:
1261 _Ret (_Tp::*_M_f)() const;
1262 } _GLIBCXX11_DEPRECATED;
1263
1264 /// One of the @link ptrmem_adaptors adaptors for member pointers@endlink.
1265 template<typename _Ret, typename _Tp>
1266 class mem_fun_ref_t : public unary_function<_Tp, _Ret>
1267 {
1268 public:
1269 explicit
1270 mem_fun_ref_t(_Ret (_Tp::*__pf)())
1271 : _M_f(__pf) { }
1272
1273 _Ret
1274 operator()(_Tp& __r) const
1275 { return (__r.*_M_f)(); }
1276
1277 private:
1278 _Ret (_Tp::*_M_f)();
1279 } _GLIBCXX11_DEPRECATED;
1280
1281 /// One of the @link ptrmem_adaptors adaptors for member pointers@endlink.
1282 template<typename _Ret, typename _Tp>
1283 class const_mem_fun_ref_t : public unary_function<_Tp, _Ret>
1284 {
1285 public:
1286 explicit
1287 const_mem_fun_ref_t(_Ret (_Tp::*__pf)() const)
1288 : _M_f(__pf) { }
1289
1290 _Ret
1291 operator()(const _Tp& __r) const
1292 { return (__r.*_M_f)(); }
1293
1294 private:
1295 _Ret (_Tp::*_M_f)() const;
1296 } _GLIBCXX11_DEPRECATED;
1297
1298 /// One of the @link ptrmem_adaptors adaptors for member pointers@endlink.
1299 template<typename _Ret, typename _Tp, typename _Arg>
1300 class mem_fun1_t : public binary_function<_Tp*, _Arg, _Ret>
1301 {
1302 public:
1303 explicit
1304 mem_fun1_t(_Ret (_Tp::*__pf)(_Arg))
1305 : _M_f(__pf) { }
1306
1307 _Ret
1308 operator()(_Tp* __p, _Arg __x) const
1309 { return (__p->*_M_f)(__x); }
1310
1311 private:
1312 _Ret (_Tp::*_M_f)(_Arg);
1313 } _GLIBCXX11_DEPRECATED;
1314
1315 /// One of the @link ptrmem_adaptors adaptors for member pointers@endlink.
1316 template<typename _Ret, typename _Tp, typename _Arg>
1317 class const_mem_fun1_t : public binary_function<const _Tp*, _Arg, _Ret>
1318 {
1319 public:
1320 explicit
1321 const_mem_fun1_t(_Ret (_Tp::*__pf)(_Arg) const)
1322 : _M_f(__pf) { }
1323
1324 _Ret
1325 operator()(const _Tp* __p, _Arg __x) const
1326 { return (__p->*_M_f)(__x); }
1327
1328 private:
1329 _Ret (_Tp::*_M_f)(_Arg) const;
1330 } _GLIBCXX11_DEPRECATED;
1331
1332 /// One of the @link ptrmem_adaptors adaptors for member pointers@endlink.
1333 template<typename _Ret, typename _Tp, typename _Arg>
1334 class mem_fun1_ref_t : public binary_function<_Tp, _Arg, _Ret>
1335 {
1336 public:
1337 explicit
1338 mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg))
1339 : _M_f(__pf) { }
1340
1341 _Ret
1342 operator()(_Tp& __r, _Arg __x) const
1343 { return (__r.*_M_f)(__x); }
1344
1345 private:
1346 _Ret (_Tp::*_M_f)(_Arg);
1347 } _GLIBCXX11_DEPRECATED;
1348
1349 /// One of the @link ptrmem_adaptors adaptors for member pointers@endlink.
1350 template<typename _Ret, typename _Tp, typename _Arg>
1351 class const_mem_fun1_ref_t : public binary_function<_Tp, _Arg, _Ret>
1352 {
1353 public:
1354 explicit
1355 const_mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg) const)
1356 : _M_f(__pf) { }
1357
1358 _Ret
1359 operator()(const _Tp& __r, _Arg __x) const
1360 { return (__r.*_M_f)(__x); }
1361
1362 private:
1363 _Ret (_Tp::*_M_f)(_Arg) const;
1364 } _GLIBCXX11_DEPRECATED;
1365
1366 // Mem_fun adaptor helper functions. There are only two:
1367 // mem_fun and mem_fun_ref.
1368 template<typename _Ret, typename _Tp>
1369 _GLIBCXX11_DEPRECATED_SUGGEST("std::mem_fn")
1370 inline mem_fun_t<_Ret, _Tp>
1371 mem_fun(_Ret (_Tp::*__f)())
1372 { return mem_fun_t<_Ret, _Tp>(__f); }
1373
1374 template<typename _Ret, typename _Tp>
1375 _GLIBCXX11_DEPRECATED_SUGGEST("std::mem_fn")
1376 inline const_mem_fun_t<_Ret, _Tp>
1377 mem_fun(_Ret (_Tp::*__f)() const)
1378 { return const_mem_fun_t<_Ret, _Tp>(__f); }
1379
1380 template<typename _Ret, typename _Tp>
1381 _GLIBCXX11_DEPRECATED_SUGGEST("std::mem_fn")
1382 inline mem_fun_ref_t<_Ret, _Tp>
1383 mem_fun_ref(_Ret (_Tp::*__f)())
1384 { return mem_fun_ref_t<_Ret, _Tp>(__f); }
1385
1386 template<typename _Ret, typename _Tp>
1387 _GLIBCXX11_DEPRECATED_SUGGEST("std::mem_fn")
1388 inline const_mem_fun_ref_t<_Ret, _Tp>
1389 mem_fun_ref(_Ret (_Tp::*__f)() const)
1390 { return const_mem_fun_ref_t<_Ret, _Tp>(__f); }
1391
1392 template<typename _Ret, typename _Tp, typename _Arg>
1393 _GLIBCXX11_DEPRECATED_SUGGEST("std::mem_fn")
1394 inline mem_fun1_t<_Ret, _Tp, _Arg>
1395 mem_fun(_Ret (_Tp::*__f)(_Arg))
1396 { return mem_fun1_t<_Ret, _Tp, _Arg>(__f); }
1397
1398 template<typename _Ret, typename _Tp, typename _Arg>
1399 _GLIBCXX11_DEPRECATED_SUGGEST("std::mem_fn")
1400 inline const_mem_fun1_t<_Ret, _Tp, _Arg>
1401 mem_fun(_Ret (_Tp::*__f)(_Arg) const)
1402 { return const_mem_fun1_t<_Ret, _Tp, _Arg>(__f); }
1403
1404 template<typename _Ret, typename _Tp, typename _Arg>
1405 _GLIBCXX11_DEPRECATED_SUGGEST("std::mem_fn")
1406 inline mem_fun1_ref_t<_Ret, _Tp, _Arg>
1407 mem_fun_ref(_Ret (_Tp::*__f)(_Arg))
1408 { return mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); }
1409
1410 template<typename _Ret, typename _Tp, typename _Arg>
1411 _GLIBCXX11_DEPRECATED_SUGGEST("std::mem_fn")
1412 inline const_mem_fun1_ref_t<_Ret, _Tp, _Arg>
1413 mem_fun_ref(_Ret (_Tp::*__f)(_Arg) const)
1414 { return const_mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); }
1415 #pragma GCC diagnostic pop
1416
1417 /** @} */
1418
1419 #if __cplusplus >= 201402L
1420 template<typename _Func, typename _SfinaeType, typename = __void_t<>>
1421 struct __has_is_transparent
1422 { };
1423
1424 template<typename _Func, typename _SfinaeType>
1425 struct __has_is_transparent<_Func, _SfinaeType,
1426 __void_t<typename _Func::is_transparent>>
1427 { typedef void type; };
1428
1429 template<typename _Func, typename _SfinaeType>
1430 using __has_is_transparent_t
1431 = typename __has_is_transparent<_Func, _SfinaeType>::type;
1432 #endif
1433
1434 _GLIBCXX_END_NAMESPACE_VERSION
1435 } // namespace
1436
1437 #if (__cplusplus < 201103L) || _GLIBCXX_USE_DEPRECATED
1438 # include <backward/binders.h>
1439 #endif
1440
1441 #endif /* _STL_FUNCTION_H */