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