1 // Iterators -*- C++ -*- 2 3 // Copyright (C) 2001-2013 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_iterator.h 52 * This is an internal header file, included by other library headers. 53 * Do not attempt to use it directly. @headername{iterator} 54 * 55 * This file implements reverse_iterator, back_insert_iterator, 56 * front_insert_iterator, insert_iterator, __normal_iterator, and their 57 * supporting functions and overloaded operators. 58 */ 59 60 #ifndef _STL_ITERATOR_H 61 #define _STL_ITERATOR_H 1 62 63 #include <bits/cpp_type_traits.h> 64 #include <ext/type_traits.h> 65 #include <bits/move.h> 66 67 namespace std _GLIBCXX_VISIBILITY(default) 68 { 69 _GLIBCXX_BEGIN_NAMESPACE_VERSION 70 71 /** 72 * @addtogroup iterators 73 * @{ 74 */ 75 76 // 24.4.1 Reverse iterators 77 /** 78 * Bidirectional and random access iterators have corresponding reverse 79 * %iterator adaptors that iterate through the data structure in the 80 * opposite direction. They have the same signatures as the corresponding 81 * iterators. The fundamental relation between a reverse %iterator and its 82 * corresponding %iterator @c i is established by the identity: 83 * @code 84 * &*(reverse_iterator(i)) == &*(i - 1) 85 * @endcode 86 * 87 * <em>This mapping is dictated by the fact that while there is always a 88 * pointer past the end of an array, there might not be a valid pointer 89 * before the beginning of an array.</em> [24.4.1]/1,2 90 * 91 * Reverse iterators can be tricky and surprising at first. Their 92 * semantics make sense, however, and the trickiness is a side effect of 93 * the requirement that the iterators must be safe. 94 */ 95 template<typename _Iterator> 96 class reverse_iterator 97 : public iterator<typename iterator_traits<_Iterator>::iterator_category, 98 typename iterator_traits<_Iterator>::value_type, 99 typename iterator_traits<_Iterator>::difference_type, 100 typename iterator_traits<_Iterator>::pointer, 101 typename iterator_traits<_Iterator>::reference> 102 { 103 protected: 104 _Iterator current; 105 106 typedef iterator_traits<_Iterator> __traits_type; 107 108 public: 109 typedef _Iterator iterator_type; 110 typedef typename __traits_type::difference_type difference_type; 111 typedef typename __traits_type::pointer pointer; 112 typedef typename __traits_type::reference reference; 113 114 /** 115 * The default constructor value-initializes member @p current. 116 * If it is a pointer, that means it is zero-initialized. 117 */ 118 // _GLIBCXX_RESOLVE_LIB_DEFECTS 119 // 235 No specification of default ctor for reverse_iterator 120 reverse_iterator() : current() { } 121 122 /** 123 * This %iterator will move in the opposite direction that @p x does. 124 */ 125 explicit 126 reverse_iterator(iterator_type __x) : current(__x) { } 127 128 /** 129 * The copy constructor is normal. 130 */ 131 reverse_iterator(const reverse_iterator& __x) 132 : current(__x.current) { } 133 134 /** 135 * A %reverse_iterator across other types can be copied if the 136 * underlying %iterator can be converted to the type of @c current. 137 */ 138 template<typename _Iter> 139 reverse_iterator(const reverse_iterator<_Iter>& __x) 140 : current(__x.base()) { } 141 142 /** 143 * @return @c current, the %iterator used for underlying work. 144 */ 145 iterator_type 146 base() const 147 { return current; } 148 149 /** 150 * @return A reference to the value at @c --current 151 * 152 * This requires that @c --current is dereferenceable. 153 * 154 * @warning This implementation requires that for an iterator of the 155 * underlying iterator type, @c x, a reference obtained by 156 * @c *x remains valid after @c x has been modified or 157 * destroyed. This is a bug: http://gcc.gnu.org/PR51823 158 */ 159 reference 160 operator*() const 161 { 162 _Iterator __tmp = current; 163 return *--__tmp; 164 } 165 166 /** 167 * @return A pointer to the value at @c --current 168 * 169 * This requires that @c --current is dereferenceable. 170 */ 171 pointer 172 operator->() const 173 { return &(operator*()); } 174 175 /** 176 * @return @c *this 177 * 178 * Decrements the underlying iterator. 179 */ 180 reverse_iterator& 181 operator++() 182 { 183 --current; 184 return *this; 185 } 186 187 /** 188 * @return The original value of @c *this 189 * 190 * Decrements the underlying iterator. 191 */ 192 reverse_iterator 193 operator++(int) 194 { 195 reverse_iterator __tmp = *this; 196 --current; 197 return __tmp; 198 } 199 200 /** 201 * @return @c *this 202 * 203 * Increments the underlying iterator. 204 */ 205 reverse_iterator& 206 operator--() 207 { 208 ++current; 209 return *this; 210 } 211 212 /** 213 * @return A reverse_iterator with the previous value of @c *this 214 * 215 * Increments the underlying iterator. 216 */ 217 reverse_iterator 218 operator--(int) 219 { 220 reverse_iterator __tmp = *this; 221 ++current; 222 return __tmp; 223 } 224 225 /** 226 * @return A reverse_iterator that refers to @c current - @a __n 227 * 228 * The underlying iterator must be a Random Access Iterator. 229 */ 230 reverse_iterator 231 operator+(difference_type __n) const 232 { return reverse_iterator(current - __n); } 233 234 /** 235 * @return *this 236 * 237 * Moves the underlying iterator backwards @a __n steps. 238 * The underlying iterator must be a Random Access Iterator. 239 */ 240 reverse_iterator& 241 operator+=(difference_type __n) 242 { 243 current -= __n; 244 return *this; 245 } 246 247 /** 248 * @return A reverse_iterator that refers to @c current - @a __n 249 * 250 * The underlying iterator must be a Random Access Iterator. 251 */ 252 reverse_iterator 253 operator-(difference_type __n) const 254 { return reverse_iterator(current + __n); } 255 256 /** 257 * @return *this 258 * 259 * Moves the underlying iterator forwards @a __n steps. 260 * The underlying iterator must be a Random Access Iterator. 261 */ 262 reverse_iterator& 263 operator-=(difference_type __n) 264 { 265 current += __n; 266 return *this; 267 } 268 269 /** 270 * @return The value at @c current - @a __n - 1 271 * 272 * The underlying iterator must be a Random Access Iterator. 273 */ 274 reference 275 operator[](difference_type __n) const 276 { return *(*this + __n); } 277 }; 278 279 //@{ 280 /** 281 * @param __x A %reverse_iterator. 282 * @param __y A %reverse_iterator. 283 * @return A simple bool. 284 * 285 * Reverse iterators forward many operations to their underlying base() 286 * iterators. Others are implemented in terms of one another. 287 * 288 */ 289 template<typename _Iterator> 290 inline bool 291 operator==(const reverse_iterator<_Iterator>& __x, 292 const reverse_iterator<_Iterator>& __y) 293 { return __x.base() == __y.base(); } 294 295 template<typename _Iterator> 296 inline bool 297 operator<(const reverse_iterator<_Iterator>& __x, 298 const reverse_iterator<_Iterator>& __y) 299 { return __y.base() < __x.base(); } 300 301 template<typename _Iterator> 302 inline bool 303 operator!=(const reverse_iterator<_Iterator>& __x, 304 const reverse_iterator<_Iterator>& __y) 305 { return !(__x == __y); } 306 307 template<typename _Iterator> 308 inline bool 309 operator>(const reverse_iterator<_Iterator>& __x, 310 const reverse_iterator<_Iterator>& __y) 311 { return __y < __x; } 312 313 template<typename _Iterator> 314 inline bool 315 operator<=(const reverse_iterator<_Iterator>& __x, 316 const reverse_iterator<_Iterator>& __y) 317 { return !(__y < __x); } 318 319 template<typename _Iterator> 320 inline bool 321 operator>=(const reverse_iterator<_Iterator>& __x, 322 const reverse_iterator<_Iterator>& __y) 323 { return !(__x < __y); } 324 325 template<typename _Iterator> 326 inline typename reverse_iterator<_Iterator>::difference_type 327 operator-(const reverse_iterator<_Iterator>& __x, 328 const reverse_iterator<_Iterator>& __y) 329 { return __y.base() - __x.base(); } 330 331 template<typename _Iterator> 332 inline reverse_iterator<_Iterator> 333 operator+(typename reverse_iterator<_Iterator>::difference_type __n, 334 const reverse_iterator<_Iterator>& __x) 335 { return reverse_iterator<_Iterator>(__x.base() - __n); } 336 337 // _GLIBCXX_RESOLVE_LIB_DEFECTS 338 // DR 280. Comparison of reverse_iterator to const reverse_iterator. 339 template<typename _IteratorL, typename _IteratorR> 340 inline bool 341 operator==(const reverse_iterator<_IteratorL>& __x, 342 const reverse_iterator<_IteratorR>& __y) 343 { return __x.base() == __y.base(); } 344 345 template<typename _IteratorL, typename _IteratorR> 346 inline bool 347 operator<(const reverse_iterator<_IteratorL>& __x, 348 const reverse_iterator<_IteratorR>& __y) 349 { return __y.base() < __x.base(); } 350 351 template<typename _IteratorL, typename _IteratorR> 352 inline bool 353 operator!=(const reverse_iterator<_IteratorL>& __x, 354 const reverse_iterator<_IteratorR>& __y) 355 { return !(__x == __y); } 356 357 template<typename _IteratorL, typename _IteratorR> 358 inline bool 359 operator>(const reverse_iterator<_IteratorL>& __x, 360 const reverse_iterator<_IteratorR>& __y) 361 { return __y < __x; } 362 363 template<typename _IteratorL, typename _IteratorR> 364 inline bool 365 operator<=(const reverse_iterator<_IteratorL>& __x, 366 const reverse_iterator<_IteratorR>& __y) 367 { return !(__y < __x); } 368 369 template<typename _IteratorL, typename _IteratorR> 370 inline bool 371 operator>=(const reverse_iterator<_IteratorL>& __x, 372 const reverse_iterator<_IteratorR>& __y) 373 { return !(__x < __y); } 374 375 template<typename _IteratorL, typename _IteratorR> 376 #if __cplusplus >= 201103L 377 // DR 685. 378 inline auto 379 operator-(const reverse_iterator<_IteratorL>& __x, 380 const reverse_iterator<_IteratorR>& __y) 381 -> decltype(__y.base() - __x.base()) 382 #else 383 inline typename reverse_iterator<_IteratorL>::difference_type 384 operator-(const reverse_iterator<_IteratorL>& __x, 385 const reverse_iterator<_IteratorR>& __y) 386 #endif 387 { return __y.base() - __x.base(); } 388 //@} 389 390 // 24.4.2.2.1 back_insert_iterator 391 /** 392 * @brief Turns assignment into insertion. 393 * 394 * These are output iterators, constructed from a container-of-T. 395 * Assigning a T to the iterator appends it to the container using 396 * push_back. 397 * 398 * Tip: Using the back_inserter function to create these iterators can 399 * save typing. 400 */ 401 template<typename _Container> 402 class back_insert_iterator 403 : public iterator<output_iterator_tag, void, void, void, void> 404 { 405 protected: 406 _Container* container; 407 408 public: 409 /// A nested typedef for the type of whatever container you used. 410 typedef _Container container_type; 411 412 /// The only way to create this %iterator is with a container. 413 explicit 414 back_insert_iterator(_Container& __x) : container(&__x) { } 415 416 /** 417 * @param __value An instance of whatever type 418 * container_type::const_reference is; presumably a 419 * reference-to-const T for container<T>. 420 * @return This %iterator, for chained operations. 421 * 422 * This kind of %iterator doesn't really have a @a position in the 423 * container (you can think of the position as being permanently at 424 * the end, if you like). Assigning a value to the %iterator will 425 * always append the value to the end of the container. 426 */ 427 #if __cplusplus < 201103L 428 back_insert_iterator& 429 operator=(typename _Container::const_reference __value) 430 { 431 container->push_back(__value); 432 return *this; 433 } 434 #else 435 back_insert_iterator& 436 operator=(const typename _Container::value_type& __value) 437 { 438 container->push_back(__value); 439 return *this; 440 } 441 442 back_insert_iterator& 443 operator=(typename _Container::value_type&& __value) 444 { 445 container->push_back(std::move(__value)); 446 return *this; 447 } 448 #endif 449 450 /// Simply returns *this. 451 back_insert_iterator& 452 operator*() 453 { return *this; } 454 455 /// Simply returns *this. (This %iterator does not @a move.) 456 back_insert_iterator& 457 operator++() 458 { return *this; } 459 460 /// Simply returns *this. (This %iterator does not @a move.) 461 back_insert_iterator 462 operator++(int) 463 { return *this; } 464 }; 465 466 /** 467 * @param __x A container of arbitrary type. 468 * @return An instance of back_insert_iterator working on @p __x. 469 * 470 * This wrapper function helps in creating back_insert_iterator instances. 471 * Typing the name of the %iterator requires knowing the precise full 472 * type of the container, which can be tedious and impedes generic 473 * programming. Using this function lets you take advantage of automatic 474 * template parameter deduction, making the compiler match the correct 475 * types for you. 476 */ 477 template<typename _Container> 478 inline back_insert_iterator<_Container> 479 back_inserter(_Container& __x) 480 { return back_insert_iterator<_Container>(__x); } 481 482 /** 483 * @brief Turns assignment into insertion. 484 * 485 * These are output iterators, constructed from a container-of-T. 486 * Assigning a T to the iterator prepends it to the container using 487 * push_front. 488 * 489 * Tip: Using the front_inserter function to create these iterators can 490 * save typing. 491 */ 492 template<typename _Container> 493 class front_insert_iterator 494 : public iterator<output_iterator_tag, void, void, void, void> 495 { 496 protected: 497 _Container* container; 498 499 public: 500 /// A nested typedef for the type of whatever container you used. 501 typedef _Container container_type; 502 503 /// The only way to create this %iterator is with a container. 504 explicit front_insert_iterator(_Container& __x) : container(&__x) { } 505 506 /** 507 * @param __value An instance of whatever type 508 * container_type::const_reference is; presumably a 509 * reference-to-const T for container<T>. 510 * @return This %iterator, for chained operations. 511 * 512 * This kind of %iterator doesn't really have a @a position in the 513 * container (you can think of the position as being permanently at 514 * the front, if you like). Assigning a value to the %iterator will 515 * always prepend the value to the front of the container. 516 */ 517 #if __cplusplus < 201103L 518 front_insert_iterator& 519 operator=(typename _Container::const_reference __value) 520 { 521 container->push_front(__value); 522 return *this; 523 } 524 #else 525 front_insert_iterator& 526 operator=(const typename _Container::value_type& __value) 527 { 528 container->push_front(__value); 529 return *this; 530 } 531 532 front_insert_iterator& 533 operator=(typename _Container::value_type&& __value) 534 { 535 container->push_front(std::move(__value)); 536 return *this; 537 } 538 #endif 539 540 /// Simply returns *this. 541 front_insert_iterator& 542 operator*() 543 { return *this; } 544 545 /// Simply returns *this. (This %iterator does not @a move.) 546 front_insert_iterator& 547 operator++() 548 { return *this; } 549 550 /// Simply returns *this. (This %iterator does not @a move.) 551 front_insert_iterator 552 operator++(int) 553 { return *this; } 554 }; 555 556 /** 557 * @param __x A container of arbitrary type. 558 * @return An instance of front_insert_iterator working on @p x. 559 * 560 * This wrapper function helps in creating front_insert_iterator instances. 561 * Typing the name of the %iterator requires knowing the precise full 562 * type of the container, which can be tedious and impedes generic 563 * programming. Using this function lets you take advantage of automatic 564 * template parameter deduction, making the compiler match the correct 565 * types for you. 566 */ 567 template<typename _Container> 568 inline front_insert_iterator<_Container> 569 front_inserter(_Container& __x) 570 { return front_insert_iterator<_Container>(__x); } 571 572 /** 573 * @brief Turns assignment into insertion. 574 * 575 * These are output iterators, constructed from a container-of-T. 576 * Assigning a T to the iterator inserts it in the container at the 577 * %iterator's position, rather than overwriting the value at that 578 * position. 579 * 580 * (Sequences will actually insert a @e copy of the value before the 581 * %iterator's position.) 582 * 583 * Tip: Using the inserter function to create these iterators can 584 * save typing. 585 */ 586 template<typename _Container> 587 class insert_iterator 588 : public iterator<output_iterator_tag, void, void, void, void> 589 { 590 protected: 591 _Container* container; 592 typename _Container::iterator iter; 593 594 public: 595 /// A nested typedef for the type of whatever container you used. 596 typedef _Container container_type; 597 598 /** 599 * The only way to create this %iterator is with a container and an 600 * initial position (a normal %iterator into the container). 601 */ 602 insert_iterator(_Container& __x, typename _Container::iterator __i) 603 : container(&__x), iter(__i) {} 604 605 /** 606 * @param __value An instance of whatever type 607 * container_type::const_reference is; presumably a 608 * reference-to-const T for container<T>. 609 * @return This %iterator, for chained operations. 610 * 611 * This kind of %iterator maintains its own position in the 612 * container. Assigning a value to the %iterator will insert the 613 * value into the container at the place before the %iterator. 614 * 615 * The position is maintained such that subsequent assignments will 616 * insert values immediately after one another. For example, 617 * @code 618 * // vector v contains A and Z 619 * 620 * insert_iterator i (v, ++v.begin()); 621 * i = 1; 622 * i = 2; 623 * i = 3; 624 * 625 * // vector v contains A, 1, 2, 3, and Z 626 * @endcode 627 */ 628 #if __cplusplus < 201103L 629 insert_iterator& 630 operator=(typename _Container::const_reference __value) 631 { 632 iter = container->insert(iter, __value); 633 ++iter; 634 return *this; 635 } 636 #else 637 insert_iterator& 638 operator=(const typename _Container::value_type& __value) 639 { 640 iter = container->insert(iter, __value); 641 ++iter; 642 return *this; 643 } 644 645 insert_iterator& 646 operator=(typename _Container::value_type&& __value) 647 { 648 iter = container->insert(iter, std::move(__value)); 649 ++iter; 650 return *this; 651 } 652 #endif 653 654 /// Simply returns *this. 655 insert_iterator& 656 operator*() 657 { return *this; } 658 659 /// Simply returns *this. (This %iterator does not @a move.) 660 insert_iterator& 661 operator++() 662 { return *this; } 663 664 /// Simply returns *this. (This %iterator does not @a move.) 665 insert_iterator& 666 operator++(int) 667 { return *this; } 668 }; 669 670 /** 671 * @param __x A container of arbitrary type. 672 * @return An instance of insert_iterator working on @p __x. 673 * 674 * This wrapper function helps in creating insert_iterator instances. 675 * Typing the name of the %iterator requires knowing the precise full 676 * type of the container, which can be tedious and impedes generic 677 * programming. Using this function lets you take advantage of automatic 678 * template parameter deduction, making the compiler match the correct 679 * types for you. 680 */ 681 template<typename _Container, typename _Iterator> 682 inline insert_iterator<_Container> 683 inserter(_Container& __x, _Iterator __i) 684 { 685 return insert_iterator<_Container>(__x, 686 typename _Container::iterator(__i)); 687 } 688 689 // @} group iterators 690 691 _GLIBCXX_END_NAMESPACE_VERSION 692 } // namespace 693 694 namespace __gnu_cxx _GLIBCXX_VISIBILITY(default) 695 { 696 _GLIBCXX_BEGIN_NAMESPACE_VERSION 697 698 // This iterator adapter is @a normal in the sense that it does not 699 // change the semantics of any of the operators of its iterator 700 // parameter. Its primary purpose is to convert an iterator that is 701 // not a class, e.g. a pointer, into an iterator that is a class. 702 // The _Container parameter exists solely so that different containers 703 // using this template can instantiate different types, even if the 704 // _Iterator parameter is the same. 705 using std::iterator_traits; 706 using std::iterator; 707 template<typename _Iterator, typename _Container> 708 class __normal_iterator 709 { 710 protected: 711 _Iterator _M_current; 712 713 typedef iterator_traits<_Iterator> __traits_type; 714 715 public: 716 typedef _Iterator iterator_type; 717 typedef typename __traits_type::iterator_category iterator_category; 718 typedef typename __traits_type::value_type value_type; 719 typedef typename __traits_type::difference_type difference_type; 720 typedef typename __traits_type::reference reference; 721 typedef typename __traits_type::pointer pointer; 722 723 _GLIBCXX_CONSTEXPR __normal_iterator() : _M_current(_Iterator()) { } 724 725 explicit 726 __normal_iterator(const _Iterator& __i) : _M_current(__i) { } 727 728 // Allow iterator to const_iterator conversion 729 template<typename _Iter> 730 __normal_iterator(const __normal_iterator<_Iter, 731 typename __enable_if< 732 (std::__are_same<_Iter, typename _Container::pointer>::__value), 733 _Container>::__type>& __i) 734 : _M_current(__i.base()) { } 735 736 // Forward iterator requirements 737 reference 738 operator*() const 739 { return *_M_current; } 740 741 pointer 742 operator->() const 743 { return _M_current; } 744 745 __normal_iterator& 746 operator++() 747 { 748 ++_M_current; 749 return *this; 750 } 751 752 __normal_iterator 753 operator++(int) 754 { return __normal_iterator(_M_current++); } 755 756 // Bidirectional iterator requirements 757 __normal_iterator& 758 operator--() 759 { 760 --_M_current; 761 return *this; 762 } 763 764 __normal_iterator 765 operator--(int) 766 { return __normal_iterator(_M_current--); } 767 768 // Random access iterator requirements 769 reference 770 operator[](const difference_type& __n) const 771 { return _M_current[__n]; } 772 773 __normal_iterator& 774 operator+=(const difference_type& __n) 775 { _M_current += __n; return *this; } 776 777 __normal_iterator 778 operator+(const difference_type& __n) const 779 { return __normal_iterator(_M_current + __n); } 780 781 __normal_iterator& 782 operator-=(const difference_type& __n) 783 { _M_current -= __n; return *this; } 784 785 __normal_iterator 786 operator-(const difference_type& __n) const 787 { return __normal_iterator(_M_current - __n); } 788 789 const _Iterator& 790 base() const 791 { return _M_current; } 792 }; 793 794 // Note: In what follows, the left- and right-hand-side iterators are 795 // allowed to vary in types (conceptually in cv-qualification) so that 796 // comparison between cv-qualified and non-cv-qualified iterators be 797 // valid. However, the greedy and unfriendly operators in std::rel_ops 798 // will make overload resolution ambiguous (when in scope) if we don't 799 // provide overloads whose operands are of the same type. Can someone 800 // remind me what generic programming is about? -- Gaby 801 802 // Forward iterator requirements 803 template<typename _IteratorL, typename _IteratorR, typename _Container> 804 inline bool 805 operator==(const __normal_iterator<_IteratorL, _Container>& __lhs, 806 const __normal_iterator<_IteratorR, _Container>& __rhs) 807 { return __lhs.base() == __rhs.base(); } 808 809 template<typename _Iterator, typename _Container> 810 inline bool 811 operator==(const __normal_iterator<_Iterator, _Container>& __lhs, 812 const __normal_iterator<_Iterator, _Container>& __rhs) 813 { return __lhs.base() == __rhs.base(); } 814 815 template<typename _IteratorL, typename _IteratorR, typename _Container> 816 inline bool 817 operator!=(const __normal_iterator<_IteratorL, _Container>& __lhs, 818 const __normal_iterator<_IteratorR, _Container>& __rhs) 819 { return __lhs.base() != __rhs.base(); } 820 821 template<typename _Iterator, typename _Container> 822 inline bool 823 operator!=(const __normal_iterator<_Iterator, _Container>& __lhs, 824 const __normal_iterator<_Iterator, _Container>& __rhs) 825 { return __lhs.base() != __rhs.base(); } 826 827 // Random access iterator requirements 828 template<typename _IteratorL, typename _IteratorR, typename _Container> 829 inline bool 830 operator<(const __normal_iterator<_IteratorL, _Container>& __lhs, 831 const __normal_iterator<_IteratorR, _Container>& __rhs) 832 { return __lhs.base() < __rhs.base(); } 833 834 template<typename _Iterator, typename _Container> 835 inline bool 836 operator<(const __normal_iterator<_Iterator, _Container>& __lhs, 837 const __normal_iterator<_Iterator, _Container>& __rhs) 838 { return __lhs.base() < __rhs.base(); } 839 840 template<typename _IteratorL, typename _IteratorR, typename _Container> 841 inline bool 842 operator>(const __normal_iterator<_IteratorL, _Container>& __lhs, 843 const __normal_iterator<_IteratorR, _Container>& __rhs) 844 { return __lhs.base() > __rhs.base(); } 845 846 template<typename _Iterator, typename _Container> 847 inline bool 848 operator>(const __normal_iterator<_Iterator, _Container>& __lhs, 849 const __normal_iterator<_Iterator, _Container>& __rhs) 850 { return __lhs.base() > __rhs.base(); } 851 852 template<typename _IteratorL, typename _IteratorR, typename _Container> 853 inline bool 854 operator<=(const __normal_iterator<_IteratorL, _Container>& __lhs, 855 const __normal_iterator<_IteratorR, _Container>& __rhs) 856 { return __lhs.base() <= __rhs.base(); } 857 858 template<typename _Iterator, typename _Container> 859 inline bool 860 operator<=(const __normal_iterator<_Iterator, _Container>& __lhs, 861 const __normal_iterator<_Iterator, _Container>& __rhs) 862 { return __lhs.base() <= __rhs.base(); } 863 864 template<typename _IteratorL, typename _IteratorR, typename _Container> 865 inline bool 866 operator>=(const __normal_iterator<_IteratorL, _Container>& __lhs, 867 const __normal_iterator<_IteratorR, _Container>& __rhs) 868 { return __lhs.base() >= __rhs.base(); } 869 870 template<typename _Iterator, typename _Container> 871 inline bool 872 operator>=(const __normal_iterator<_Iterator, _Container>& __lhs, 873 const __normal_iterator<_Iterator, _Container>& __rhs) 874 { return __lhs.base() >= __rhs.base(); } 875 876 // _GLIBCXX_RESOLVE_LIB_DEFECTS 877 // According to the resolution of DR179 not only the various comparison 878 // operators but also operator- must accept mixed iterator/const_iterator 879 // parameters. 880 template<typename _IteratorL, typename _IteratorR, typename _Container> 881 #if __cplusplus >= 201103L 882 // DR 685. 883 inline auto 884 operator-(const __normal_iterator<_IteratorL, _Container>& __lhs, 885 const __normal_iterator<_IteratorR, _Container>& __rhs) 886 -> decltype(__lhs.base() - __rhs.base()) 887 #else 888 inline typename __normal_iterator<_IteratorL, _Container>::difference_type 889 operator-(const __normal_iterator<_IteratorL, _Container>& __lhs, 890 const __normal_iterator<_IteratorR, _Container>& __rhs) 891 #endif 892 { return __lhs.base() - __rhs.base(); } 893 894 template<typename _Iterator, typename _Container> 895 inline typename __normal_iterator<_Iterator, _Container>::difference_type 896 operator-(const __normal_iterator<_Iterator, _Container>& __lhs, 897 const __normal_iterator<_Iterator, _Container>& __rhs) 898 { return __lhs.base() - __rhs.base(); } 899 900 template<typename _Iterator, typename _Container> 901 inline __normal_iterator<_Iterator, _Container> 902 operator+(typename __normal_iterator<_Iterator, _Container>::difference_type 903 __n, const __normal_iterator<_Iterator, _Container>& __i) 904 { return __normal_iterator<_Iterator, _Container>(__i.base() + __n); } 905 906 _GLIBCXX_END_NAMESPACE_VERSION 907 } // namespace 908 909 #if __cplusplus >= 201103L 910 911 namespace std _GLIBCXX_VISIBILITY(default) 912 { 913 _GLIBCXX_BEGIN_NAMESPACE_VERSION 914 915 /** 916 * @addtogroup iterators 917 * @{ 918 */ 919 920 // 24.4.3 Move iterators 921 /** 922 * Class template move_iterator is an iterator adapter with the same 923 * behavior as the underlying iterator except that its dereference 924 * operator implicitly converts the value returned by the underlying 925 * iterator's dereference operator to an rvalue reference. Some 926 * generic algorithms can be called with move iterators to replace 927 * copying with moving. 928 */ 929 template<typename _Iterator> 930 class move_iterator 931 { 932 protected: 933 _Iterator _M_current; 934 935 typedef iterator_traits<_Iterator> __traits_type; 936 937 public: 938 typedef _Iterator iterator_type; 939 typedef typename __traits_type::iterator_category iterator_category; 940 typedef typename __traits_type::value_type value_type; 941 typedef typename __traits_type::difference_type difference_type; 942 // NB: DR 680. 943 typedef _Iterator pointer; 944 typedef value_type&& reference; 945 946 move_iterator() 947 : _M_current() { } 948 949 explicit 950 move_iterator(iterator_type __i) 951 : _M_current(__i) { } 952 953 template<typename _Iter> 954 move_iterator(const move_iterator<_Iter>& __i) 955 : _M_current(__i.base()) { } 956 957 iterator_type 958 base() const 959 { return _M_current; } 960 961 reference 962 operator*() const 963 { return std::move(*_M_current); } 964 965 pointer 966 operator->() const 967 { return _M_current; } 968 969 move_iterator& 970 operator++() 971 { 972 ++_M_current; 973 return *this; 974 } 975 976 move_iterator 977 operator++(int) 978 { 979 move_iterator __tmp = *this; 980 ++_M_current; 981 return __tmp; 982 } 983 984 move_iterator& 985 operator--() 986 { 987 --_M_current; 988 return *this; 989 } 990 991 move_iterator 992 operator--(int) 993 { 994 move_iterator __tmp = *this; 995 --_M_current; 996 return __tmp; 997 } 998 999 move_iterator 1000 operator+(difference_type __n) const 1001 { return move_iterator(_M_current + __n); } 1002 1003 move_iterator& 1004 operator+=(difference_type __n) 1005 { 1006 _M_current += __n; 1007 return *this; 1008 } 1009 1010 move_iterator 1011 operator-(difference_type __n) const 1012 { return move_iterator(_M_current - __n); } 1013 1014 move_iterator& 1015 operator-=(difference_type __n) 1016 { 1017 _M_current -= __n; 1018 return *this; 1019 } 1020 1021 reference 1022 operator[](difference_type __n) const 1023 { return std::move(_M_current[__n]); } 1024 }; 1025 1026 // Note: See __normal_iterator operators note from Gaby to understand 1027 // why there are always 2 versions for most of the move_iterator 1028 // operators. 1029 template<typename _IteratorL, typename _IteratorR> 1030 inline bool 1031 operator==(const move_iterator<_IteratorL>& __x, 1032 const move_iterator<_IteratorR>& __y) 1033 { return __x.base() == __y.base(); } 1034 1035 template<typename _Iterator> 1036 inline bool 1037 operator==(const move_iterator<_Iterator>& __x, 1038 const move_iterator<_Iterator>& __y) 1039 { return __x.base() == __y.base(); } 1040 1041 template<typename _IteratorL, typename _IteratorR> 1042 inline bool 1043 operator!=(const move_iterator<_IteratorL>& __x, 1044 const move_iterator<_IteratorR>& __y) 1045 { return !(__x == __y); } 1046 1047 template<typename _Iterator> 1048 inline bool 1049 operator!=(const move_iterator<_Iterator>& __x, 1050 const move_iterator<_Iterator>& __y) 1051 { return !(__x == __y); } 1052 1053 template<typename _IteratorL, typename _IteratorR> 1054 inline bool 1055 operator<(const move_iterator<_IteratorL>& __x, 1056 const move_iterator<_IteratorR>& __y) 1057 { return __x.base() < __y.base(); } 1058 1059 template<typename _Iterator> 1060 inline bool 1061 operator<(const move_iterator<_Iterator>& __x, 1062 const move_iterator<_Iterator>& __y) 1063 { return __x.base() < __y.base(); } 1064 1065 template<typename _IteratorL, typename _IteratorR> 1066 inline bool 1067 operator<=(const move_iterator<_IteratorL>& __x, 1068 const move_iterator<_IteratorR>& __y) 1069 { return !(__y < __x); } 1070 1071 template<typename _Iterator> 1072 inline bool 1073 operator<=(const move_iterator<_Iterator>& __x, 1074 const move_iterator<_Iterator>& __y) 1075 { return !(__y < __x); } 1076 1077 template<typename _IteratorL, typename _IteratorR> 1078 inline bool 1079 operator>(const move_iterator<_IteratorL>& __x, 1080 const move_iterator<_IteratorR>& __y) 1081 { return __y < __x; } 1082 1083 template<typename _Iterator> 1084 inline bool 1085 operator>(const move_iterator<_Iterator>& __x, 1086 const move_iterator<_Iterator>& __y) 1087 { return __y < __x; } 1088 1089 template<typename _IteratorL, typename _IteratorR> 1090 inline bool 1091 operator>=(const move_iterator<_IteratorL>& __x, 1092 const move_iterator<_IteratorR>& __y) 1093 { return !(__x < __y); } 1094 1095 template<typename _Iterator> 1096 inline bool 1097 operator>=(const move_iterator<_Iterator>& __x, 1098 const move_iterator<_Iterator>& __y) 1099 { return !(__x < __y); } 1100 1101 // DR 685. 1102 template<typename _IteratorL, typename _IteratorR> 1103 inline auto 1104 operator-(const move_iterator<_IteratorL>& __x, 1105 const move_iterator<_IteratorR>& __y) 1106 -> decltype(__x.base() - __y.base()) 1107 { return __x.base() - __y.base(); } 1108 1109 template<typename _Iterator> 1110 inline auto 1111 operator-(const move_iterator<_Iterator>& __x, 1112 const move_iterator<_Iterator>& __y) 1113 -> decltype(__x.base() - __y.base()) 1114 { return __x.base() - __y.base(); } 1115 1116 template<typename _Iterator> 1117 inline move_iterator<_Iterator> 1118 operator+(typename move_iterator<_Iterator>::difference_type __n, 1119 const move_iterator<_Iterator>& __x) 1120 { return __x + __n; } 1121 1122 template<typename _Iterator> 1123 inline move_iterator<_Iterator> 1124 make_move_iterator(_Iterator __i) 1125 { return move_iterator<_Iterator>(__i); } 1126 1127 template<typename _Iterator, typename _ReturnType 1128 = typename conditional<__move_if_noexcept_cond 1129 <typename iterator_traits<_Iterator>::value_type>::value, 1130 _Iterator, move_iterator<_Iterator>>::type> 1131 inline _ReturnType 1132 __make_move_if_noexcept_iterator(_Iterator __i) 1133 { return _ReturnType(__i); } 1134 1135 // @} group iterators 1136 1137 _GLIBCXX_END_NAMESPACE_VERSION 1138 } // namespace 1139 1140 #define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) std::make_move_iterator(_Iter) 1141 #define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) \ 1142 std::__make_move_if_noexcept_iterator(_Iter) 1143 #else 1144 #define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) (_Iter) 1145 #define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) (_Iter) 1146 #endif // C++11 1147 1148 #endif 1149