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