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