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