xref: /netbsd-src/external/gpl3/gcc/dist/libstdc++-v3/include/bits/stl_function.h (revision b1e838363e3c6fc78a55519254d99869742dd33c)
1 // Functor implementations -*- C++ -*-
2 
3 // Copyright (C) 2001-2022 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 
_GLIBCXX_VISIBILITY(default)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 */
1442