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