61 #ifndef _STL_ITERATOR_H
62 #define _STL_ITERATOR_H 1
68 _GLIBCXX_BEGIN_NAMESPACE(std)
89 template<typename _Iterator>
101 typedef _Iterator iterator_type;
102 typedef typename iterator_traits<_Iterator>::difference_type
104 typedef typename iterator_traits<_Iterator>::reference reference;
105 typedef typename iterator_traits<_Iterator>::pointer pointer;
126 : current(__x.current) { }
132 template<
typename _Iter>
134 : current(__x.base()) { }
151 _Iterator __tmp = current;
162 {
return &(operator*()); }
263 {
return *(*
this + __n); }
276 template<
typename _Iterator>
280 {
return __x.
base() == __y.
base(); }
282 template<
typename _Iterator>
284 operator<(const reverse_iterator<_Iterator>& __x,
286 {
return __y.
base() < __x.base(); }
288 template<
typename _Iterator>
292 {
return !(__x == __y); }
294 template<
typename _Iterator>
298 {
return __y < __x; }
300 template<
typename _Iterator>
302 operator<=(const reverse_iterator<_Iterator>& __x,
304 {
return !(__y < __x); }
306 template<
typename _Iterator>
310 {
return !(__x < __y); }
312 template<
typename _Iterator>
313 inline typename reverse_iterator<_Iterator>::difference_type
318 template<
typename _Iterator>
319 inline reverse_iterator<_Iterator>
320 operator+(
typename reverse_iterator<_Iterator>::difference_type __n,
326 template<
typename _IteratorL,
typename _IteratorR>
330 {
return __x.
base() == __y.
base(); }
332 template<
typename _IteratorL,
typename _IteratorR>
334 operator<(const reverse_iterator<_IteratorL>& __x,
336 {
return __y.
base() < __x.base(); }
338 template<
typename _IteratorL,
typename _IteratorR>
342 {
return !(__x == __y); }
344 template<
typename _IteratorL,
typename _IteratorR>
348 {
return __y < __x; }
350 template<
typename _IteratorL,
typename _IteratorR>
352 operator<=(const reverse_iterator<_IteratorL>& __x,
354 {
return !(__y < __x); }
356 template<
typename _IteratorL,
typename _IteratorR>
360 {
return !(__x < __y); }
362 template<
typename _IteratorL,
typename _IteratorR>
363 #ifdef __GXX_EXPERIMENTAL_CXX0X__
368 -> decltype(__y.base() - __x.base())
370 inline typename reverse_iterator<_IteratorL>::difference_type
388 template<
typename _Container>
390 :
public iterator<output_iterator_tag, void, void, void, void>
393 _Container* container;
417 container->push_back(__value);
421 #ifdef __GXX_EXPERIMENTAL_CXX0X__
423 operator=(
typename _Container::value_type&& __value)
425 container->push_back(std::move(__value));
431 back_insert_iterator&
457 template<
typename _Container>
458 inline back_insert_iterator<_Container>
472 template<
typename _Container>
474 :
public iterator<output_iterator_tag, void, void, void, void>
477 _Container* container;
500 container->push_front(__value);
504 #ifdef __GXX_EXPERIMENTAL_CXX0X__
506 operator=(
typename _Container::value_type&& __value)
508 container->push_front(std::move(__value));
514 front_insert_iterator&
540 template<
typename _Container>
541 inline front_insert_iterator<_Container>
559 template<
typename _Container>
561 :
public iterator<output_iterator_tag, void, void, void, void>
564 _Container* container;
565 typename _Container::iterator iter;
576 : container(&__x), iter(__i) {}
604 iter = container->insert(iter, __value);
609 #ifdef __GXX_EXPERIMENTAL_CXX0X__
611 operator=(
typename _Container::value_type&& __value)
613 iter = container->insert(iter, std::move(__value));
646 template<
typename _Container,
typename _Iterator>
647 inline insert_iterator<_Container>
651 typename _Container::iterator(__i));
654 _GLIBCXX_END_NAMESPACE
656 _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
665 using std::iterator_traits;
667 template<typename _Iterator, typename _Container>
668 class __normal_iterator
671 _Iterator _M_current;
674 typedef _Iterator iterator_type;
675 typedef typename iterator_traits<_Iterator>::iterator_category
677 typedef typename iterator_traits<_Iterator>::value_type value_type;
678 typedef typename iterator_traits<_Iterator>::difference_type
680 typedef typename iterator_traits<_Iterator>::reference reference;
681 typedef typename iterator_traits<_Iterator>::pointer pointer;
683 __normal_iterator() : _M_current(_Iterator()) { }
686 __normal_iterator(
const _Iterator& __i) : _M_current(__i) { }
689 template<
typename _Iter>
690 __normal_iterator(
const __normal_iterator<_Iter,
691 typename __enable_if<
692 (std::__are_same<_Iter, typename _Container::pointer>::__value),
693 _Container>::__type>& __i)
694 : _M_current(__i.base()) { }
699 {
return *_M_current; }
703 {
return _M_current; }
714 {
return __normal_iterator(_M_current++); }
726 {
return __normal_iterator(_M_current--); }
730 operator[](
const difference_type& __n)
const
731 {
return _M_current[__n]; }
734 operator+=(
const difference_type& __n)
735 { _M_current += __n;
return *
this; }
738 operator+(
const difference_type& __n)
const
739 {
return __normal_iterator(_M_current + __n); }
742 operator-=(
const difference_type& __n)
743 { _M_current -= __n;
return *
this; }
746 operator-(
const difference_type& __n)
const
747 {
return __normal_iterator(_M_current - __n); }
751 {
return _M_current; }
763 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
765 operator==(
const __normal_iterator<_IteratorL, _Container>& __lhs,
766 const __normal_iterator<_IteratorR, _Container>& __rhs)
767 {
return __lhs.base() == __rhs.base(); }
769 template<
typename _Iterator,
typename _Container>
771 operator==(
const __normal_iterator<_Iterator, _Container>& __lhs,
772 const __normal_iterator<_Iterator, _Container>& __rhs)
773 {
return __lhs.base() == __rhs.base(); }
775 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
777 operator!=(
const __normal_iterator<_IteratorL, _Container>& __lhs,
778 const __normal_iterator<_IteratorR, _Container>& __rhs)
779 {
return __lhs.base() != __rhs.base(); }
781 template<
typename _Iterator,
typename _Container>
783 operator!=(
const __normal_iterator<_Iterator, _Container>& __lhs,
784 const __normal_iterator<_Iterator, _Container>& __rhs)
785 {
return __lhs.base() != __rhs.base(); }
788 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
790 operator<(const __normal_iterator<_IteratorL, _Container>& __lhs,
791 const __normal_iterator<_IteratorR, _Container>& __rhs)
792 {
return __lhs.base() < __rhs.base(); }
794 template<
typename _Iterator,
typename _Container>
796 operator<(const __normal_iterator<_Iterator, _Container>& __lhs,
797 const __normal_iterator<_Iterator, _Container>& __rhs)
798 {
return __lhs.base() < __rhs.base(); }
800 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
802 operator>(
const __normal_iterator<_IteratorL, _Container>& __lhs,
803 const __normal_iterator<_IteratorR, _Container>& __rhs)
804 {
return __lhs.base() > __rhs.base(); }
806 template<
typename _Iterator,
typename _Container>
808 operator>(
const __normal_iterator<_Iterator, _Container>& __lhs,
809 const __normal_iterator<_Iterator, _Container>& __rhs)
810 {
return __lhs.base() > __rhs.base(); }
812 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
814 operator<=(const __normal_iterator<_IteratorL, _Container>& __lhs,
815 const __normal_iterator<_IteratorR, _Container>& __rhs)
816 {
return __lhs.base() <= __rhs.base(); }
818 template<
typename _Iterator,
typename _Container>
820 operator<=(const __normal_iterator<_Iterator, _Container>& __lhs,
821 const __normal_iterator<_Iterator, _Container>& __rhs)
822 {
return __lhs.base() <= __rhs.base(); }
824 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
826 operator>=(
const __normal_iterator<_IteratorL, _Container>& __lhs,
827 const __normal_iterator<_IteratorR, _Container>& __rhs)
828 {
return __lhs.base() >= __rhs.base(); }
830 template<
typename _Iterator,
typename _Container>
832 operator>=(
const __normal_iterator<_Iterator, _Container>& __lhs,
833 const __normal_iterator<_Iterator, _Container>& __rhs)
834 {
return __lhs.base() >= __rhs.base(); }
840 template<
typename _IteratorL,
typename _IteratorR,
typename _Container>
841 #ifdef __GXX_EXPERIMENTAL_CXX0X__
844 operator-(
const __normal_iterator<_IteratorL, _Container>& __lhs,
845 const __normal_iterator<_IteratorR, _Container>& __rhs)
846 -> decltype(__lhs.base() - __rhs.base())
848 inline typename __normal_iterator<_IteratorL, _Container>::difference_type
849 operator-(
const __normal_iterator<_IteratorL, _Container>& __lhs,
850 const __normal_iterator<_IteratorR, _Container>& __rhs)
852 {
return __lhs.base() - __rhs.base(); }
854 template<
typename _Iterator,
typename _Container>
855 inline typename __normal_iterator<_Iterator, _Container>::difference_type
856 operator-(
const __normal_iterator<_Iterator, _Container>& __lhs,
857 const __normal_iterator<_Iterator, _Container>& __rhs)
858 {
return __lhs.base() - __rhs.base(); }
860 template<
typename _Iterator,
typename _Container>
861 inline __normal_iterator<_Iterator, _Container>
862 operator+(
typename __normal_iterator<_Iterator, _Container>::difference_type
863 __n,
const __normal_iterator<_Iterator, _Container>& __i)
864 {
return __normal_iterator<_Iterator, _Container>(__i.base() + __n); }
866 _GLIBCXX_END_NAMESPACE
868 #ifdef __GXX_EXPERIMENTAL_CXX0X__
870 _GLIBCXX_BEGIN_NAMESPACE(std)
881 template<typename _Iterator>
885 _Iterator _M_current;
888 typedef _Iterator iterator_type;
889 typedef typename iterator_traits<_Iterator>::difference_type
892 typedef _Iterator pointer;
893 typedef typename iterator_traits<_Iterator>::value_type value_type;
894 typedef typename iterator_traits<_Iterator>::iterator_category
896 typedef value_type&& reference;
903 move_iterator(iterator_type __i)
904 : _M_current(__i) { }
906 template<
typename _Iter>
907 move_iterator(
const move_iterator<_Iter>& __i)
908 : _M_current(__i.base()) { }
912 {
return _M_current; }
916 {
return *_M_current; }
920 {
return _M_current; }
932 move_iterator __tmp = *
this;
947 move_iterator __tmp = *
this;
953 operator+(difference_type __n)
const
954 {
return move_iterator(_M_current + __n); }
957 operator+=(difference_type __n)
964 operator-(difference_type __n)
const
965 {
return move_iterator(_M_current - __n); }
968 operator-=(difference_type __n)
975 operator[](difference_type __n)
const
976 {
return _M_current[__n]; }
979 template<
typename _IteratorL,
typename _IteratorR>
981 operator==(
const move_iterator<_IteratorL>& __x,
982 const move_iterator<_IteratorR>& __y)
983 {
return __x.base() == __y.base(); }
985 template<
typename _IteratorL,
typename _IteratorR>
987 operator!=(
const move_iterator<_IteratorL>& __x,
988 const move_iterator<_IteratorR>& __y)
989 {
return !(__x == __y); }
991 template<
typename _IteratorL,
typename _IteratorR>
993 operator<(const move_iterator<_IteratorL>& __x,
994 const move_iterator<_IteratorR>& __y)
995 {
return __x.base() < __y.base(); }
997 template<
typename _IteratorL,
typename _IteratorR>
999 operator<=(const move_iterator<_IteratorL>& __x,
1000 const move_iterator<_IteratorR>& __y)
1001 {
return !(__y < __x); }
1003 template<
typename _IteratorL,
typename _IteratorR>
1005 operator>(
const move_iterator<_IteratorL>& __x,
1006 const move_iterator<_IteratorR>& __y)
1007 {
return __y < __x; }
1009 template<
typename _IteratorL,
typename _IteratorR>
1011 operator>=(
const move_iterator<_IteratorL>& __x,
1012 const move_iterator<_IteratorR>& __y)
1013 {
return !(__x < __y); }
1016 template<
typename _IteratorL,
typename _IteratorR>
1018 operator-(
const move_iterator<_IteratorL>& __x,
1019 const move_iterator<_IteratorR>& __y)
1020 -> decltype(__x.base() - __y.base())
1021 {
return __x.base() - __y.base(); }
1023 template<
typename _Iterator>
1024 inline move_iterator<_Iterator>
1025 operator+(
typename move_iterator<_Iterator>::difference_type __n,
1026 const move_iterator<_Iterator>& __x)
1027 {
return __x + __n; }
1029 template<
typename _Iterator>
1030 inline move_iterator<_Iterator>
1031 make_move_iterator(
const _Iterator& __i)
1032 {
return move_iterator<_Iterator>(__i); }
1034 _GLIBCXX_END_NAMESPACE
1036 #define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) std::make_move_iterator(_Iter)
1038 #define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) (_Iter)
1039 #endif // __GXX_EXPERIMENTAL_CXX0X__
reverse_iterator(const reverse_iterator< _Iter > &__x)
reverse_iterator(iterator_type __x)
front_insert_iterator & operator*()
Simply returns *this.
reverse_iterator operator++(int)
insert_iterator< _Container > inserter(_Container &__x, _Iterator __i)
reverse_iterator & operator++()
reverse_iterator & operator+=(difference_type __n)
reverse_iterator operator+(difference_type __n) const
reverse_iterator operator-(difference_type __n) const
insert_iterator & operator++(int)
Simply returns *this. (This iterator does not "move".)
iterator_traits< _Iterator >::value_type value_type
The type "pointed to" by the iterator.
front_insert_iterator & operator++()
Simply returns *this. (This iterator does not "move".)
front_insert_iterator operator++(int)
Simply returns *this. (This iterator does not "move".)
front_insert_iterator< _Container > front_inserter(_Container &__x)
_Container container_type
A nested typedef for the type of whatever container you used.
_Container container_type
A nested typedef for the type of whatever container you used.
reverse_iterator & operator-=(difference_type __n)
front_insert_iterator(_Container &__x)
The only way to create this iterator is with a container.
insert_iterator & operator*()
Simply returns *this.
reverse_iterator operator--(int)
back_insert_iterator(_Container &__x)
The only way to create this iterator is with a container.
Turns assignment into insertion.
insert_iterator & operator++()
Simply returns *this. (This iterator does not "move".)
insert_iterator & operator=(typename _Container::const_reference __value)
back_insert_iterator< _Container > back_inserter(_Container &__x)
back_insert_iterator & operator=(typename _Container::const_reference __value)
back_insert_iterator & operator++()
Simply returns *this. (This iterator does not "move".)
Turns assignment into insertion.
iterator_type base() const
back_insert_iterator operator++(int)
Simply returns *this. (This iterator does not "move".)
iterator_traits< _Iterator >::iterator_category iterator_category
One of the tag types.
back_insert_iterator & operator*()
Simply returns *this.
reverse_iterator & operator--()
pointer operator->() const
reference operator*() const
reference operator[](difference_type __n) const
insert_iterator(_Container &__x, typename _Container::iterator __i)
reverse_iterator(const reverse_iterator &__x)
front_insert_iterator & operator=(typename _Container::const_reference __value)
Turns assignment into insertion.
_Container container_type
A nested typedef for the type of whatever container you used.