Home | History | Annotate | Download | only in include
      1 // -*- C++ -*-
      2 //===-------------------------- iterator ----------------------------------===//
      3 //
      4 //                     The LLVM Compiler Infrastructure
      5 //
      6 // This file is dual licensed under the MIT and the University of Illinois Open
      7 // Source Licenses. See LICENSE.TXT for details.
      8 //
      9 //===----------------------------------------------------------------------===//
     10 
     11 #ifndef _LIBCPP_ITERATOR
     12 #define _LIBCPP_ITERATOR
     13 
     14 /*
     15     iterator synopsis
     16 
     17 namespace std
     18 {
     19 
     20 template<class Iterator>
     21 struct iterator_traits
     22 {
     23     typedef typename Iterator::difference_type difference_type;
     24     typedef typename Iterator::value_type value_type;
     25     typedef typename Iterator::pointer pointer;
     26     typedef typename Iterator::reference reference;
     27     typedef typename Iterator::iterator_category iterator_category;
     28 };
     29 
     30 template<class T>
     31 struct iterator_traits<T*>
     32 {
     33     typedef ptrdiff_t difference_type;
     34     typedef T value_type;
     35     typedef T* pointer;
     36     typedef T& reference;
     37     typedef random_access_iterator_tag iterator_category;
     38 };
     39 
     40 template<class T>
     41 struct iterator_traits<const T*>
     42 {
     43     typedef ptrdiff_t difference_type;
     44     typedef T value_type;
     45     typedef const T* pointer;
     46     typedef const T& reference;
     47     typedef random_access_iterator_tag iterator_category;
     48 };
     49 
     50 template<class Category, class T, class Distance = ptrdiff_t,
     51          class Pointer = T*, class Reference = T&>
     52 struct iterator
     53 {
     54     typedef T         value_type;
     55     typedef Distance  difference_type;
     56     typedef Pointer   pointer;
     57     typedef Reference reference;
     58     typedef Category  iterator_category;
     59 };
     60 
     61 struct input_iterator_tag  {};
     62 struct output_iterator_tag {};
     63 struct forward_iterator_tag       : public input_iterator_tag         {};
     64 struct bidirectional_iterator_tag : public forward_iterator_tag       {};
     65 struct random_access_iterator_tag : public bidirectional_iterator_tag {};
     66 
     67 // extension: second argument not conforming to C++03
     68 template <class InputIterator>
     69 void advance(InputIterator& i,
     70              typename iterator_traits<InputIterator>::difference_type n);
     71 
     72 template <class InputIterator>
     73 typename iterator_traits<InputIterator>::difference_type
     74 distance(InputIterator first, InputIterator last);
     75 
     76 template <class Iterator>
     77 class reverse_iterator
     78     : public iterator<typename iterator_traits<Iterator>::iterator_category,
     79                       typename iterator_traits<Iterator>::value_type,
     80                       typename iterator_traits<Iterator>::difference_type,
     81                       typename iterator_traits<Iterator>::pointer,
     82                       typename iterator_traits<Iterator>::reference>
     83 {
     84 protected:
     85     Iterator current;
     86 public:
     87     typedef Iterator                                            iterator_type;
     88     typedef typename iterator_traits<Iterator>::difference_type difference_type;
     89     typedef typename iterator_traits<Iterator>::reference       reference;
     90     typedef typename iterator_traits<Iterator>::pointer         pointer;
     91 
     92     reverse_iterator();
     93     explicit reverse_iterator(Iterator x);
     94     template <class U> reverse_iterator(const reverse_iterator<U>& u);
     95     Iterator base() const;
     96     reference operator*() const;
     97     pointer   operator->() const;
     98     reverse_iterator& operator++();
     99     reverse_iterator  operator++(int);
    100     reverse_iterator& operator--();
    101     reverse_iterator  operator--(int);
    102     reverse_iterator  operator+ (difference_type n) const;
    103     reverse_iterator& operator+=(difference_type n);
    104     reverse_iterator  operator- (difference_type n) const;
    105     reverse_iterator& operator-=(difference_type n);
    106     reference         operator[](difference_type n) const;
    107 };
    108 
    109 template <class Iterator1, class Iterator2>
    110 bool
    111 operator==(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);
    112 
    113 template <class Iterator1, class Iterator2>
    114 bool
    115 operator<(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);
    116 
    117 template <class Iterator1, class Iterator2>
    118 bool
    119 operator!=(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);
    120 
    121 template <class Iterator1, class Iterator2>
    122 bool
    123 operator>(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);
    124 
    125 template <class Iterator1, class Iterator2>
    126 bool
    127 operator>=(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);
    128 
    129 template <class Iterator1, class Iterator2>
    130 bool
    131 operator<=(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);
    132 
    133 template <class Iterator1, class Iterator2>
    134 typename reverse_iterator<Iterator1>::difference_type
    135 operator-(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);
    136 
    137 template <class Iterator>
    138 reverse_iterator<Iterator>
    139 operator+(typename reverse_iterator<Iterator>::difference_type n, const reverse_iterator<Iterator>& x);
    140 
    141 template <class Container>
    142 class back_insert_iterator
    143 {
    144 protected:
    145     Container* container;
    146 public:
    147     typedef Container                   container_type;
    148     typedef void                        value_type;
    149     typedef void                        difference_type;
    150     typedef back_insert_iterator<Cont>& reference;
    151     typedef void                        pointer;
    152 
    153     explicit back_insert_iterator(Container& x);
    154     back_insert_iterator& operator=(const typename Container::value_type& value);
    155     back_insert_iterator& operator*();
    156     back_insert_iterator& operator++();
    157     back_insert_iterator  operator++(int);
    158 };
    159 
    160 template <class Container> back_insert_iterator<Container> back_inserter(Container& x);
    161 
    162 template <class Container>
    163 class front_insert_iterator
    164 {
    165 protected:
    166     Container* container;
    167 public:
    168     typedef Container                    container_type;
    169     typedef void                         value_type;
    170     typedef void                         difference_type;
    171     typedef front_insert_iterator<Cont>& reference;
    172     typedef void                         pointer;
    173 
    174     explicit front_insert_iterator(Container& x);
    175     front_insert_iterator& operator=(const typename Container::value_type& value);
    176     front_insert_iterator& operator*();
    177     front_insert_iterator& operator++();
    178     front_insert_iterator  operator++(int);
    179 };
    180 
    181 template <class Container> front_insert_iterator<Container> front_inserter(Container& x);
    182 
    183 template <class Container>
    184 class insert_iterator
    185 {
    186 protected:
    187     Container* container;
    188     typename Container::iterator iter;
    189 public:
    190     typedef Container              container_type;
    191     typedef void                   value_type;
    192     typedef void                   difference_type;
    193     typedef insert_iterator<Cont>& reference;
    194     typedef void                   pointer;
    195 
    196     insert_iterator(Container& x, typename Container::iterator i);
    197     insert_iterator& operator=(const typename Container::value_type& value);
    198     insert_iterator& operator*();
    199     insert_iterator& operator++();
    200     insert_iterator& operator++(int);
    201 };
    202 
    203 template <class Container, class Iterator>
    204 insert_iterator<Container> inserter(Container& x, Iterator i);
    205 
    206 template <class T, class charT = char, class traits = char_traits<charT>, class Distance = ptrdiff_t>
    207 class istream_iterator
    208     : public iterator<input_iterator_tag, T, Distance, const T*, const T&>
    209 {
    210 public:
    211     typedef charT char_type;
    212     typedef traits traits_type;
    213     typedef basic_istream<charT,traits> istream_type;
    214 
    215     istream_iterator();
    216     istream_iterator(istream_type& s);
    217     istream_iterator(const istream_iterator& x);
    218     ~istream_iterator();
    219 
    220     const T& operator*() const;
    221     const T* operator->() const;
    222     istream_iterator& operator++();
    223     istream_iterator  operator++(int);
    224 };
    225 
    226 template <class T, class charT, class traits, class Distance>
    227 bool operator==(const istream_iterator<T,charT,traits,Distance>& x,
    228                 const istream_iterator<T,charT,traits,Distance>& y);
    229 template <class T, class charT, class traits, class Distance>
    230 bool operator!=(const istream_iterator<T,charT,traits,Distance>& x,
    231                 const istream_iterator<T,charT,traits,Distance>& y);
    232 
    233 template <class T, class charT = char, class traits = char_traits<charT> >
    234 class ostream_iterator
    235     : public iterator<output_iterator_tag, void, void, void ,void>
    236 {
    237 public:
    238     typedef charT char_type;
    239     typedef traits traits_type;
    240     typedef basic_ostream<charT,traits> ostream_type;
    241 
    242     ostream_iterator(ostream_type& s);
    243     ostream_iterator(ostream_type& s, const charT* delimiter);
    244     ostream_iterator(const ostream_iterator& x);
    245     ~ostream_iterator();
    246     ostream_iterator& operator=(const T& value);
    247 
    248     ostream_iterator& operator*();
    249     ostream_iterator& operator++();
    250     ostream_iterator& operator++(int);
    251 };
    252 
    253 template<class charT, class traits = char_traits<charT> >
    254 class istreambuf_iterator
    255     : public iterator<input_iterator_tag, charT,
    256                       typename traits::off_type, unspecified,
    257                       charT>
    258 {
    259 public:
    260     typedef charT                         char_type;
    261     typedef traits                        traits_type;
    262     typedef typename traits::int_type     int_type;
    263     typedef basic_streambuf<charT,traits> streambuf_type;
    264     typedef basic_istream<charT,traits>   istream_type;
    265 
    266     istreambuf_iterator() noexcept;
    267     istreambuf_iterator(istream_type& s) noexcept;
    268     istreambuf_iterator(streambuf_type* s) noexcept;
    269     istreambuf_iterator(a-private-type) noexcept;
    270 
    271     charT                operator*() const;
    272     pointer operator->() const;
    273     istreambuf_iterator& operator++();
    274     a-private-type       operator++(int);
    275 
    276     bool equal(const istreambuf_iterator& b) const;
    277 };
    278 
    279 template <class charT, class traits>
    280 bool operator==(const istreambuf_iterator<charT,traits>& a,
    281                 const istreambuf_iterator<charT,traits>& b);
    282 template <class charT, class traits>
    283 bool operator!=(const istreambuf_iterator<charT,traits>& a,
    284                 const istreambuf_iterator<charT,traits>& b);
    285 
    286 template <class charT, class traits = char_traits<charT> >
    287 class ostreambuf_iterator
    288     : public iterator<output_iterator_tag, void, void, void, void>
    289 {
    290 public:
    291     typedef charT                         char_type;
    292     typedef traits                        traits_type;
    293     typedef basic_streambuf<charT,traits> streambuf_type;
    294     typedef basic_ostream<charT,traits>   ostream_type;
    295 
    296     ostreambuf_iterator(ostream_type& s) noexcept;
    297     ostreambuf_iterator(streambuf_type* s) noexcept;
    298     ostreambuf_iterator& operator=(charT c);
    299     ostreambuf_iterator& operator*();
    300     ostreambuf_iterator& operator++();
    301     ostreambuf_iterator& operator++(int);
    302     bool failed() const noexcept;
    303 };
    304 
    305 template <class C> auto begin(C& c) -> decltype(c.begin());
    306 template <class C> auto begin(const C& c) -> decltype(c.begin());
    307 template <class C> auto end(C& c) -> decltype(c.end());
    308 template <class C> auto end(const C& c) -> decltype(c.end());
    309 template <class T, size_t N> T* begin(T (&array)[N]);
    310 template <class T, size_t N> T* end(T (&array)[N]);
    311 
    312 }  // std
    313 
    314 */
    315 
    316 #include <__config>
    317 #include <type_traits>
    318 #include <cstddef>
    319 #include <iosfwd>
    320 #ifdef __APPLE__
    321 #include <Availability.h>
    322 #endif
    323 
    324 #ifdef _LIBCPP_DEBUG
    325 #include <cassert>
    326 #endif
    327 
    328 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
    329 #pragma GCC system_header
    330 #endif
    331 
    332 _LIBCPP_BEGIN_NAMESPACE_STD
    333 
    334 struct _LIBCPP_TYPE_VIS input_iterator_tag {};
    335 struct _LIBCPP_TYPE_VIS output_iterator_tag {};
    336 struct _LIBCPP_TYPE_VIS forward_iterator_tag       : public input_iterator_tag {};
    337 struct _LIBCPP_TYPE_VIS bidirectional_iterator_tag : public forward_iterator_tag {};
    338 struct _LIBCPP_TYPE_VIS random_access_iterator_tag : public bidirectional_iterator_tag {};
    339 
    340 template <class _Tp>
    341 struct __has_iterator_category
    342 {
    343 private:
    344     struct __two {char __lx; char __lxx;};
    345     template <class _Up> static __two __test(...);
    346     template <class _Up> static char __test(typename _Up::iterator_category* = 0);
    347 public:
    348     static const bool value = sizeof(__test<_Tp>(0)) == 1;
    349 };
    350 
    351 template <class _Iter, bool> struct ____iterator_traits {};
    352 
    353 template <class _Iter>
    354 struct ____iterator_traits<_Iter, true>
    355 {
    356     typedef typename _Iter::difference_type   difference_type;
    357     typedef typename _Iter::value_type        value_type;
    358     typedef typename _Iter::pointer           pointer;
    359     typedef typename _Iter::reference         reference;
    360     typedef typename _Iter::iterator_category iterator_category;
    361 };
    362 
    363 template <class _Iter, bool> struct __iterator_traits {};
    364 
    365 template <class _Iter>
    366 struct __iterator_traits<_Iter, true>
    367     :  ____iterator_traits
    368       <
    369         _Iter,
    370         is_convertible<typename _Iter::iterator_category, input_iterator_tag>::value ||
    371         is_convertible<typename _Iter::iterator_category, output_iterator_tag>::value
    372       >
    373 {};
    374 
    375 // iterator_traits<Iterator> will only have the nested types if Iterator::iterator_category
    376 //    exists.  Else iterator_traits<Iterator> will be an empty class.  This is a
    377 //    conforming extension which allows some programs to compile and behave as
    378 //    the client expects instead of failing at compile time.
    379 
    380 template <class _Iter>
    381 struct _LIBCPP_TYPE_VIS iterator_traits
    382     : __iterator_traits<_Iter, __has_iterator_category<_Iter>::value> {};
    383 
    384 template<class _Tp>
    385 struct _LIBCPP_TYPE_VIS iterator_traits<_Tp*>
    386 {
    387     typedef ptrdiff_t difference_type;
    388     typedef typename remove_const<_Tp>::type value_type;
    389     typedef _Tp* pointer;
    390     typedef _Tp& reference;
    391     typedef random_access_iterator_tag iterator_category;
    392 };
    393 
    394 template <class _Tp, class _Up, bool = __has_iterator_category<iterator_traits<_Tp> >::value>
    395 struct __has_iterator_category_convertible_to
    396     : public integral_constant<bool, is_convertible<typename iterator_traits<_Tp>::iterator_category, _Up>::value>
    397 {};
    398 
    399 template <class _Tp, class _Up>
    400 struct __has_iterator_category_convertible_to<_Tp, _Up, false> : public false_type {};
    401 
    402 template <class _Tp>
    403 struct __is_input_iterator : public __has_iterator_category_convertible_to<_Tp, input_iterator_tag> {};
    404 
    405 template <class _Tp>
    406 struct __is_forward_iterator : public __has_iterator_category_convertible_to<_Tp, forward_iterator_tag> {};
    407 
    408 template <class _Tp>
    409 struct __is_bidirectional_iterator : public __has_iterator_category_convertible_to<_Tp, bidirectional_iterator_tag> {};
    410 
    411 template <class _Tp>
    412 struct __is_random_access_iterator : public __has_iterator_category_convertible_to<_Tp, random_access_iterator_tag> {};
    413 
    414 template<class _Category, class _Tp, class _Distance = ptrdiff_t,
    415          class _Pointer = _Tp*, class _Reference = _Tp&>
    416 struct _LIBCPP_TYPE_VIS iterator
    417 {
    418     typedef _Tp        value_type;
    419     typedef _Distance  difference_type;
    420     typedef _Pointer   pointer;
    421     typedef _Reference reference;
    422     typedef _Category  iterator_category;
    423 };
    424 
    425 template <class _InputIter>
    426 inline _LIBCPP_INLINE_VISIBILITY
    427 void __advance(_InputIter& __i,
    428              typename iterator_traits<_InputIter>::difference_type __n, input_iterator_tag)
    429 {
    430     for (; __n > 0; --__n)
    431         ++__i;
    432 }
    433 
    434 template <class _BiDirIter>
    435 inline _LIBCPP_INLINE_VISIBILITY
    436 void __advance(_BiDirIter& __i,
    437              typename iterator_traits<_BiDirIter>::difference_type __n, bidirectional_iterator_tag)
    438 {
    439     if (__n >= 0)
    440         for (; __n > 0; --__n)
    441             ++__i;
    442     else
    443         for (; __n < 0; ++__n)
    444             --__i;
    445 }
    446 
    447 template <class _RandIter>
    448 inline _LIBCPP_INLINE_VISIBILITY
    449 void __advance(_RandIter& __i,
    450              typename iterator_traits<_RandIter>::difference_type __n, random_access_iterator_tag)
    451 {
    452    __i += __n;
    453 }
    454 
    455 template <class _InputIter>
    456 inline _LIBCPP_INLINE_VISIBILITY
    457 void advance(_InputIter& __i,
    458              typename iterator_traits<_InputIter>::difference_type __n)
    459 {
    460     __advance(__i, __n, typename iterator_traits<_InputIter>::iterator_category());
    461 }
    462 
    463 template <class _InputIter>
    464 inline _LIBCPP_INLINE_VISIBILITY
    465 typename iterator_traits<_InputIter>::difference_type
    466 __distance(_InputIter __first, _InputIter __last, input_iterator_tag)
    467 {
    468     typename iterator_traits<_InputIter>::difference_type __r(0);
    469     for (; __first != __last; ++__first)
    470         ++__r;
    471     return __r;
    472 }
    473 
    474 template <class _RandIter>
    475 inline _LIBCPP_INLINE_VISIBILITY
    476 typename iterator_traits<_RandIter>::difference_type
    477 __distance(_RandIter __first, _RandIter __last, random_access_iterator_tag)
    478 {
    479     return __last - __first;
    480 }
    481 
    482 template <class _InputIter>
    483 inline _LIBCPP_INLINE_VISIBILITY
    484 typename iterator_traits<_InputIter>::difference_type
    485 distance(_InputIter __first, _InputIter __last)
    486 {
    487     return __distance(__first, __last, typename iterator_traits<_InputIter>::iterator_category());
    488 }
    489 
    490 template <class _ForwardIter>
    491 inline _LIBCPP_INLINE_VISIBILITY
    492 _ForwardIter
    493 next(_ForwardIter __x,
    494      typename iterator_traits<_ForwardIter>::difference_type __n = 1,
    495      typename enable_if<__is_forward_iterator<_ForwardIter>::value>::type* = 0)
    496 {
    497     _VSTD::advance(__x, __n);
    498     return __x;
    499 }
    500 
    501 template <class _BidiretionalIter>
    502 inline _LIBCPP_INLINE_VISIBILITY
    503 _BidiretionalIter
    504 prev(_BidiretionalIter __x,
    505      typename iterator_traits<_BidiretionalIter>::difference_type __n = 1,
    506      typename enable_if<__is_bidirectional_iterator<_BidiretionalIter>::value>::type* = 0)
    507 {
    508     _VSTD::advance(__x, -__n);
    509     return __x;
    510 }
    511 
    512 template <class _Iter>
    513 class _LIBCPP_TYPE_VIS reverse_iterator
    514     : public iterator<typename iterator_traits<_Iter>::iterator_category,
    515                       typename iterator_traits<_Iter>::value_type,
    516                       typename iterator_traits<_Iter>::difference_type,
    517                       typename iterator_traits<_Iter>::pointer,
    518                       typename iterator_traits<_Iter>::reference>
    519 {
    520 private:
    521     mutable _Iter __t;
    522 protected:
    523     _Iter current;
    524 public:
    525     typedef _Iter                                            iterator_type;
    526     typedef typename iterator_traits<_Iter>::difference_type difference_type;
    527     typedef typename iterator_traits<_Iter>::reference       reference;
    528     typedef typename iterator_traits<_Iter>::pointer         pointer;
    529 
    530     _LIBCPP_INLINE_VISIBILITY reverse_iterator() : current() {}
    531     _LIBCPP_INLINE_VISIBILITY explicit reverse_iterator(_Iter __x) : __t(__x), current(__x) {}
    532     template <class _Up> _LIBCPP_INLINE_VISIBILITY reverse_iterator(const reverse_iterator<_Up>& __u)
    533         : __t(__u.base()), current(__u.base()) {}
    534     _LIBCPP_INLINE_VISIBILITY _Iter base() const {return current;}
    535     _LIBCPP_INLINE_VISIBILITY reference operator*() const {__t = current; return *--__t;}
    536     _LIBCPP_INLINE_VISIBILITY pointer  operator->() const {return &(operator*());}
    537     _LIBCPP_INLINE_VISIBILITY reverse_iterator& operator++() {--current; return *this;}
    538     _LIBCPP_INLINE_VISIBILITY reverse_iterator  operator++(int)
    539         {reverse_iterator __tmp(*this); --current; return __tmp;}
    540     _LIBCPP_INLINE_VISIBILITY reverse_iterator& operator--() {++current; return *this;}
    541     _LIBCPP_INLINE_VISIBILITY reverse_iterator  operator--(int)
    542         {reverse_iterator __tmp(*this); ++current; return __tmp;}
    543     _LIBCPP_INLINE_VISIBILITY reverse_iterator  operator+ (difference_type __n) const
    544         {return reverse_iterator(current - __n);}
    545     _LIBCPP_INLINE_VISIBILITY reverse_iterator& operator+=(difference_type __n)
    546         {current -= __n; return *this;}
    547     _LIBCPP_INLINE_VISIBILITY reverse_iterator  operator- (difference_type __n) const
    548         {return reverse_iterator(current + __n);}
    549     _LIBCPP_INLINE_VISIBILITY reverse_iterator& operator-=(difference_type __n)
    550         {current += __n; return *this;}
    551     _LIBCPP_INLINE_VISIBILITY reference         operator[](difference_type __n) const
    552         {return current[-__n-1];}
    553 };
    554 
    555 template <class _Iter1, class _Iter2>
    556 inline _LIBCPP_INLINE_VISIBILITY
    557 bool
    558 operator==(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)
    559 {
    560     return __x.base() == __y.base();
    561 }
    562 
    563 template <class _Iter1, class _Iter2>
    564 inline _LIBCPP_INLINE_VISIBILITY
    565 bool
    566 operator<(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)
    567 {
    568     return __x.base() > __y.base();
    569 }
    570 
    571 template <class _Iter1, class _Iter2>
    572 inline _LIBCPP_INLINE_VISIBILITY
    573 bool
    574 operator!=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)
    575 {
    576     return __x.base() != __y.base();
    577 }
    578 
    579 template <class _Iter1, class _Iter2>
    580 inline _LIBCPP_INLINE_VISIBILITY
    581 bool
    582 operator>(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)
    583 {
    584     return __x.base() < __y.base();
    585 }
    586 
    587 template <class _Iter1, class _Iter2>
    588 inline _LIBCPP_INLINE_VISIBILITY
    589 bool
    590 operator>=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)
    591 {
    592     return __x.base() <= __y.base();
    593 }
    594 
    595 template <class _Iter1, class _Iter2>
    596 inline _LIBCPP_INLINE_VISIBILITY
    597 bool
    598 operator<=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)
    599 {
    600     return __x.base() >= __y.base();
    601 }
    602 
    603 template <class _Iter1, class _Iter2>
    604 inline _LIBCPP_INLINE_VISIBILITY
    605 typename reverse_iterator<_Iter1>::difference_type
    606 operator-(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)
    607 {
    608     return __y.base() - __x.base();
    609 }
    610 
    611 template <class _Iter>
    612 inline _LIBCPP_INLINE_VISIBILITY
    613 reverse_iterator<_Iter>
    614 operator+(typename reverse_iterator<_Iter>::difference_type __n, const reverse_iterator<_Iter>& __x)
    615 {
    616     return reverse_iterator<_Iter>(__x.base() - __n);
    617 }
    618 
    619 template <class _Container>
    620 class _LIBCPP_TYPE_VIS back_insert_iterator
    621     : public iterator<output_iterator_tag,
    622                       void,
    623                       void,
    624                       void,
    625                       back_insert_iterator<_Container>&>
    626 {
    627 protected:
    628     _Container* container;
    629 public:
    630     typedef _Container container_type;
    631 
    632     _LIBCPP_INLINE_VISIBILITY explicit back_insert_iterator(_Container& __x) : container(&__x) {}
    633     _LIBCPP_INLINE_VISIBILITY back_insert_iterator& operator=(const typename _Container::value_type& __value_)
    634         {container->push_back(__value_); return *this;}
    635 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
    636     _LIBCPP_INLINE_VISIBILITY back_insert_iterator& operator=(typename _Container::value_type&& __value_)
    637         {container->push_back(_VSTD::move(__value_)); return *this;}
    638 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
    639     _LIBCPP_INLINE_VISIBILITY back_insert_iterator& operator*()     {return *this;}
    640     _LIBCPP_INLINE_VISIBILITY back_insert_iterator& operator++()    {return *this;}
    641     _LIBCPP_INLINE_VISIBILITY back_insert_iterator  operator++(int) {return *this;}
    642 };
    643 
    644 template <class _Container>
    645 inline _LIBCPP_INLINE_VISIBILITY
    646 back_insert_iterator<_Container>
    647 back_inserter(_Container& __x)
    648 {
    649     return back_insert_iterator<_Container>(__x);
    650 }
    651 
    652 template <class _Container>
    653 class _LIBCPP_TYPE_VIS front_insert_iterator
    654     : public iterator<output_iterator_tag,
    655                       void,
    656                       void,
    657                       void,
    658                       front_insert_iterator<_Container>&>
    659 {
    660 protected:
    661     _Container* container;
    662 public:
    663     typedef _Container container_type;
    664 
    665     _LIBCPP_INLINE_VISIBILITY explicit front_insert_iterator(_Container& __x) : container(&__x) {}
    666     _LIBCPP_INLINE_VISIBILITY front_insert_iterator& operator=(const typename _Container::value_type& __value_)
    667         {container->push_front(__value_); return *this;}
    668 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
    669     _LIBCPP_INLINE_VISIBILITY front_insert_iterator& operator=(typename _Container::value_type&& __value_)
    670         {container->push_front(_VSTD::move(__value_)); return *this;}
    671 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
    672     _LIBCPP_INLINE_VISIBILITY front_insert_iterator& operator*()     {return *this;}
    673     _LIBCPP_INLINE_VISIBILITY front_insert_iterator& operator++()    {return *this;}
    674     _LIBCPP_INLINE_VISIBILITY front_insert_iterator  operator++(int) {return *this;}
    675 };
    676 
    677 template <class _Container>
    678 inline _LIBCPP_INLINE_VISIBILITY
    679 front_insert_iterator<_Container>
    680 front_inserter(_Container& __x)
    681 {
    682     return front_insert_iterator<_Container>(__x);
    683 }
    684 
    685 template <class _Container>
    686 class _LIBCPP_TYPE_VIS insert_iterator
    687     : public iterator<output_iterator_tag,
    688                       void,
    689                       void,
    690                       void,
    691                       insert_iterator<_Container>&>
    692 {
    693 protected:
    694     _Container* container;
    695     typename _Container::iterator iter;
    696 public:
    697     typedef _Container container_type;
    698 
    699     _LIBCPP_INLINE_VISIBILITY insert_iterator(_Container& __x, typename _Container::iterator __i)
    700         : container(&__x), iter(__i) {}
    701     _LIBCPP_INLINE_VISIBILITY insert_iterator& operator=(const typename _Container::value_type& __value_)
    702         {iter = container->insert(iter, __value_); ++iter; return *this;}
    703 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
    704     _LIBCPP_INLINE_VISIBILITY insert_iterator& operator=(typename _Container::value_type&& __value_)
    705         {iter = container->insert(iter, _VSTD::move(__value_)); ++iter; return *this;}
    706 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
    707     _LIBCPP_INLINE_VISIBILITY insert_iterator& operator*()        {return *this;}
    708     _LIBCPP_INLINE_VISIBILITY insert_iterator& operator++()       {return *this;}
    709     _LIBCPP_INLINE_VISIBILITY insert_iterator& operator++(int)    {return *this;}
    710 };
    711 
    712 template <class _Container>
    713 inline _LIBCPP_INLINE_VISIBILITY
    714 insert_iterator<_Container>
    715 inserter(_Container& __x, typename _Container::iterator __i)
    716 {
    717     return insert_iterator<_Container>(__x, __i);
    718 }
    719 
    720 template <class _Tp, class _CharT = char,
    721           class _Traits = char_traits<_CharT>, class _Distance = ptrdiff_t>
    722 class _LIBCPP_TYPE_VIS istream_iterator
    723     : public iterator<input_iterator_tag, _Tp, _Distance, const _Tp*, const _Tp&>
    724 {
    725 public:
    726     typedef _CharT char_type;
    727     typedef _Traits traits_type;
    728     typedef basic_istream<_CharT,_Traits> istream_type;
    729 private:
    730     istream_type* __in_stream_;
    731     _Tp __value_;
    732 public:
    733     _LIBCPP_INLINE_VISIBILITY istream_iterator() : __in_stream_(0) {}
    734     _LIBCPP_INLINE_VISIBILITY istream_iterator(istream_type& __s) : __in_stream_(&__s)
    735         {
    736             if (!(*__in_stream_ >> __value_))
    737                 __in_stream_ = 0;
    738         }
    739 
    740     _LIBCPP_INLINE_VISIBILITY const _Tp& operator*() const {return __value_;}
    741     _LIBCPP_INLINE_VISIBILITY const _Tp* operator->() const {return &(operator*());}
    742     _LIBCPP_INLINE_VISIBILITY istream_iterator& operator++()
    743         {
    744             if (!(*__in_stream_ >> __value_))
    745                 __in_stream_ = 0;
    746             return *this;
    747         }
    748     _LIBCPP_INLINE_VISIBILITY istream_iterator  operator++(int)
    749         {istream_iterator __t(*this); ++(*this); return __t;}
    750 
    751     friend _LIBCPP_INLINE_VISIBILITY
    752     bool operator==(const istream_iterator& __x, const istream_iterator& __y)
    753         {return __x.__in_stream_ == __y.__in_stream_;}
    754 
    755     friend _LIBCPP_INLINE_VISIBILITY
    756     bool operator!=(const istream_iterator& __x, const istream_iterator& __y)
    757         {return !(__x == __y);}
    758 };
    759 
    760 template <class _Tp, class _CharT = char, class _Traits = char_traits<_CharT> >
    761 class _LIBCPP_TYPE_VIS ostream_iterator
    762     : public iterator<output_iterator_tag, void, void, void, void>
    763 {
    764 public:
    765     typedef _CharT char_type;
    766     typedef _Traits traits_type;
    767     typedef basic_ostream<_CharT,_Traits> ostream_type;
    768 private:
    769     ostream_type* __out_stream_;
    770     const char_type* __delim_;
    771 public:
    772     _LIBCPP_INLINE_VISIBILITY ostream_iterator(ostream_type& __s)
    773         : __out_stream_(&__s), __delim_(0) {}
    774     _LIBCPP_INLINE_VISIBILITY ostream_iterator(ostream_type& __s, const _CharT* __delimiter)
    775         : __out_stream_(&__s), __delim_(__delimiter) {}
    776     _LIBCPP_INLINE_VISIBILITY ostream_iterator& operator=(const _Tp& __value_)
    777         {
    778             *__out_stream_ << __value_;
    779             if (__delim_)
    780                 *__out_stream_ << __delim_;
    781             return *this;
    782         }
    783 
    784     _LIBCPP_INLINE_VISIBILITY ostream_iterator& operator*()     {return *this;}
    785     _LIBCPP_INLINE_VISIBILITY ostream_iterator& operator++()    {return *this;}
    786     _LIBCPP_INLINE_VISIBILITY ostream_iterator& operator++(int) {return *this;}
    787 };
    788 
    789 template<class _CharT, class _Traits>
    790 class _LIBCPP_TYPE_VIS istreambuf_iterator
    791     : public iterator<input_iterator_tag, _CharT,
    792                       typename _Traits::off_type, _CharT*,
    793                       _CharT>
    794 {
    795 public:
    796     typedef _CharT                          char_type;
    797     typedef _Traits                         traits_type;
    798     typedef typename _Traits::int_type      int_type;
    799     typedef basic_streambuf<_CharT,_Traits> streambuf_type;
    800     typedef basic_istream<_CharT,_Traits>   istream_type;
    801 private:
    802     mutable streambuf_type* __sbuf_;
    803 
    804     class __proxy
    805     {
    806         char_type __keep_;
    807         streambuf_type* __sbuf_;
    808         _LIBCPP_INLINE_VISIBILITY __proxy(char_type __c, streambuf_type* __s)
    809             : __keep_(__c), __sbuf_(__s) {}
    810         friend class istreambuf_iterator;
    811     public:
    812         _LIBCPP_INLINE_VISIBILITY char_type operator*() const {return __keep_;}
    813     };
    814 
    815     _LIBCPP_INLINE_VISIBILITY
    816     bool __test_for_eof() const
    817     {
    818         if (__sbuf_ && traits_type::eq_int_type(__sbuf_->sgetc(), traits_type::eof()))
    819             __sbuf_ = 0;
    820         return __sbuf_ == 0;
    821     }
    822 public:
    823     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR istreambuf_iterator() _NOEXCEPT : __sbuf_(0) {}
    824     _LIBCPP_INLINE_VISIBILITY istreambuf_iterator(istream_type& __s) _NOEXCEPT
    825         : __sbuf_(__s.rdbuf()) {}
    826     _LIBCPP_INLINE_VISIBILITY istreambuf_iterator(streambuf_type* __s) _NOEXCEPT
    827         : __sbuf_(__s) {}
    828     _LIBCPP_INLINE_VISIBILITY istreambuf_iterator(const __proxy& __p) _NOEXCEPT
    829         : __sbuf_(__p.__sbuf_) {}
    830 
    831     _LIBCPP_INLINE_VISIBILITY char_type  operator*() const
    832         {return static_cast<char_type>(__sbuf_->sgetc());}
    833     _LIBCPP_INLINE_VISIBILITY char_type* operator->() const {return nullptr;}
    834     _LIBCPP_INLINE_VISIBILITY istreambuf_iterator& operator++()
    835         {
    836             __sbuf_->sbumpc();
    837             return *this;
    838         }
    839     _LIBCPP_INLINE_VISIBILITY __proxy              operator++(int)
    840         {
    841             return __proxy(__sbuf_->sbumpc(), __sbuf_);
    842         }
    843 
    844     _LIBCPP_INLINE_VISIBILITY bool equal(const istreambuf_iterator& __b) const
    845         {return __test_for_eof() == __b.__test_for_eof();}
    846 };
    847 
    848 template <class _CharT, class _Traits>
    849 inline _LIBCPP_INLINE_VISIBILITY
    850 bool operator==(const istreambuf_iterator<_CharT,_Traits>& __a,
    851                 const istreambuf_iterator<_CharT,_Traits>& __b)
    852                 {return __a.equal(__b);}
    853 
    854 template <class _CharT, class _Traits>
    855 inline _LIBCPP_INLINE_VISIBILITY
    856 bool operator!=(const istreambuf_iterator<_CharT,_Traits>& __a,
    857                 const istreambuf_iterator<_CharT,_Traits>& __b)
    858                 {return !__a.equal(__b);}
    859 
    860 template <class _CharT, class _Traits>
    861 class _LIBCPP_TYPE_VIS ostreambuf_iterator
    862     : public iterator<output_iterator_tag, void, void, void, void>
    863 {
    864 public:
    865     typedef _CharT                          char_type;
    866     typedef _Traits                         traits_type;
    867     typedef basic_streambuf<_CharT,_Traits> streambuf_type;
    868     typedef basic_ostream<_CharT,_Traits>   ostream_type;
    869 private:
    870     streambuf_type* __sbuf_;
    871 public:
    872     _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator(ostream_type& __s) _NOEXCEPT
    873         : __sbuf_(__s.rdbuf()) {}
    874     _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator(streambuf_type* __s) _NOEXCEPT
    875         : __sbuf_(__s) {}
    876     _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator& operator=(_CharT __c)
    877         {
    878             if (__sbuf_ && traits_type::eq_int_type(__sbuf_->sputc(__c), traits_type::eof()))
    879                 __sbuf_ = 0;
    880             return *this;
    881         }
    882     _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator& operator*()     {return *this;}
    883     _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator& operator++()    {return *this;}
    884     _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator& operator++(int) {return *this;}
    885     _LIBCPP_INLINE_VISIBILITY bool failed() const _NOEXCEPT {return __sbuf_ == 0;}
    886 
    887 #if !defined(__APPLE__) || \
    888     (defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED > __MAC_10_8) || \
    889     (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_6_0)
    890 
    891     template <class _Ch, class _Tr>
    892     friend
    893     _LIBCPP_HIDDEN
    894     ostreambuf_iterator<_Ch, _Tr>
    895     __pad_and_output(ostreambuf_iterator<_Ch, _Tr> __s,
    896                      const _Ch* __ob, const _Ch* __op, const _Ch* __oe,
    897                      ios_base& __iob, _Ch __fl);
    898 #endif
    899 };
    900 
    901 template <class _Iter>
    902 class _LIBCPP_TYPE_VIS move_iterator
    903 {
    904 private:
    905     _Iter __i;
    906 public:
    907     typedef _Iter                                            iterator_type;
    908     typedef typename iterator_traits<iterator_type>::iterator_category iterator_category;
    909     typedef typename iterator_traits<iterator_type>::value_type value_type;
    910     typedef typename iterator_traits<iterator_type>::difference_type difference_type;
    911     typedef typename iterator_traits<iterator_type>::pointer pointer;
    912 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
    913     typedef value_type&& reference;
    914 #else
    915     typedef typename iterator_traits<iterator_type>::reference reference;
    916 #endif
    917 
    918     _LIBCPP_INLINE_VISIBILITY move_iterator() : __i() {}
    919     _LIBCPP_INLINE_VISIBILITY explicit move_iterator(_Iter __x) : __i(__x) {}
    920     template <class _Up> _LIBCPP_INLINE_VISIBILITY move_iterator(const move_iterator<_Up>& __u)
    921         : __i(__u.base()) {}
    922     _LIBCPP_INLINE_VISIBILITY _Iter base() const {return __i;}
    923     _LIBCPP_INLINE_VISIBILITY reference operator*() const {
    924       return static_cast<reference>(*__i);
    925     }
    926     _LIBCPP_INLINE_VISIBILITY pointer  operator->() const {
    927       typename iterator_traits<iterator_type>::reference __ref = *__i;
    928       return &__ref;
    929     }
    930     _LIBCPP_INLINE_VISIBILITY move_iterator& operator++() {++__i; return *this;}
    931     _LIBCPP_INLINE_VISIBILITY move_iterator  operator++(int)
    932         {move_iterator __tmp(*this); ++__i; return __tmp;}
    933     _LIBCPP_INLINE_VISIBILITY move_iterator& operator--() {--__i; return *this;}
    934     _LIBCPP_INLINE_VISIBILITY move_iterator  operator--(int)
    935         {move_iterator __tmp(*this); --__i; return __tmp;}
    936     _LIBCPP_INLINE_VISIBILITY move_iterator  operator+ (difference_type __n) const
    937         {return move_iterator(__i + __n);}
    938     _LIBCPP_INLINE_VISIBILITY move_iterator& operator+=(difference_type __n)
    939         {__i += __n; return *this;}
    940     _LIBCPP_INLINE_VISIBILITY move_iterator  operator- (difference_type __n) const
    941         {return move_iterator(__i - __n);}
    942     _LIBCPP_INLINE_VISIBILITY move_iterator& operator-=(difference_type __n)
    943         {__i -= __n; return *this;}
    944     _LIBCPP_INLINE_VISIBILITY reference         operator[](difference_type __n) const
    945     {
    946       return static_cast<reference>(__i[__n]);
    947     }
    948 };
    949 
    950 template <class _Iter1, class _Iter2>
    951 inline _LIBCPP_INLINE_VISIBILITY
    952 bool
    953 operator==(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
    954 {
    955     return __x.base() == __y.base();
    956 }
    957 
    958 template <class _Iter1, class _Iter2>
    959 inline _LIBCPP_INLINE_VISIBILITY
    960 bool
    961 operator<(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
    962 {
    963     return __x.base() < __y.base();
    964 }
    965 
    966 template <class _Iter1, class _Iter2>
    967 inline _LIBCPP_INLINE_VISIBILITY
    968 bool
    969 operator!=(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
    970 {
    971     return __x.base() != __y.base();
    972 }
    973 
    974 template <class _Iter1, class _Iter2>
    975 inline _LIBCPP_INLINE_VISIBILITY
    976 bool
    977 operator>(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
    978 {
    979     return __x.base() > __y.base();
    980 }
    981 
    982 template <class _Iter1, class _Iter2>
    983 inline _LIBCPP_INLINE_VISIBILITY
    984 bool
    985 operator>=(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
    986 {
    987     return __x.base() >= __y.base();
    988 }
    989 
    990 template <class _Iter1, class _Iter2>
    991 inline _LIBCPP_INLINE_VISIBILITY
    992 bool
    993 operator<=(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
    994 {
    995     return __x.base() <= __y.base();
    996 }
    997 
    998 template <class _Iter1, class _Iter2>
    999 inline _LIBCPP_INLINE_VISIBILITY
   1000 typename move_iterator<_Iter1>::difference_type
   1001 operator-(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
   1002 {
   1003     return __x.base() - __y.base();
   1004 }
   1005 
   1006 template <class _Iter>
   1007 inline _LIBCPP_INLINE_VISIBILITY
   1008 move_iterator<_Iter>
   1009 operator+(typename move_iterator<_Iter>::difference_type __n, const move_iterator<_Iter>& __x)
   1010 {
   1011     return move_iterator<_Iter>(__x.base() + __n);
   1012 }
   1013 
   1014 template <class _Iter>
   1015 inline _LIBCPP_INLINE_VISIBILITY
   1016 move_iterator<_Iter>
   1017 make_move_iterator(const _Iter& __i)
   1018 {
   1019     return move_iterator<_Iter>(__i);
   1020 }
   1021 
   1022 // __wrap_iter
   1023 
   1024 template <class _Iter> class __wrap_iter;
   1025 
   1026 template <class _Iter1, class _Iter2>
   1027 _LIBCPP_INLINE_VISIBILITY
   1028 bool
   1029 operator==(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT;
   1030 
   1031 template <class _Iter1, class _Iter2>
   1032 _LIBCPP_INLINE_VISIBILITY
   1033 bool
   1034 operator<(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT;
   1035 
   1036 template <class _Iter1, class _Iter2>
   1037 _LIBCPP_INLINE_VISIBILITY
   1038 bool
   1039 operator!=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT;
   1040 
   1041 template <class _Iter1, class _Iter2>
   1042 _LIBCPP_INLINE_VISIBILITY
   1043 bool
   1044 operator>(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT;
   1045 
   1046 template <class _Iter1, class _Iter2>
   1047 _LIBCPP_INLINE_VISIBILITY
   1048 bool
   1049 operator>=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT;
   1050 
   1051 template <class _Iter1, class _Iter2>
   1052 _LIBCPP_INLINE_VISIBILITY
   1053 bool
   1054 operator<=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT;
   1055 
   1056 template <class _Iter1, class _Iter2>
   1057 _LIBCPP_INLINE_VISIBILITY
   1058 typename __wrap_iter<_Iter1>::difference_type
   1059 operator-(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT;
   1060 
   1061 template <class _Iter>
   1062 _LIBCPP_INLINE_VISIBILITY
   1063 __wrap_iter<_Iter>
   1064 operator+(typename __wrap_iter<_Iter>::difference_type, __wrap_iter<_Iter>) _NOEXCEPT;
   1065 
   1066 template <class _Ip, class _Op> _Op _LIBCPP_INLINE_VISIBILITY copy(_Ip, _Ip, _Op);
   1067 template <class _B1, class _B2> _B2 _LIBCPP_INLINE_VISIBILITY copy_backward(_B1, _B1, _B2);
   1068 template <class _Ip, class _Op> _Op _LIBCPP_INLINE_VISIBILITY move(_Ip, _Ip, _Op);
   1069 template <class _B1, class _B2> _B2 _LIBCPP_INLINE_VISIBILITY move_backward(_B1, _B1, _B2);
   1070 
   1071 template <class _Tp>
   1072 _LIBCPP_INLINE_VISIBILITY
   1073 typename enable_if
   1074 <
   1075     is_trivially_copy_assignable<_Tp>::value,
   1076     _Tp*
   1077 >::type
   1078 __unwrap_iter(__wrap_iter<_Tp*>);
   1079 
   1080 template <class _Iter>
   1081 class __wrap_iter
   1082 {
   1083 public:
   1084     typedef _Iter                                                      iterator_type;
   1085     typedef typename iterator_traits<iterator_type>::iterator_category iterator_category;
   1086     typedef typename iterator_traits<iterator_type>::value_type        value_type;
   1087     typedef typename iterator_traits<iterator_type>::difference_type   difference_type;
   1088     typedef typename iterator_traits<iterator_type>::pointer           pointer;
   1089     typedef typename iterator_traits<iterator_type>::reference         reference;
   1090 private:
   1091     iterator_type __i;
   1092 public:
   1093     _LIBCPP_INLINE_VISIBILITY __wrap_iter() _NOEXCEPT
   1094     {
   1095 #if _LIBCPP_DEBUG_LEVEL >= 2
   1096         __get_db()->__insert_i(this);
   1097 #endif
   1098     }
   1099     template <class _Up> _LIBCPP_INLINE_VISIBILITY __wrap_iter(const __wrap_iter<_Up>& __u,
   1100         typename enable_if<is_convertible<_Up, iterator_type>::value>::type* = 0) _NOEXCEPT
   1101         : __i(__u.base())
   1102     {
   1103 #if _LIBCPP_DEBUG_LEVEL >= 2
   1104         __get_db()->__iterator_copy(this, &__u);
   1105 #endif
   1106     }
   1107 #if _LIBCPP_DEBUG_LEVEL >= 2
   1108     _LIBCPP_INLINE_VISIBILITY
   1109     __wrap_iter(const __wrap_iter& __x)
   1110         : __i(__x.base())
   1111     {
   1112         __get_db()->__iterator_copy(this, &__x);
   1113     }
   1114     _LIBCPP_INLINE_VISIBILITY
   1115     __wrap_iter& operator=(const __wrap_iter& __x)
   1116     {
   1117         if (this != &__x)
   1118         {
   1119             __get_db()->__iterator_copy(this, &__x);
   1120             __i = __x.__i;
   1121         }
   1122         return *this;
   1123     }
   1124     _LIBCPP_INLINE_VISIBILITY
   1125     ~__wrap_iter()
   1126     {
   1127         __get_db()->__erase_i(this);
   1128     }
   1129 #endif
   1130     _LIBCPP_INLINE_VISIBILITY reference operator*() const _NOEXCEPT
   1131     {
   1132 #if _LIBCPP_DEBUG_LEVEL >= 2
   1133         _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
   1134                        "Attempted to dereference a non-dereferenceable iterator");
   1135 #endif
   1136         return *__i;
   1137     }
   1138     _LIBCPP_INLINE_VISIBILITY pointer  operator->() const _NOEXCEPT
   1139     {
   1140 #if _LIBCPP_DEBUG_LEVEL >= 2
   1141         _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
   1142                        "Attempted to dereference a non-dereferenceable iterator");
   1143 #endif
   1144         return (pointer)&reinterpret_cast<const volatile char&>(*__i);
   1145     }
   1146     _LIBCPP_INLINE_VISIBILITY __wrap_iter& operator++() _NOEXCEPT
   1147     {
   1148 #if _LIBCPP_DEBUG_LEVEL >= 2
   1149         _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
   1150                        "Attempted to increment non-incrementable iterator");
   1151 #endif
   1152         ++__i;
   1153         return *this;
   1154     }
   1155     _LIBCPP_INLINE_VISIBILITY __wrap_iter  operator++(int) _NOEXCEPT
   1156         {__wrap_iter __tmp(*this); ++(*this); return __tmp;}
   1157     _LIBCPP_INLINE_VISIBILITY __wrap_iter& operator--() _NOEXCEPT
   1158     {
   1159 #if _LIBCPP_DEBUG_LEVEL >= 2
   1160         _LIBCPP_ASSERT(__get_const_db()->__decrementable(this),
   1161                        "Attempted to decrement non-decrementable iterator");
   1162 #endif
   1163         --__i;
   1164         return *this;
   1165     }
   1166     _LIBCPP_INLINE_VISIBILITY __wrap_iter  operator--(int) _NOEXCEPT
   1167         {__wrap_iter __tmp(*this); --(*this); return __tmp;}
   1168     _LIBCPP_INLINE_VISIBILITY __wrap_iter  operator+ (difference_type __n) const _NOEXCEPT
   1169         {__wrap_iter __w(*this); __w += __n; return __w;}
   1170     _LIBCPP_INLINE_VISIBILITY __wrap_iter& operator+=(difference_type __n) _NOEXCEPT
   1171     {
   1172 #if _LIBCPP_DEBUG_LEVEL >= 2
   1173         _LIBCPP_ASSERT(__get_const_db()->__addable(this, __n),
   1174                    "Attempted to add/subtract iterator outside of valid range");
   1175 #endif
   1176         __i += __n;
   1177         return *this;
   1178     }
   1179     _LIBCPP_INLINE_VISIBILITY __wrap_iter  operator- (difference_type __n) const _NOEXCEPT
   1180         {return *this + (-__n);}
   1181     _LIBCPP_INLINE_VISIBILITY __wrap_iter& operator-=(difference_type __n) _NOEXCEPT
   1182         {*this += -__n; return *this;}
   1183     _LIBCPP_INLINE_VISIBILITY reference        operator[](difference_type __n) const _NOEXCEPT
   1184     {
   1185 #if _LIBCPP_DEBUG_LEVEL >= 2
   1186         _LIBCPP_ASSERT(__get_const_db()->__subscriptable(this, __n),
   1187                    "Attempted to subscript iterator outside of valid range");
   1188 #endif
   1189         return __i[__n];
   1190     }
   1191 
   1192     _LIBCPP_INLINE_VISIBILITY iterator_type base() const _NOEXCEPT {return __i;}
   1193 
   1194 private:
   1195     _LIBCPP_INLINE_VISIBILITY __wrap_iter(iterator_type __x) _NOEXCEPT : __i(__x) {}
   1196 #if _LIBCPP_DEBUG_LEVEL >= 2
   1197     _LIBCPP_INLINE_VISIBILITY __wrap_iter(const void* __p, iterator_type __x) : __i(__x)
   1198     {
   1199         __get_db()->__insert_ic(this, __p);
   1200     }
   1201 #endif
   1202 
   1203     template <class _Up> friend class __wrap_iter;
   1204     template <class _CharT, class _Traits, class _Alloc> friend class basic_string;
   1205     template <class _Tp, class _Alloc> friend class vector;
   1206 
   1207     template <class _Iter1, class _Iter2>
   1208     friend
   1209     bool
   1210     operator==(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT;
   1211 
   1212     template <class _Iter1, class _Iter2>
   1213     friend
   1214     bool
   1215     operator<(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT;
   1216 
   1217     template <class _Iter1, class _Iter2>
   1218     friend
   1219     bool
   1220     operator!=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT;
   1221 
   1222     template <class _Iter1, class _Iter2>
   1223     friend
   1224     bool
   1225     operator>(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT;
   1226 
   1227     template <class _Iter1, class _Iter2>
   1228     friend
   1229     bool
   1230     operator>=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT;
   1231 
   1232     template <class _Iter1, class _Iter2>
   1233     friend
   1234     bool
   1235     operator<=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT;
   1236 
   1237     template <class _Iter1, class _Iter2>
   1238     friend
   1239     typename __wrap_iter<_Iter1>::difference_type
   1240     operator-(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT;
   1241 
   1242     template <class _Iter1>
   1243     friend
   1244     __wrap_iter<_Iter1>
   1245     operator+(typename __wrap_iter<_Iter1>::difference_type, __wrap_iter<_Iter1>) _NOEXCEPT;
   1246 
   1247     template <class _Ip, class _Op> friend _Op copy(_Ip, _Ip, _Op);
   1248     template <class _B1, class _B2> friend _B2 copy_backward(_B1, _B1, _B2);
   1249     template <class _Ip, class _Op> friend _Op move(_Ip, _Ip, _Op);
   1250     template <class _B1, class _B2> friend _B2 move_backward(_B1, _B1, _B2);
   1251 
   1252     template <class _Tp>
   1253     friend
   1254     typename enable_if
   1255     <
   1256         is_trivially_copy_assignable<_Tp>::value,
   1257         _Tp*
   1258     >::type
   1259     __unwrap_iter(__wrap_iter<_Tp*>);
   1260 };
   1261 
   1262 template <class _Iter1, class _Iter2>
   1263 inline _LIBCPP_INLINE_VISIBILITY
   1264 bool
   1265 operator==(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT
   1266 {
   1267 #if _LIBCPP_DEBUG_LEVEL >= 2
   1268     _LIBCPP_ASSERT(__get_const_db()->__comparable(&__x, &__y),
   1269                    "Attempted to compare incomparable iterators");
   1270 #endif
   1271     return __x.base() == __y.base();
   1272 }
   1273 
   1274 template <class _Iter1, class _Iter2>
   1275 inline _LIBCPP_INLINE_VISIBILITY
   1276 bool
   1277 operator<(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT
   1278 {
   1279 #if _LIBCPP_DEBUG_LEVEL >= 2
   1280     _LIBCPP_ASSERT(__get_const_db()->__comparable(&__x, &__y),
   1281                    "Attempted to compare incomparable iterators");
   1282 #endif
   1283     return __x.base() < __y.base();
   1284 }
   1285 
   1286 template <class _Iter1, class _Iter2>
   1287 inline _LIBCPP_INLINE_VISIBILITY
   1288 bool
   1289 operator!=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT
   1290 {
   1291     return !(__x == __y);
   1292 }
   1293 
   1294 template <class _Iter1, class _Iter2>
   1295 inline _LIBCPP_INLINE_VISIBILITY
   1296 bool
   1297 operator>(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT
   1298 {
   1299     return __y < __x;
   1300 }
   1301 
   1302 template <class _Iter1, class _Iter2>
   1303 inline _LIBCPP_INLINE_VISIBILITY
   1304 bool
   1305 operator>=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT
   1306 {
   1307     return !(__x < __y);
   1308 }
   1309 
   1310 template <class _Iter1, class _Iter2>
   1311 inline _LIBCPP_INLINE_VISIBILITY
   1312 bool
   1313 operator<=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT
   1314 {
   1315     return !(__y < __x);
   1316 }
   1317 
   1318 template <class _Iter1>
   1319 inline _LIBCPP_INLINE_VISIBILITY
   1320 bool
   1321 operator!=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT
   1322 {
   1323     return !(__x == __y);
   1324 }
   1325 
   1326 template <class _Iter1>
   1327 inline _LIBCPP_INLINE_VISIBILITY
   1328 bool
   1329 operator>(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT
   1330 {
   1331     return __y < __x;
   1332 }
   1333 
   1334 template <class _Iter1>
   1335 inline _LIBCPP_INLINE_VISIBILITY
   1336 bool
   1337 operator>=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT
   1338 {
   1339     return !(__x < __y);
   1340 }
   1341 
   1342 template <class _Iter1>
   1343 inline _LIBCPP_INLINE_VISIBILITY
   1344 bool
   1345 operator<=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT
   1346 {
   1347     return !(__y < __x);
   1348 }
   1349 
   1350 template <class _Iter1, class _Iter2>
   1351 inline _LIBCPP_INLINE_VISIBILITY
   1352 typename __wrap_iter<_Iter1>::difference_type
   1353 operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT
   1354 {
   1355 #if _LIBCPP_DEBUG_LEVEL >= 2
   1356     _LIBCPP_ASSERT(__get_const_db()->__comparable(&__x, &__y),
   1357                    "Attempted to subtract incompatible iterators");
   1358 #endif
   1359     return __x.base() - __y.base();
   1360 }
   1361 
   1362 template <class _Iter>
   1363 inline _LIBCPP_INLINE_VISIBILITY
   1364 __wrap_iter<_Iter>
   1365 operator+(typename __wrap_iter<_Iter>::difference_type __n,
   1366           __wrap_iter<_Iter> __x) _NOEXCEPT
   1367 {
   1368     __x += __n;
   1369     return __x;
   1370 }
   1371 
   1372 #ifdef _LIBCPP_DEBUG
   1373 
   1374 // __debug_iter
   1375 
   1376 template <class _Container, class _Iter> class __debug_iter;
   1377 
   1378 template <class _Container, class _Iter1, class _Iter2>
   1379 _LIBCPP_INLINE_VISIBILITY
   1380 bool
   1381 operator==(const __debug_iter<_Container, _Iter1>&, const __debug_iter<_Container, _Iter2>&);
   1382 
   1383 template <class _Container, class _Iter1, class _Iter2>
   1384 _LIBCPP_INLINE_VISIBILITY
   1385 bool
   1386 operator<(const __debug_iter<_Container, _Iter1>&, const __debug_iter<_Container, _Iter2>&);
   1387 
   1388 template <class _Container, class _Iter1, class _Iter2>
   1389 _LIBCPP_INLINE_VISIBILITY
   1390 bool
   1391 operator!=(const __debug_iter<_Container, _Iter1>&, const __debug_iter<_Container, _Iter2>&);
   1392 
   1393 template <class _Container, class _Iter1, class _Iter2>
   1394 _LIBCPP_INLINE_VISIBILITY
   1395 bool
   1396 operator>(const __debug_iter<_Container, _Iter1>&, const __debug_iter<_Container, _Iter2>&);
   1397 
   1398 template <class _Container, class _Iter1, class _Iter2>
   1399 _LIBCPP_INLINE_VISIBILITY
   1400 bool
   1401 operator>=(const __debug_iter<_Container, _Iter1>&, const __debug_iter<_Container, _Iter2>&);
   1402 
   1403 template <class _Container, class _Iter1, class _Iter2>
   1404 _LIBCPP_INLINE_VISIBILITY
   1405 bool
   1406 operator<=(const __debug_iter<_Container, _Iter1>&, const __debug_iter<_Container, _Iter2>&);
   1407 
   1408 template <class _Container, class _Iter1, class _Iter2>
   1409 _LIBCPP_INLINE_VISIBILITY
   1410 typename __debug_iter<_Container, _Iter1>::difference_type
   1411 operator-(const __debug_iter<_Container, _Iter1>&, const __debug_iter<_Container, _Iter2>&);
   1412 
   1413 template <class _Container, class _Iter>
   1414 _LIBCPP_INLINE_VISIBILITY
   1415 __debug_iter<_Container, _Iter>
   1416 operator+(typename __debug_iter<_Container, _Iter>::difference_type, const __debug_iter<_Container, _Iter>&);
   1417 
   1418 template <class _Container, class _Iter>
   1419 class __debug_iter
   1420 {
   1421 public:
   1422     typedef _Iter                                                      iterator_type;
   1423     typedef _Container                                                 __container_type;
   1424     typedef typename iterator_traits<iterator_type>::iterator_category iterator_category;
   1425     typedef typename iterator_traits<iterator_type>::value_type        value_type;
   1426     typedef typename iterator_traits<iterator_type>::difference_type   difference_type;
   1427     typedef typename iterator_traits<iterator_type>::pointer           pointer;
   1428     typedef typename iterator_traits<iterator_type>::reference         reference;
   1429 private:
   1430     iterator_type __i;
   1431     __debug_iter* __next;
   1432     __container_type* __cont;
   1433 
   1434 public:
   1435     _LIBCPP_INLINE_VISIBILITY __debug_iter() : __next(0), __cont(0) {}
   1436     _LIBCPP_INLINE_VISIBILITY __debug_iter(const __debug_iter& __x)
   1437         : __i(__x.base()), __next(0), __cont(0) {__set_owner(__x.__cont);}
   1438     __debug_iter& operator=(const __debug_iter& __x);
   1439     template <class _Up> _LIBCPP_INLINE_VISIBILITY __debug_iter(const __debug_iter<_Container, _Up>& __u,
   1440         typename enable_if<is_convertible<_Up, iterator_type>::value>::type* = 0)
   1441         : __i(__u.base()), __next(0), __cont(0) {__set_owner(__u.__cont);}
   1442     _LIBCPP_INLINE_VISIBILITY ~__debug_iter() {__remove_owner();}
   1443     _LIBCPP_INLINE_VISIBILITY reference operator*() const {assert(__is_deref()); return *__i;}
   1444     _LIBCPP_INLINE_VISIBILITY pointer  operator->() const {return &(operator*());}
   1445     _LIBCPP_INLINE_VISIBILITY __debug_iter& operator++() {assert(__can_increment()); ++__i; return *this;}
   1446     _LIBCPP_INLINE_VISIBILITY __debug_iter  operator++(int)
   1447         {__debug_iter __tmp(*this); operator++(); return __tmp;}
   1448     _LIBCPP_INLINE_VISIBILITY __debug_iter& operator--() {assert(__can_decrement()); --__i; return *this;}
   1449     _LIBCPP_INLINE_VISIBILITY __debug_iter  operator--(int)
   1450         {__debug_iter __tmp(*this); operator--(); return __tmp;}
   1451     _LIBCPP_INLINE_VISIBILITY __debug_iter  operator+ (difference_type __n) const
   1452         {__debug_iter __t(*this); __t += __n; return __t;}
   1453     __debug_iter& operator+=(difference_type __n);
   1454     _LIBCPP_INLINE_VISIBILITY __debug_iter  operator- (difference_type __n) const
   1455         {__debug_iter __t(*this); __t -= __n; return __t;}
   1456     _LIBCPP_INLINE_VISIBILITY __debug_iter& operator-=(difference_type __n)
   1457         {*this += -__n; return *this;}
   1458     _LIBCPP_INLINE_VISIBILITY reference        operator[](difference_type __n) const
   1459         {return *(*this + __n);}
   1460 
   1461 private:
   1462     _LIBCPP_INLINE_VISIBILITY __debug_iter(const __container_type* __c, iterator_type __x)
   1463         : __i(__x), __next(0), __cont(0) {__set_owner(__c);}
   1464     _LIBCPP_INLINE_VISIBILITY iterator_type base() const {return __i;}
   1465 
   1466     void __set_owner(const __container_type* __c);
   1467     void __remove_owner();
   1468     static void __remove_all(__container_type* __c);
   1469     static void swap(__container_type* __x, __container_type* __y);
   1470 
   1471     _LIBCPP_INLINE_VISIBILITY bool __is_deref() const
   1472         {return __is_deref(__is_random_access_iterator<iterator_type>());}
   1473     bool __is_deref(false_type) const;
   1474     bool __is_deref(true_type) const;
   1475     _LIBCPP_INLINE_VISIBILITY bool __can_decrement() const
   1476         {return __can_decrement(integral_constant<int, is_pointer<iterator_type>::value ? 2:
   1477                                                        __is_random_access_iterator<iterator_type>::value ? 1 : 0>());}
   1478     bool __can_decrement(integral_constant<int, 0>) const;
   1479     bool __can_decrement(integral_constant<int, 1>) const;
   1480     bool __can_decrement(integral_constant<int, 2>) const;
   1481     _LIBCPP_INLINE_VISIBILITY bool __can_increment() const
   1482         {return __can_increment(integral_constant<int, is_pointer<iterator_type>::value ? 2:
   1483                                                        __is_random_access_iterator<iterator_type>::value ? 1 : 0>());}
   1484     bool __can_increment(integral_constant<int, 0>) const;
   1485     bool __can_increment(integral_constant<int, 1>) const;
   1486     bool __can_increment(integral_constant<int, 2>) const;
   1487 
   1488     _LIBCPP_INLINE_VISIBILITY bool __can_add(difference_type __n) const
   1489         {return __can_add(__n, is_pointer<iterator_type>());}
   1490     bool __can_add(difference_type __n, false_type) const;
   1491     bool __can_add(difference_type __n, true_type) const;
   1492 
   1493     template <class _Cp, class _Up> friend class __debug_iter;
   1494     friend class _Container::__self;
   1495 
   1496     template <class _Cp, class _Iter1, class _Iter2>
   1497     friend
   1498     bool
   1499     operator==(const __debug_iter<_Cp, _Iter1>&, const __debug_iter<_Cp, _Iter2>&);
   1500 
   1501     template <class _Cp, class _Iter1, class _Iter2>
   1502     friend
   1503     bool
   1504     operator<(const __debug_iter<_Cp, _Iter1>&, const __debug_iter<_Cp, _Iter2>&);
   1505 
   1506     template <class _Cp, class _Iter1, class _Iter2>
   1507     friend
   1508     bool
   1509     operator!=(const __debug_iter<_Cp, _Iter1>&, const __debug_iter<_Cp, _Iter2>&);
   1510 
   1511     template <class _Cp, class _Iter1, class _Iter2>
   1512     friend
   1513     bool
   1514     operator>(const __debug_iter<_Cp, _Iter1>&, const __debug_iter<_Cp, _Iter2>&);
   1515 
   1516     template <class _Cp, class _Iter1, class _Iter2>
   1517     friend
   1518     bool
   1519     operator>=(const __debug_iter<_Cp, _Iter1>&, const __debug_iter<_Cp, _Iter2>&);
   1520 
   1521     template <class _Cp, class _Iter1, class _Iter2>
   1522     friend
   1523     bool
   1524     operator<=(const __debug_iter<_Cp, _Iter1>&, const __debug_iter<_Cp, _Iter2>&);
   1525 
   1526     template <class _Cp, class _Iter1, class _Iter2>
   1527     friend
   1528     typename __debug_iter<_Cp, _Iter1>::difference_type
   1529     operator-(const __debug_iter<_Cp, _Iter1>&, const __debug_iter<_Cp, _Iter2>&);
   1530 
   1531     template <class _Cp, class _Iter1>
   1532     friend
   1533     __debug_iter<_Cp, _Iter1>
   1534     operator+(typename __debug_iter<_Cp, _Iter1>::difference_type, const __debug_iter<_Cp, _Iter1>&);
   1535 };
   1536 
   1537 template <class _Container, class _Iter>
   1538 __debug_iter<_Container, _Iter>&
   1539 __debug_iter<_Container, _Iter>::operator=(const __debug_iter& __x)
   1540 {
   1541     if (this != &__x)
   1542     {
   1543         __remove_owner();
   1544         __i = __x.__i;
   1545         __set_owner(__x.__cont);
   1546     }
   1547     return *this;
   1548 }
   1549 
   1550 template <class _Container, class _Iter>
   1551 void
   1552 __debug_iter<_Container, _Iter>::__set_owner(const __container_type* __c)
   1553 {
   1554     __cont = const_cast<__container_type*>(__c);
   1555     __debug_iter*& __head = __cont->__get_iterator_list(this);
   1556     __next = __head;
   1557     __head = this;
   1558 }
   1559 
   1560 template <class _Container, class _Iter>
   1561 void
   1562 __debug_iter<_Container, _Iter>::__remove_owner()
   1563 {
   1564     if (__cont)
   1565     {
   1566         __debug_iter*& __head = __cont->__get_iterator_list(this);
   1567         if (__head == this)
   1568             __head = __next;
   1569         else
   1570         {
   1571             __debug_iter* __prev = __head;
   1572             for (__debug_iter* __p = __head->__next; __p != this; __p = __p->__next)
   1573                 __prev = __p;
   1574             __prev->__next = __next;
   1575         }
   1576         __cont = 0;
   1577     }
   1578 }
   1579 
   1580 template <class _Container, class _Iter>
   1581 void
   1582 __debug_iter<_Container, _Iter>::__remove_all(__container_type* __c)
   1583 {
   1584     __debug_iter*& __head = __c->__get_iterator_list((__debug_iter*)0);
   1585     __debug_iter* __p = __head;
   1586     __head = 0;
   1587     while (__p)
   1588     {
   1589         __p->__cont = 0;
   1590         __debug_iter* __n = __p->__next;
   1591         __p->__next = 0;
   1592         __p = __n;
   1593     }
   1594 }
   1595 
   1596 template <class _Container, class _Iter>
   1597 void
   1598 __debug_iter<_Container, _Iter>::swap(__container_type* __x, __container_type* __y)
   1599 {
   1600     __debug_iter*& __head_x = __x->__get_iterator_list((__debug_iter*)0);
   1601     __debug_iter*& __head_y = __y->__get_iterator_list((__debug_iter*)0);
   1602     __debug_iter* __p = __head_x;
   1603     __head_x = __head_y;
   1604     __head_y = __p;
   1605     for (__p = __head_x; __p; __p = __p->__next)
   1606         __p->__cont = __x;
   1607     for (__p = __head_y; __p; __p = __p->__next)
   1608         __p->__cont = __y;
   1609 }
   1610 
   1611 template <class _Container, class _Iter>
   1612 bool
   1613 __debug_iter<_Container, _Iter>::__is_deref(false_type) const
   1614 {
   1615     if (__cont == 0)
   1616         return false;
   1617     return __i != __cont->end().base();
   1618 }
   1619 
   1620 template <class _Container, class _Iter>
   1621 bool
   1622 __debug_iter<_Container, _Iter>::__is_deref(true_type) const
   1623 {
   1624     if (__cont == 0)
   1625         return false;
   1626     return __i < __cont->end().base();
   1627 }
   1628 
   1629 template <class _Container, class _Iter>
   1630 bool
   1631 __debug_iter<_Container, _Iter>::__can_decrement(integral_constant<int, 0>) const
   1632 {
   1633     if (__cont == 0)
   1634         return false;
   1635     return __i != __cont->begin().base();
   1636 }
   1637 
   1638 template <class _Container, class _Iter>
   1639 bool
   1640 __debug_iter<_Container, _Iter>::__can_decrement(integral_constant<int, 1>) const
   1641 {
   1642     if (__cont == 0)
   1643         return false;
   1644     iterator_type __b = __cont->begin().base();
   1645     return __b < __i && __i <= __b + __cont->size();
   1646 }
   1647 
   1648 template <class _Container, class _Iter>
   1649 bool
   1650 __debug_iter<_Container, _Iter>::__can_decrement(integral_constant<int, 2>) const
   1651 {
   1652     if (__cont == 0)
   1653         return false;
   1654     iterator_type __b = __cont->begin().base();
   1655     return __b < __i && __i <= __b + __cont->size();
   1656 }
   1657 
   1658 template <class _Container, class _Iter>
   1659 bool
   1660 __debug_iter<_Container, _Iter>::__can_increment(integral_constant<int, 0>) const
   1661 {
   1662     if (__cont == 0)
   1663         return false;
   1664     return __i != __cont->end().base();
   1665 }
   1666 
   1667 template <class _Container, class _Iter>
   1668 bool
   1669 __debug_iter<_Container, _Iter>::__can_increment(integral_constant<int, 1>) const
   1670 {
   1671     if (__cont == 0)
   1672         return false;
   1673     iterator_type __b = __cont->begin().base();
   1674     return __b <= __i && __i < __b + __cont->size();
   1675 }
   1676 
   1677 template <class _Container, class _Iter>
   1678 bool
   1679 __debug_iter<_Container, _Iter>::__can_increment(integral_constant<int, 2>) const
   1680 {
   1681     if (__cont == 0)
   1682         return false;
   1683     iterator_type __b = __cont->begin().base();
   1684     return __b <= __i && __i < __b + __cont->size();
   1685 }
   1686 
   1687 template <class _Container, class _Iter>
   1688 bool
   1689 __debug_iter<_Container, _Iter>::__can_add(difference_type __n, false_type) const
   1690 {
   1691     if (__cont == 0)
   1692         return false;
   1693     iterator_type __b = __cont->begin().base();
   1694     iterator_type __j = __i + __n;
   1695     return __b <= __j && __j <= __b + __cont->size();
   1696 }
   1697 
   1698 template <class _Container, class _Iter>
   1699 bool
   1700 __debug_iter<_Container, _Iter>::__can_add(difference_type __n, true_type) const
   1701 {
   1702     if (__cont == 0)
   1703         return false;
   1704     iterator_type __b = __cont->begin().base();
   1705     iterator_type __j = __i + __n;
   1706     return __b <= __j && __j <= __b + __cont->size();
   1707 }
   1708 
   1709 template <class _Container, class _Iter>
   1710 __debug_iter<_Container, _Iter>&
   1711 __debug_iter<_Container, _Iter>::operator+=(difference_type __n)
   1712 {
   1713     assert(__can_add(__n));
   1714     __i += __n;
   1715     return *this;
   1716 }
   1717 
   1718 template <class _Container, class _Iter1, class _Iter2>
   1719 inline _LIBCPP_INLINE_VISIBILITY
   1720 bool
   1721 operator==(const __debug_iter<_Container, _Iter1>& __x, const __debug_iter<_Container, _Iter2>& __y)
   1722 {
   1723     assert(__x.__cont && __x.__cont == __y.__cont);
   1724     return __x.base() == __y.base();
   1725 }
   1726 
   1727 template <class _Container, class _Iter1, class _Iter2>
   1728 inline _LIBCPP_INLINE_VISIBILITY
   1729 bool
   1730 operator!=(const __debug_iter<_Container, _Iter1>& __x, const __debug_iter<_Container, _Iter2>& __y)
   1731 {
   1732     return !(__x == __y);
   1733 }
   1734 
   1735 template <class _Container, class _Iter1, class _Iter2>
   1736 inline _LIBCPP_INLINE_VISIBILITY
   1737 bool
   1738 operator<(const __debug_iter<_Container, _Iter1>& __x, const __debug_iter<_Container, _Iter2>& __y)
   1739 {
   1740     assert(__x.__cont && __x.__cont == __y.__cont);
   1741     return __x.base() < __y.base();
   1742 }
   1743 
   1744 template <class _Container, class _Iter1, class _Iter2>
   1745 inline _LIBCPP_INLINE_VISIBILITY
   1746 bool
   1747 operator>(const __debug_iter<_Container, _Iter1>& __x, const __debug_iter<_Container, _Iter2>& __y)
   1748 {
   1749     return __y < __x;
   1750 }
   1751 
   1752 template <class _Container, class _Iter1, class _Iter2>
   1753 inline _LIBCPP_INLINE_VISIBILITY
   1754 bool
   1755 operator>=(const __debug_iter<_Container, _Iter1>& __x, const __debug_iter<_Container, _Iter2>& __y)
   1756 {
   1757     return !(__x < __y);
   1758 }
   1759 
   1760 template <class _Container, class _Iter1, class _Iter2>
   1761 inline _LIBCPP_INLINE_VISIBILITY
   1762 bool
   1763 operator<=(const __debug_iter<_Container, _Iter1>& __x, const __debug_iter<_Container, _Iter2>& __y)
   1764 {
   1765     return !(__y < __x);
   1766 }
   1767 
   1768 template <class _Container, class _Iter1, class _Iter2>
   1769 inline _LIBCPP_INLINE_VISIBILITY
   1770 typename __debug_iter<_Container, _Iter1>::difference_type
   1771 operator-(const __debug_iter<_Container, _Iter1>& __x, const __debug_iter<_Container, _Iter2>& __y)
   1772 {
   1773     assert(__x.__cont && __x.__cont == __y.__cont);
   1774     return __x.base() - __y.base();
   1775 }
   1776 
   1777 template <class _Container, class _Iter>
   1778 inline _LIBCPP_INLINE_VISIBILITY
   1779 __debug_iter<_Container, _Iter>
   1780 operator+(typename __debug_iter<_Container, _Iter>::difference_type __n,
   1781           const __debug_iter<_Container, _Iter>& __x)
   1782 {
   1783     return __x + __n;
   1784 }
   1785 
   1786 #endif  // _LIBCPP_DEBUG
   1787 
   1788 #if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_TRAILING_RETURN)
   1789 
   1790 template <class _Cp>
   1791 inline _LIBCPP_INLINE_VISIBILITY
   1792 auto
   1793 begin(_Cp& __c) -> decltype(__c.begin())
   1794 {
   1795     return __c.begin();
   1796 }
   1797 
   1798 template <class _Cp>
   1799 inline _LIBCPP_INLINE_VISIBILITY
   1800 auto
   1801 begin(const _Cp& __c) -> decltype(__c.begin())
   1802 {
   1803     return __c.begin();
   1804 }
   1805 
   1806 template <class _Cp>
   1807 inline _LIBCPP_INLINE_VISIBILITY
   1808 auto
   1809 end(_Cp& __c) -> decltype(__c.end())
   1810 {
   1811     return __c.end();
   1812 }
   1813 
   1814 template <class _Cp>
   1815 inline _LIBCPP_INLINE_VISIBILITY
   1816 auto
   1817 end(const _Cp& __c) -> decltype(__c.end())
   1818 {
   1819     return __c.end();
   1820 }
   1821 
   1822 #else  // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_TRAILING_RETURN)
   1823 
   1824 template <class _Cp>
   1825 inline _LIBCPP_INLINE_VISIBILITY
   1826 typename _Cp::iterator
   1827 begin(_Cp& __c)
   1828 {
   1829     return __c.begin();
   1830 }
   1831 
   1832 template <class _Cp>
   1833 inline _LIBCPP_INLINE_VISIBILITY
   1834 typename _Cp::const_iterator
   1835 begin(const _Cp& __c)
   1836 {
   1837     return __c.begin();
   1838 }
   1839 
   1840 template <class _Cp>
   1841 inline _LIBCPP_INLINE_VISIBILITY
   1842 typename _Cp::iterator
   1843 end(_Cp& __c)
   1844 {
   1845     return __c.end();
   1846 }
   1847 
   1848 template <class _Cp>
   1849 inline _LIBCPP_INLINE_VISIBILITY
   1850 typename _Cp::const_iterator
   1851 end(const _Cp& __c)
   1852 {
   1853     return __c.end();
   1854 }
   1855 
   1856 #endif  // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_TRAILING_RETURN)
   1857 
   1858 template <class _Tp, size_t _Np>
   1859 inline _LIBCPP_INLINE_VISIBILITY
   1860 _Tp*
   1861 begin(_Tp (&__array)[_Np])
   1862 {
   1863     return __array;
   1864 }
   1865 
   1866 template <class _Tp, size_t _Np>
   1867 inline _LIBCPP_INLINE_VISIBILITY
   1868 _Tp*
   1869 end(_Tp (&__array)[_Np])
   1870 {
   1871     return __array + _Np;
   1872 }
   1873 
   1874 _LIBCPP_END_NAMESPACE_STD
   1875 
   1876 #endif  // _LIBCPP_ITERATOR
   1877