1 // Functor implementations -*- C++ -*- 2 3 // Copyright (C) 2001-2014 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 _Tp 170 operator()(const _Tp& __x, const _Tp& __y) const 171 { return __x + __y; } 172 }; 173 174 /// One of the @link arithmetic_functors math functors@endlink. 175 template<typename _Tp> 176 struct minus : public binary_function<_Tp, _Tp, _Tp> 177 { 178 _Tp 179 operator()(const _Tp& __x, const _Tp& __y) const 180 { return __x - __y; } 181 }; 182 183 /// One of the @link arithmetic_functors math functors@endlink. 184 template<typename _Tp> 185 struct multiplies : public binary_function<_Tp, _Tp, _Tp> 186 { 187 _Tp 188 operator()(const _Tp& __x, const _Tp& __y) const 189 { return __x * __y; } 190 }; 191 192 /// One of the @link arithmetic_functors math functors@endlink. 193 template<typename _Tp> 194 struct divides : public binary_function<_Tp, _Tp, _Tp> 195 { 196 _Tp 197 operator()(const _Tp& __x, const _Tp& __y) const 198 { return __x / __y; } 199 }; 200 201 /// One of the @link arithmetic_functors math functors@endlink. 202 template<typename _Tp> 203 struct modulus : public binary_function<_Tp, _Tp, _Tp> 204 { 205 _Tp 206 operator()(const _Tp& __x, const _Tp& __y) const 207 { return __x % __y; } 208 }; 209 210 /// One of the @link arithmetic_functors math functors@endlink. 211 template<typename _Tp> 212 struct negate : public unary_function<_Tp, _Tp> 213 { 214 _Tp 215 operator()(const _Tp& __x) const 216 { return -__x; } 217 }; 218 219 #if __cplusplus > 201103L 220 template<> 221 struct plus<void> 222 { 223 template <typename _Tp, typename _Up> 224 auto 225 operator()(_Tp&& __t, _Up&& __u) const 226 noexcept(noexcept(std::forward<_Tp>(__t) + std::forward<_Up>(__u))) 227 -> decltype(std::forward<_Tp>(__t) + std::forward<_Up>(__u)) 228 { return std::forward<_Tp>(__t) + std::forward<_Up>(__u); } 229 230 typedef __is_transparent is_transparent; 231 }; 232 233 /// One of the @link arithmetic_functors math functors@endlink. 234 template<> 235 struct minus<void> 236 { 237 template <typename _Tp, typename _Up> 238 auto 239 operator()(_Tp&& __t, _Up&& __u) const 240 noexcept(noexcept(std::forward<_Tp>(__t) - std::forward<_Up>(__u))) 241 -> decltype(std::forward<_Tp>(__t) - std::forward<_Up>(__u)) 242 { return std::forward<_Tp>(__t) - std::forward<_Up>(__u); } 243 244 typedef __is_transparent is_transparent; 245 }; 246 247 /// One of the @link arithmetic_functors math functors@endlink. 248 template<> 249 struct multiplies<void> 250 { 251 template <typename _Tp, typename _Up> 252 auto 253 operator()(_Tp&& __t, _Up&& __u) const 254 noexcept(noexcept(std::forward<_Tp>(__t) * std::forward<_Up>(__u))) 255 -> decltype(std::forward<_Tp>(__t) * std::forward<_Up>(__u)) 256 { return std::forward<_Tp>(__t) * std::forward<_Up>(__u); } 257 258 typedef __is_transparent is_transparent; 259 }; 260 261 /// One of the @link arithmetic_functors math functors@endlink. 262 template<> 263 struct divides<void> 264 { 265 template <typename _Tp, typename _Up> 266 auto 267 operator()(_Tp&& __t, _Up&& __u) const 268 noexcept(noexcept(std::forward<_Tp>(__t) / std::forward<_Up>(__u))) 269 -> decltype(std::forward<_Tp>(__t) / std::forward<_Up>(__u)) 270 { return std::forward<_Tp>(__t) / std::forward<_Up>(__u); } 271 272 typedef __is_transparent is_transparent; 273 }; 274 275 /// One of the @link arithmetic_functors math functors@endlink. 276 template<> 277 struct modulus<void> 278 { 279 template <typename _Tp, typename _Up> 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 negate<void> 292 { 293 template <typename _Tp> 294 auto 295 operator()(_Tp&& __t) const 296 noexcept(noexcept(-std::forward<_Tp>(__t))) 297 -> decltype(-std::forward<_Tp>(__t)) 298 { return -std::forward<_Tp>(__t); } 299 300 typedef __is_transparent is_transparent; 301 }; 302 #endif 303 /** @} */ 304 305 // 20.3.3 comparisons 306 /** @defgroup comparison_functors Comparison Classes 307 * @ingroup functors 308 * 309 * The library provides six wrapper functors for all the basic comparisons 310 * in C++, like @c <. 311 * 312 * @{ 313 */ 314 #if __cplusplus > 201103L 315 template<typename _Tp = void> 316 struct equal_to; 317 318 template<typename _Tp = void> 319 struct not_equal_to; 320 321 template<typename _Tp = void> 322 struct greater; 323 324 template<typename _Tp = void> 325 struct less; 326 327 template<typename _Tp = void> 328 struct greater_equal; 329 330 template<typename _Tp = void> 331 struct less_equal; 332 #endif 333 334 /// One of the @link comparison_functors comparison functors@endlink. 335 template<typename _Tp> 336 struct equal_to : public binary_function<_Tp, _Tp, bool> 337 { 338 bool 339 operator()(const _Tp& __x, const _Tp& __y) const 340 { return __x == __y; } 341 }; 342 343 /// One of the @link comparison_functors comparison functors@endlink. 344 template<typename _Tp> 345 struct not_equal_to : public binary_function<_Tp, _Tp, bool> 346 { 347 bool 348 operator()(const _Tp& __x, const _Tp& __y) const 349 { return __x != __y; } 350 }; 351 352 /// One of the @link comparison_functors comparison functors@endlink. 353 template<typename _Tp> 354 struct greater : public binary_function<_Tp, _Tp, bool> 355 { 356 bool 357 operator()(const _Tp& __x, const _Tp& __y) const 358 { return __x > __y; } 359 }; 360 361 /// One of the @link comparison_functors comparison functors@endlink. 362 template<typename _Tp> 363 struct less : public binary_function<_Tp, _Tp, bool> 364 { 365 bool 366 operator()(const _Tp& __x, const _Tp& __y) const 367 { return __x < __y; } 368 }; 369 370 /// One of the @link comparison_functors comparison functors@endlink. 371 template<typename _Tp> 372 struct greater_equal : public binary_function<_Tp, _Tp, bool> 373 { 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_equal : public binary_function<_Tp, _Tp, bool> 382 { 383 bool 384 operator()(const _Tp& __x, const _Tp& __y) const 385 { return __x <= __y; } 386 }; 387 388 #if __cplusplus > 201103L 389 /// One of the @link comparison_functors comparison functors@endlink. 390 template<> 391 struct equal_to<void> 392 { 393 template <typename _Tp, typename _Up> 394 auto 395 operator()(_Tp&& __t, _Up&& __u) const 396 noexcept(noexcept(std::forward<_Tp>(__t) == std::forward<_Up>(__u))) 397 -> decltype(std::forward<_Tp>(__t) == std::forward<_Up>(__u)) 398 { return std::forward<_Tp>(__t) == std::forward<_Up>(__u); } 399 400 typedef __is_transparent is_transparent; 401 }; 402 403 /// One of the @link comparison_functors comparison functors@endlink. 404 template<> 405 struct not_equal_to<void> 406 { 407 template <typename _Tp, typename _Up> 408 auto 409 operator()(_Tp&& __t, _Up&& __u) const 410 noexcept(noexcept(std::forward<_Tp>(__t) != std::forward<_Up>(__u))) 411 -> decltype(std::forward<_Tp>(__t) != std::forward<_Up>(__u)) 412 { return std::forward<_Tp>(__t) != std::forward<_Up>(__u); } 413 414 typedef __is_transparent is_transparent; 415 }; 416 417 /// One of the @link comparison_functors comparison functors@endlink. 418 template<> 419 struct greater<void> 420 { 421 template <typename _Tp, typename _Up> 422 auto 423 operator()(_Tp&& __t, _Up&& __u) const 424 noexcept(noexcept(std::forward<_Tp>(__t) > std::forward<_Up>(__u))) 425 -> decltype(std::forward<_Tp>(__t) > std::forward<_Up>(__u)) 426 { return std::forward<_Tp>(__t) > std::forward<_Up>(__u); } 427 428 typedef __is_transparent is_transparent; 429 }; 430 431 /// One of the @link comparison_functors comparison functors@endlink. 432 template<> 433 struct less<void> 434 { 435 template <typename _Tp, typename _Up> 436 auto 437 operator()(_Tp&& __t, _Up&& __u) const 438 noexcept(noexcept(std::forward<_Tp>(__t) < std::forward<_Up>(__u))) 439 -> decltype(std::forward<_Tp>(__t) < std::forward<_Up>(__u)) 440 { return std::forward<_Tp>(__t) < std::forward<_Up>(__u); } 441 442 typedef __is_transparent is_transparent; 443 }; 444 445 /// One of the @link comparison_functors comparison functors@endlink. 446 template<> 447 struct greater_equal<void> 448 { 449 template <typename _Tp, typename _Up> 450 auto 451 operator()(_Tp&& __t, _Up&& __u) const 452 noexcept(noexcept(std::forward<_Tp>(__t) >= std::forward<_Up>(__u))) 453 -> decltype(std::forward<_Tp>(__t) >= std::forward<_Up>(__u)) 454 { return std::forward<_Tp>(__t) >= std::forward<_Up>(__u); } 455 456 typedef __is_transparent is_transparent; 457 }; 458 459 /// One of the @link comparison_functors comparison functors@endlink. 460 template<> 461 struct less_equal<void> 462 { 463 template <typename _Tp, typename _Up> 464 auto 465 operator()(_Tp&& __t, _Up&& __u) const 466 noexcept(noexcept(std::forward<_Tp>(__t) <= std::forward<_Up>(__u))) 467 -> decltype(std::forward<_Tp>(__t) <= std::forward<_Up>(__u)) 468 { return std::forward<_Tp>(__t) <= std::forward<_Up>(__u); } 469 470 typedef __is_transparent is_transparent; 471 }; 472 #endif 473 /** @} */ 474 475 // 20.3.4 logical operations 476 /** @defgroup logical_functors Boolean Operations Classes 477 * @ingroup functors 478 * 479 * Here are wrapper functors for Boolean operations: @c &&, @c ||, 480 * and @c !. 481 * 482 * @{ 483 */ 484 #if __cplusplus > 201103L 485 template<typename _Tp = void> 486 struct logical_and; 487 488 template<typename _Tp = void> 489 struct logical_or; 490 491 template<typename _Tp = void> 492 struct logical_not; 493 #endif 494 495 /// One of the @link logical_functors Boolean operations functors@endlink. 496 template<typename _Tp> 497 struct logical_and : public binary_function<_Tp, _Tp, bool> 498 { 499 bool 500 operator()(const _Tp& __x, const _Tp& __y) const 501 { return __x && __y; } 502 }; 503 504 /// One of the @link logical_functors Boolean operations functors@endlink. 505 template<typename _Tp> 506 struct logical_or : public binary_function<_Tp, _Tp, bool> 507 { 508 bool 509 operator()(const _Tp& __x, const _Tp& __y) const 510 { return __x || __y; } 511 }; 512 513 /// One of the @link logical_functors Boolean operations functors@endlink. 514 template<typename _Tp> 515 struct logical_not : public unary_function<_Tp, bool> 516 { 517 bool 518 operator()(const _Tp& __x) const 519 { return !__x; } 520 }; 521 522 #if __cplusplus > 201103L 523 /// One of the @link logical_functors Boolean operations functors@endlink. 524 template<> 525 struct logical_and<void> 526 { 527 template <typename _Tp, typename _Up> 528 auto 529 operator()(_Tp&& __t, _Up&& __u) const 530 noexcept(noexcept(std::forward<_Tp>(__t) && std::forward<_Up>(__u))) 531 -> decltype(std::forward<_Tp>(__t) && std::forward<_Up>(__u)) 532 { return std::forward<_Tp>(__t) && std::forward<_Up>(__u); } 533 534 typedef __is_transparent is_transparent; 535 }; 536 537 /// One of the @link logical_functors Boolean operations functors@endlink. 538 template<> 539 struct logical_or<void> 540 { 541 template <typename _Tp, typename _Up> 542 auto 543 operator()(_Tp&& __t, _Up&& __u) const 544 noexcept(noexcept(std::forward<_Tp>(__t) || std::forward<_Up>(__u))) 545 -> decltype(std::forward<_Tp>(__t) || std::forward<_Up>(__u)) 546 { return std::forward<_Tp>(__t) || std::forward<_Up>(__u); } 547 548 typedef __is_transparent is_transparent; 549 }; 550 551 /// One of the @link logical_functors Boolean operations functors@endlink. 552 template<> 553 struct logical_not<void> 554 { 555 template <typename _Tp> 556 auto 557 operator()(_Tp&& __t) const 558 noexcept(noexcept(!std::forward<_Tp>(__t))) 559 -> decltype(!std::forward<_Tp>(__t)) 560 { return !std::forward<_Tp>(__t); } 561 562 typedef __is_transparent is_transparent; 563 }; 564 #endif 565 /** @} */ 566 567 #if __cplusplus > 201103L 568 template<typename _Tp = void> 569 struct bit_and; 570 571 template<typename _Tp = void> 572 struct bit_or; 573 574 template<typename _Tp = void> 575 struct bit_xor; 576 577 template<typename _Tp = void> 578 struct bit_not; 579 #endif 580 581 // _GLIBCXX_RESOLVE_LIB_DEFECTS 582 // DR 660. Missing Bitwise Operations. 583 template<typename _Tp> 584 struct bit_and : public binary_function<_Tp, _Tp, _Tp> 585 { 586 _Tp 587 operator()(const _Tp& __x, const _Tp& __y) const 588 { return __x & __y; } 589 }; 590 591 template<typename _Tp> 592 struct bit_or : public binary_function<_Tp, _Tp, _Tp> 593 { 594 _Tp 595 operator()(const _Tp& __x, const _Tp& __y) const 596 { return __x | __y; } 597 }; 598 599 template<typename _Tp> 600 struct bit_xor : public binary_function<_Tp, _Tp, _Tp> 601 { 602 _Tp 603 operator()(const _Tp& __x, const _Tp& __y) const 604 { return __x ^ __y; } 605 }; 606 607 template<typename _Tp> 608 struct bit_not : public unary_function<_Tp, _Tp> 609 { 610 _Tp 611 operator()(const _Tp& __x) const 612 { return ~__x; } 613 }; 614 615 #if __cplusplus > 201103L 616 template <> 617 struct bit_and<void> 618 { 619 template <typename _Tp, typename _Up> 620 auto 621 operator()(_Tp&& __t, _Up&& __u) const 622 noexcept(noexcept(std::forward<_Tp>(__t) & std::forward<_Up>(__u))) 623 -> decltype(std::forward<_Tp>(__t) & std::forward<_Up>(__u)) 624 { return std::forward<_Tp>(__t) & std::forward<_Up>(__u); } 625 626 typedef __is_transparent is_transparent; 627 }; 628 629 template <> 630 struct bit_or<void> 631 { 632 template <typename _Tp, typename _Up> 633 auto 634 operator()(_Tp&& __t, _Up&& __u) const 635 noexcept(noexcept(std::forward<_Tp>(__t) | std::forward<_Up>(__u))) 636 -> decltype(std::forward<_Tp>(__t) | std::forward<_Up>(__u)) 637 { return std::forward<_Tp>(__t) | std::forward<_Up>(__u); } 638 639 typedef __is_transparent is_transparent; 640 }; 641 642 template <> 643 struct bit_xor<void> 644 { 645 template <typename _Tp, typename _Up> 646 auto 647 operator()(_Tp&& __t, _Up&& __u) const 648 noexcept(noexcept(std::forward<_Tp>(__t) ^ std::forward<_Up>(__u))) 649 -> decltype(std::forward<_Tp>(__t) ^ std::forward<_Up>(__u)) 650 { return std::forward<_Tp>(__t) ^ std::forward<_Up>(__u); } 651 652 typedef __is_transparent is_transparent; 653 }; 654 655 template <> 656 struct bit_not<void> 657 { 658 template <typename _Tp> 659 auto 660 operator()(_Tp&& __t) const 661 noexcept(noexcept(~std::forward<_Tp>(__t))) 662 -> decltype(~std::forward<_Tp>(__t)) 663 { return ~std::forward<_Tp>(__t); } 664 665 typedef __is_transparent is_transparent; 666 }; 667 #endif 668 669 // 20.3.5 negators 670 /** @defgroup negators Negators 671 * @ingroup functors 672 * 673 * The functions @c not1 and @c not2 each take a predicate functor 674 * and return an instance of @c unary_negate or 675 * @c binary_negate, respectively. These classes are functors whose 676 * @c operator() performs the stored predicate function and then returns 677 * the negation of the result. 678 * 679 * For example, given a vector of integers and a trivial predicate, 680 * \code 681 * struct IntGreaterThanThree 682 * : public std::unary_function<int, bool> 683 * { 684 * bool operator() (int x) { return x > 3; } 685 * }; 686 * 687 * std::find_if (v.begin(), v.end(), not1(IntGreaterThanThree())); 688 * \endcode 689 * The call to @c find_if will locate the first index (i) of @c v for which 690 * <code>!(v[i] > 3)</code> is true. 691 * 692 * The not1/unary_negate combination works on predicates taking a single 693 * argument. The not2/binary_negate combination works on predicates which 694 * take two arguments. 695 * 696 * @{ 697 */ 698 /// One of the @link negators negation functors@endlink. 699 template<typename _Predicate> 700 class unary_negate 701 : public unary_function<typename _Predicate::argument_type, bool> 702 { 703 protected: 704 _Predicate _M_pred; 705 706 public: 707 explicit 708 unary_negate(const _Predicate& __x) : _M_pred(__x) { } 709 710 bool 711 operator()(const typename _Predicate::argument_type& __x) const 712 { return !_M_pred(__x); } 713 }; 714 715 /// One of the @link negators negation functors@endlink. 716 template<typename _Predicate> 717 inline unary_negate<_Predicate> 718 not1(const _Predicate& __pred) 719 { return unary_negate<_Predicate>(__pred); } 720 721 /// One of the @link negators negation functors@endlink. 722 template<typename _Predicate> 723 class binary_negate 724 : public binary_function<typename _Predicate::first_argument_type, 725 typename _Predicate::second_argument_type, bool> 726 { 727 protected: 728 _Predicate _M_pred; 729 730 public: 731 explicit 732 binary_negate(const _Predicate& __x) : _M_pred(__x) { } 733 734 bool 735 operator()(const typename _Predicate::first_argument_type& __x, 736 const typename _Predicate::second_argument_type& __y) const 737 { return !_M_pred(__x, __y); } 738 }; 739 740 /// One of the @link negators negation functors@endlink. 741 template<typename _Predicate> 742 inline binary_negate<_Predicate> 743 not2(const _Predicate& __pred) 744 { return binary_negate<_Predicate>(__pred); } 745 /** @} */ 746 747 // 20.3.7 adaptors pointers functions 748 /** @defgroup pointer_adaptors Adaptors for pointers to functions 749 * @ingroup functors 750 * 751 * The advantage of function objects over pointers to functions is that 752 * the objects in the standard library declare nested typedefs describing 753 * their argument and result types with uniform names (e.g., @c result_type 754 * from the base classes @c unary_function and @c binary_function). 755 * Sometimes those typedefs are required, not just optional. 756 * 757 * Adaptors are provided to turn pointers to unary (single-argument) and 758 * binary (double-argument) functions into function objects. The 759 * long-winded functor @c pointer_to_unary_function is constructed with a 760 * function pointer @c f, and its @c operator() called with argument @c x 761 * returns @c f(x). The functor @c pointer_to_binary_function does the same 762 * thing, but with a double-argument @c f and @c operator(). 763 * 764 * The function @c ptr_fun takes a pointer-to-function @c f and constructs 765 * an instance of the appropriate functor. 766 * 767 * @{ 768 */ 769 /// One of the @link pointer_adaptors adaptors for function pointers@endlink. 770 template<typename _Arg, typename _Result> 771 class pointer_to_unary_function : public unary_function<_Arg, _Result> 772 { 773 protected: 774 _Result (*_M_ptr)(_Arg); 775 776 public: 777 pointer_to_unary_function() { } 778 779 explicit 780 pointer_to_unary_function(_Result (*__x)(_Arg)) 781 : _M_ptr(__x) { } 782 783 _Result 784 operator()(_Arg __x) const 785 { return _M_ptr(__x); } 786 }; 787 788 /// One of the @link pointer_adaptors adaptors for function pointers@endlink. 789 template<typename _Arg, typename _Result> 790 inline pointer_to_unary_function<_Arg, _Result> 791 ptr_fun(_Result (*__x)(_Arg)) 792 { return pointer_to_unary_function<_Arg, _Result>(__x); } 793 794 /// One of the @link pointer_adaptors adaptors for function pointers@endlink. 795 template<typename _Arg1, typename _Arg2, typename _Result> 796 class pointer_to_binary_function 797 : public binary_function<_Arg1, _Arg2, _Result> 798 { 799 protected: 800 _Result (*_M_ptr)(_Arg1, _Arg2); 801 802 public: 803 pointer_to_binary_function() { } 804 805 explicit 806 pointer_to_binary_function(_Result (*__x)(_Arg1, _Arg2)) 807 : _M_ptr(__x) { } 808 809 _Result 810 operator()(_Arg1 __x, _Arg2 __y) const 811 { return _M_ptr(__x, __y); } 812 }; 813 814 /// One of the @link pointer_adaptors adaptors for function pointers@endlink. 815 template<typename _Arg1, typename _Arg2, typename _Result> 816 inline pointer_to_binary_function<_Arg1, _Arg2, _Result> 817 ptr_fun(_Result (*__x)(_Arg1, _Arg2)) 818 { return pointer_to_binary_function<_Arg1, _Arg2, _Result>(__x); } 819 /** @} */ 820 821 template<typename _Tp> 822 struct _Identity 823 : public unary_function<_Tp,_Tp> 824 { 825 _Tp& 826 operator()(_Tp& __x) const 827 { return __x; } 828 829 const _Tp& 830 operator()(const _Tp& __x) const 831 { return __x; } 832 }; 833 834 template<typename _Pair> 835 struct _Select1st 836 : public unary_function<_Pair, typename _Pair::first_type> 837 { 838 typename _Pair::first_type& 839 operator()(_Pair& __x) const 840 { return __x.first; } 841 842 const typename _Pair::first_type& 843 operator()(const _Pair& __x) const 844 { return __x.first; } 845 846 #if __cplusplus >= 201103L 847 template<typename _Pair2> 848 typename _Pair2::first_type& 849 operator()(_Pair2& __x) const 850 { return __x.first; } 851 852 template<typename _Pair2> 853 const typename _Pair2::first_type& 854 operator()(const _Pair2& __x) const 855 { return __x.first; } 856 #endif 857 }; 858 859 template<typename _Pair> 860 struct _Select2nd 861 : public unary_function<_Pair, typename _Pair::second_type> 862 { 863 typename _Pair::second_type& 864 operator()(_Pair& __x) const 865 { return __x.second; } 866 867 const typename _Pair::second_type& 868 operator()(const _Pair& __x) const 869 { return __x.second; } 870 }; 871 872 // 20.3.8 adaptors pointers members 873 /** @defgroup memory_adaptors Adaptors for pointers to members 874 * @ingroup functors 875 * 876 * There are a total of 8 = 2^3 function objects in this family. 877 * (1) Member functions taking no arguments vs member functions taking 878 * one argument. 879 * (2) Call through pointer vs call through reference. 880 * (3) Const vs non-const member function. 881 * 882 * All of this complexity is in the function objects themselves. You can 883 * ignore it by using the helper function mem_fun and mem_fun_ref, 884 * which create whichever type of adaptor is appropriate. 885 * 886 * @{ 887 */ 888 /// One of the @link memory_adaptors adaptors for member 889 /// pointers@endlink. 890 template<typename _Ret, typename _Tp> 891 class mem_fun_t : public unary_function<_Tp*, _Ret> 892 { 893 public: 894 explicit 895 mem_fun_t(_Ret (_Tp::*__pf)()) 896 : _M_f(__pf) { } 897 898 _Ret 899 operator()(_Tp* __p) const 900 { return (__p->*_M_f)(); } 901 902 private: 903 _Ret (_Tp::*_M_f)(); 904 }; 905 906 /// One of the @link memory_adaptors adaptors for member 907 /// pointers@endlink. 908 template<typename _Ret, typename _Tp> 909 class const_mem_fun_t : public unary_function<const _Tp*, _Ret> 910 { 911 public: 912 explicit 913 const_mem_fun_t(_Ret (_Tp::*__pf)() const) 914 : _M_f(__pf) { } 915 916 _Ret 917 operator()(const _Tp* __p) const 918 { return (__p->*_M_f)(); } 919 920 private: 921 _Ret (_Tp::*_M_f)() const; 922 }; 923 924 /// One of the @link memory_adaptors adaptors for member 925 /// pointers@endlink. 926 template<typename _Ret, typename _Tp> 927 class mem_fun_ref_t : public unary_function<_Tp, _Ret> 928 { 929 public: 930 explicit 931 mem_fun_ref_t(_Ret (_Tp::*__pf)()) 932 : _M_f(__pf) { } 933 934 _Ret 935 operator()(_Tp& __r) const 936 { return (__r.*_M_f)(); } 937 938 private: 939 _Ret (_Tp::*_M_f)(); 940 }; 941 942 /// One of the @link memory_adaptors adaptors for member 943 /// pointers@endlink. 944 template<typename _Ret, typename _Tp> 945 class const_mem_fun_ref_t : public unary_function<_Tp, _Ret> 946 { 947 public: 948 explicit 949 const_mem_fun_ref_t(_Ret (_Tp::*__pf)() const) 950 : _M_f(__pf) { } 951 952 _Ret 953 operator()(const _Tp& __r) const 954 { return (__r.*_M_f)(); } 955 956 private: 957 _Ret (_Tp::*_M_f)() const; 958 }; 959 960 /// One of the @link memory_adaptors adaptors for member 961 /// pointers@endlink. 962 template<typename _Ret, typename _Tp, typename _Arg> 963 class mem_fun1_t : public binary_function<_Tp*, _Arg, _Ret> 964 { 965 public: 966 explicit 967 mem_fun1_t(_Ret (_Tp::*__pf)(_Arg)) 968 : _M_f(__pf) { } 969 970 _Ret 971 operator()(_Tp* __p, _Arg __x) const 972 { return (__p->*_M_f)(__x); } 973 974 private: 975 _Ret (_Tp::*_M_f)(_Arg); 976 }; 977 978 /// One of the @link memory_adaptors adaptors for member 979 /// pointers@endlink. 980 template<typename _Ret, typename _Tp, typename _Arg> 981 class const_mem_fun1_t : public binary_function<const _Tp*, _Arg, _Ret> 982 { 983 public: 984 explicit 985 const_mem_fun1_t(_Ret (_Tp::*__pf)(_Arg) const) 986 : _M_f(__pf) { } 987 988 _Ret 989 operator()(const _Tp* __p, _Arg __x) const 990 { return (__p->*_M_f)(__x); } 991 992 private: 993 _Ret (_Tp::*_M_f)(_Arg) const; 994 }; 995 996 /// One of the @link memory_adaptors adaptors for member 997 /// pointers@endlink. 998 template<typename _Ret, typename _Tp, typename _Arg> 999 class mem_fun1_ref_t : public binary_function<_Tp, _Arg, _Ret> 1000 { 1001 public: 1002 explicit 1003 mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg)) 1004 : _M_f(__pf) { } 1005 1006 _Ret 1007 operator()(_Tp& __r, _Arg __x) const 1008 { return (__r.*_M_f)(__x); } 1009 1010 private: 1011 _Ret (_Tp::*_M_f)(_Arg); 1012 }; 1013 1014 /// One of the @link memory_adaptors adaptors for member 1015 /// pointers@endlink. 1016 template<typename _Ret, typename _Tp, typename _Arg> 1017 class const_mem_fun1_ref_t : public binary_function<_Tp, _Arg, _Ret> 1018 { 1019 public: 1020 explicit 1021 const_mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg) const) 1022 : _M_f(__pf) { } 1023 1024 _Ret 1025 operator()(const _Tp& __r, _Arg __x) const 1026 { return (__r.*_M_f)(__x); } 1027 1028 private: 1029 _Ret (_Tp::*_M_f)(_Arg) const; 1030 }; 1031 1032 // Mem_fun adaptor helper functions. There are only two: 1033 // mem_fun and mem_fun_ref. 1034 template<typename _Ret, typename _Tp> 1035 inline mem_fun_t<_Ret, _Tp> 1036 mem_fun(_Ret (_Tp::*__f)()) 1037 { return mem_fun_t<_Ret, _Tp>(__f); } 1038 1039 template<typename _Ret, typename _Tp> 1040 inline const_mem_fun_t<_Ret, _Tp> 1041 mem_fun(_Ret (_Tp::*__f)() const) 1042 { return const_mem_fun_t<_Ret, _Tp>(__f); } 1043 1044 template<typename _Ret, typename _Tp> 1045 inline mem_fun_ref_t<_Ret, _Tp> 1046 mem_fun_ref(_Ret (_Tp::*__f)()) 1047 { return mem_fun_ref_t<_Ret, _Tp>(__f); } 1048 1049 template<typename _Ret, typename _Tp> 1050 inline const_mem_fun_ref_t<_Ret, _Tp> 1051 mem_fun_ref(_Ret (_Tp::*__f)() const) 1052 { return const_mem_fun_ref_t<_Ret, _Tp>(__f); } 1053 1054 template<typename _Ret, typename _Tp, typename _Arg> 1055 inline mem_fun1_t<_Ret, _Tp, _Arg> 1056 mem_fun(_Ret (_Tp::*__f)(_Arg)) 1057 { return mem_fun1_t<_Ret, _Tp, _Arg>(__f); } 1058 1059 template<typename _Ret, typename _Tp, typename _Arg> 1060 inline const_mem_fun1_t<_Ret, _Tp, _Arg> 1061 mem_fun(_Ret (_Tp::*__f)(_Arg) const) 1062 { return const_mem_fun1_t<_Ret, _Tp, _Arg>(__f); } 1063 1064 template<typename _Ret, typename _Tp, typename _Arg> 1065 inline mem_fun1_ref_t<_Ret, _Tp, _Arg> 1066 mem_fun_ref(_Ret (_Tp::*__f)(_Arg)) 1067 { return mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); } 1068 1069 template<typename _Ret, typename _Tp, typename _Arg> 1070 inline const_mem_fun1_ref_t<_Ret, _Tp, _Arg> 1071 mem_fun_ref(_Ret (_Tp::*__f)(_Arg) const) 1072 { return const_mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); } 1073 1074 /** @} */ 1075 1076 _GLIBCXX_END_NAMESPACE_VERSION 1077 } // namespace 1078 1079 #if (__cplusplus < 201103L) || _GLIBCXX_USE_DEPRECATED 1080 # include <backward/binders.h> 1081 #endif 1082 1083 #endif /* _STL_FUNCTION_H */ 1084