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