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 #include <version>
    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_typedefs
    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 std::__void_t<typename _Up::iterator_category>::type* = 0,
    447     										typename std::__void_t<typename _Up::difference_type>::type* = 0,
    448     										typename std::__void_t<typename _Up::value_type>::type* = 0,
    449     										typename std::__void_t<typename _Up::reference>::type* = 0,
    450     										typename std::__void_t<typename _Up::pointer>::type* = 0
    451     										);
    452 public:
    453     static const bool value = sizeof(__test<_Tp>(0,0,0,0,0)) == 1;
    454 };
    455 
    456 
    457 template <class _Tp>
    458 struct __has_iterator_category
    459 {
    460 private:
    461     struct __two {char __lx; char __lxx;};
    462     template <class _Up> static __two __test(...);
    463     template <class _Up> static char __test(typename _Up::iterator_category* = 0);
    464 public:
    465     static const bool value = sizeof(__test<_Tp>(0)) == 1;
    466 };
    467 
    468 template <class _Iter, bool> struct __iterator_traits_impl {};
    469 
    470 template <class _Iter>
    471 struct __iterator_traits_impl<_Iter, true>
    472 {
    473     typedef typename _Iter::difference_type   difference_type;
    474     typedef typename _Iter::value_type        value_type;
    475     typedef typename _Iter::pointer           pointer;
    476     typedef typename _Iter::reference         reference;
    477     typedef typename _Iter::iterator_category iterator_category;
    478 };
    479 
    480 template <class _Iter, bool> struct __iterator_traits {};
    481 
    482 template <class _Iter>
    483 struct __iterator_traits<_Iter, true>
    484     :  __iterator_traits_impl
    485       <
    486         _Iter,
    487         is_convertible<typename _Iter::iterator_category, input_iterator_tag>::value ||
    488         is_convertible<typename _Iter::iterator_category, output_iterator_tag>::value
    489       >
    490 {};
    491 
    492 // iterator_traits<Iterator> will only have the nested types if Iterator::iterator_category
    493 //    exists.  Else iterator_traits<Iterator> will be an empty class.  This is a
    494 //    conforming extension which allows some programs to compile and behave as
    495 //    the client expects instead of failing at compile time.
    496 
    497 template <class _Iter>
    498 struct _LIBCPP_TEMPLATE_VIS iterator_traits
    499     : __iterator_traits<_Iter, __has_iterator_typedefs<_Iter>::value> {};
    500 
    501 template<class _Tp>
    502 struct _LIBCPP_TEMPLATE_VIS iterator_traits<_Tp*>
    503 {
    504     typedef ptrdiff_t difference_type;
    505     typedef typename remove_cv<_Tp>::type value_type;
    506     typedef _Tp* pointer;
    507     typedef _Tp& reference;
    508     typedef random_access_iterator_tag iterator_category;
    509 };
    510 
    511 template <class _Tp, class _Up, bool = __has_iterator_category<iterator_traits<_Tp> >::value>
    512 struct __has_iterator_category_convertible_to
    513     : public integral_constant<bool, is_convertible<typename iterator_traits<_Tp>::iterator_category, _Up>::value>
    514 {};
    515 
    516 template <class _Tp, class _Up>
    517 struct __has_iterator_category_convertible_to<_Tp, _Up, false> : public false_type {};
    518 
    519 template <class _Tp>
    520 struct __is_input_iterator : public __has_iterator_category_convertible_to<_Tp, input_iterator_tag> {};
    521 
    522 template <class _Tp>
    523 struct __is_forward_iterator : public __has_iterator_category_convertible_to<_Tp, forward_iterator_tag> {};
    524 
    525 template <class _Tp>
    526 struct __is_bidirectional_iterator : public __has_iterator_category_convertible_to<_Tp, bidirectional_iterator_tag> {};
    527 
    528 template <class _Tp>
    529 struct __is_random_access_iterator : public __has_iterator_category_convertible_to<_Tp, random_access_iterator_tag> {};
    530 
    531 template <class _Tp>
    532 struct __is_exactly_input_iterator
    533     : public integral_constant<bool, 
    534          __has_iterator_category_convertible_to<_Tp, input_iterator_tag>::value && 
    535         !__has_iterator_category_convertible_to<_Tp, forward_iterator_tag>::value> {};
    536 
    537 template<class _Category, class _Tp, class _Distance = ptrdiff_t,
    538          class _Pointer = _Tp*, class _Reference = _Tp&>
    539 struct _LIBCPP_TEMPLATE_VIS iterator
    540 {
    541     typedef _Tp        value_type;
    542     typedef _Distance  difference_type;
    543     typedef _Pointer   pointer;
    544     typedef _Reference reference;
    545     typedef _Category  iterator_category;
    546 };
    547 
    548 template <class _InputIter>
    549 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    550 void __advance(_InputIter& __i,
    551              typename iterator_traits<_InputIter>::difference_type __n, input_iterator_tag)
    552 {
    553     for (; __n > 0; --__n)
    554         ++__i;
    555 }
    556 
    557 template <class _BiDirIter>
    558 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    559 void __advance(_BiDirIter& __i,
    560              typename iterator_traits<_BiDirIter>::difference_type __n, bidirectional_iterator_tag)
    561 {
    562     if (__n >= 0)
    563         for (; __n > 0; --__n)
    564             ++__i;
    565     else
    566         for (; __n < 0; ++__n)
    567             --__i;
    568 }
    569 
    570 template <class _RandIter>
    571 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    572 void __advance(_RandIter& __i,
    573              typename iterator_traits<_RandIter>::difference_type __n, random_access_iterator_tag)
    574 {
    575    __i += __n;
    576 }
    577 
    578 template <class _InputIter>
    579 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    580 void advance(_InputIter& __i,
    581              typename iterator_traits<_InputIter>::difference_type __n)
    582 {
    583     __advance(__i, __n, typename iterator_traits<_InputIter>::iterator_category());
    584 }
    585 
    586 template <class _InputIter>
    587 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    588 typename iterator_traits<_InputIter>::difference_type
    589 __distance(_InputIter __first, _InputIter __last, input_iterator_tag)
    590 {
    591     typename iterator_traits<_InputIter>::difference_type __r(0);
    592     for (; __first != __last; ++__first)
    593         ++__r;
    594     return __r;
    595 }
    596 
    597 template <class _RandIter>
    598 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    599 typename iterator_traits<_RandIter>::difference_type
    600 __distance(_RandIter __first, _RandIter __last, random_access_iterator_tag)
    601 {
    602     return __last - __first;
    603 }
    604 
    605 template <class _InputIter>
    606 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    607 typename iterator_traits<_InputIter>::difference_type
    608 distance(_InputIter __first, _InputIter __last)
    609 {
    610     return __distance(__first, __last, typename iterator_traits<_InputIter>::iterator_category());
    611 }
    612 
    613 template <class _InputIter>
    614 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    615 typename enable_if
    616 <
    617     __is_input_iterator<_InputIter>::value, 
    618     _InputIter
    619 >::type
    620 next(_InputIter __x,
    621      typename iterator_traits<_InputIter>::difference_type __n = 1)
    622 {
    623     _VSTD::advance(__x, __n);
    624     return __x;
    625 }
    626 
    627 template <class _BidirectionalIter>
    628 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    629 typename enable_if
    630 <
    631     __is_bidirectional_iterator<_BidirectionalIter>::value, 
    632     _BidirectionalIter
    633 >::type
    634 prev(_BidirectionalIter __x,
    635      typename iterator_traits<_BidirectionalIter>::difference_type __n = 1)
    636 {
    637     _VSTD::advance(__x, -__n);
    638     return __x;
    639 }
    640 
    641 
    642 template <class _Tp, class = void>
    643 struct __is_stashing_iterator : false_type {};
    644 
    645 template <class _Tp>
    646 struct __is_stashing_iterator<_Tp, typename __void_t<typename _Tp::__stashing_iterator_tag>::type>
    647   : true_type {};
    648 
    649 template <class _Iter>
    650 class _LIBCPP_TEMPLATE_VIS reverse_iterator
    651     : public iterator<typename iterator_traits<_Iter>::iterator_category,
    652                       typename iterator_traits<_Iter>::value_type,
    653                       typename iterator_traits<_Iter>::difference_type,
    654                       typename iterator_traits<_Iter>::pointer,
    655                       typename iterator_traits<_Iter>::reference>
    656 {
    657 private:
    658     /*mutable*/ _Iter __t;  // no longer used as of LWG #2360, not removed due to ABI break
    659 
    660     static_assert(!__is_stashing_iterator<_Iter>::value,
    661       "The specified iterator type cannot be used with reverse_iterator; "
    662       "Using stashing iterators with reverse_iterator causes undefined behavior");
    663 
    664 protected:
    665     _Iter current;
    666 public:
    667     typedef _Iter                                            iterator_type;
    668     typedef typename iterator_traits<_Iter>::difference_type difference_type;
    669     typedef typename iterator_traits<_Iter>::reference       reference;
    670     typedef typename iterator_traits<_Iter>::pointer         pointer;
    671 
    672     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    673     reverse_iterator() : __t(), current() {}
    674     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    675     explicit reverse_iterator(_Iter __x) : __t(__x), current(__x) {}
    676     template <class _Up>
    677         _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    678         reverse_iterator(const reverse_iterator<_Up>& __u) : __t(__u.base()), current(__u.base()) {}
    679     template <class _Up>
    680         _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    681         reverse_iterator& operator=(const reverse_iterator<_Up>& __u)
    682             { __t = current = __u.base(); return *this; }
    683     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    684     _Iter base() const {return current;}
    685     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    686     reference operator*() const {_Iter __tmp = current; return *--__tmp;}
    687     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    688     pointer  operator->() const {return _VSTD::addressof(operator*());}
    689     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    690     reverse_iterator& operator++() {--current; return *this;}
    691     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    692     reverse_iterator  operator++(int) {reverse_iterator __tmp(*this); --current; return __tmp;}
    693     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    694     reverse_iterator& operator--() {++current; return *this;}
    695     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    696     reverse_iterator  operator--(int) {reverse_iterator __tmp(*this); ++current; return __tmp;}
    697     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    698     reverse_iterator  operator+ (difference_type __n) const {return reverse_iterator(current - __n);}
    699     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    700     reverse_iterator& operator+=(difference_type __n) {current -= __n; return *this;}
    701     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    702     reverse_iterator  operator- (difference_type __n) const {return reverse_iterator(current + __n);}
    703     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    704     reverse_iterator& operator-=(difference_type __n) {current += __n; return *this;}
    705     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    706     reference         operator[](difference_type __n) const {return *(*this + __n);}
    707 };
    708 
    709 template <class _Iter1, class _Iter2>
    710 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    711 bool
    712 operator==(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)
    713 {
    714     return __x.base() == __y.base();
    715 }
    716 
    717 template <class _Iter1, class _Iter2>
    718 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    719 bool
    720 operator<(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)
    721 {
    722     return __x.base() > __y.base();
    723 }
    724 
    725 template <class _Iter1, class _Iter2>
    726 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    727 bool
    728 operator!=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)
    729 {
    730     return __x.base() != __y.base();
    731 }
    732 
    733 template <class _Iter1, class _Iter2>
    734 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    735 bool
    736 operator>(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)
    737 {
    738     return __x.base() < __y.base();
    739 }
    740 
    741 template <class _Iter1, class _Iter2>
    742 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    743 bool
    744 operator>=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)
    745 {
    746     return __x.base() <= __y.base();
    747 }
    748 
    749 template <class _Iter1, class _Iter2>
    750 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    751 bool
    752 operator<=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)
    753 {
    754     return __x.base() >= __y.base();
    755 }
    756 
    757 #ifndef _LIBCPP_CXX03_LANG
    758 template <class _Iter1, class _Iter2>
    759 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    760 auto
    761 operator-(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)
    762 -> decltype(__y.base() - __x.base())
    763 {
    764     return __y.base() - __x.base();
    765 }
    766 #else
    767 template <class _Iter1, class _Iter2>
    768 inline _LIBCPP_INLINE_VISIBILITY
    769 typename reverse_iterator<_Iter1>::difference_type
    770 operator-(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)
    771 {
    772     return __y.base() - __x.base();
    773 }
    774 #endif
    775 
    776 template <class _Iter>
    777 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    778 reverse_iterator<_Iter>
    779 operator+(typename reverse_iterator<_Iter>::difference_type __n, const reverse_iterator<_Iter>& __x)
    780 {
    781     return reverse_iterator<_Iter>(__x.base() - __n);
    782 }
    783 
    784 #if _LIBCPP_STD_VER > 11
    785 template <class _Iter>
    786 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
    787 reverse_iterator<_Iter> make_reverse_iterator(_Iter __i)
    788 {
    789     return reverse_iterator<_Iter>(__i);
    790 }
    791 #endif
    792 
    793 template <class _Container>
    794 class _LIBCPP_TEMPLATE_VIS back_insert_iterator
    795     : public iterator<output_iterator_tag,
    796                       void,
    797                       void,
    798                       void,
    799                       void>
    800 {
    801 protected:
    802     _Container* container;
    803 public:
    804     typedef _Container container_type;
    805 
    806     _LIBCPP_INLINE_VISIBILITY explicit back_insert_iterator(_Container& __x) : container(_VSTD::addressof(__x)) {}
    807     _LIBCPP_INLINE_VISIBILITY back_insert_iterator& operator=(const typename _Container::value_type& __value_)
    808         {container->push_back(__value_); return *this;}
    809 #ifndef _LIBCPP_CXX03_LANG
    810     _LIBCPP_INLINE_VISIBILITY back_insert_iterator& operator=(typename _Container::value_type&& __value_)
    811         {container->push_back(_VSTD::move(__value_)); return *this;}
    812 #endif  // _LIBCPP_CXX03_LANG
    813     _LIBCPP_INLINE_VISIBILITY back_insert_iterator& operator*()     {return *this;}
    814     _LIBCPP_INLINE_VISIBILITY back_insert_iterator& operator++()    {return *this;}
    815     _LIBCPP_INLINE_VISIBILITY back_insert_iterator  operator++(int) {return *this;}
    816 };
    817 
    818 template <class _Container>
    819 inline _LIBCPP_INLINE_VISIBILITY
    820 back_insert_iterator<_Container>
    821 back_inserter(_Container& __x)
    822 {
    823     return back_insert_iterator<_Container>(__x);
    824 }
    825 
    826 template <class _Container>
    827 class _LIBCPP_TEMPLATE_VIS front_insert_iterator
    828     : public iterator<output_iterator_tag,
    829                       void,
    830                       void,
    831                       void,
    832                       void>
    833 {
    834 protected:
    835     _Container* container;
    836 public:
    837     typedef _Container container_type;
    838 
    839     _LIBCPP_INLINE_VISIBILITY explicit front_insert_iterator(_Container& __x) : container(_VSTD::addressof(__x)) {}
    840     _LIBCPP_INLINE_VISIBILITY front_insert_iterator& operator=(const typename _Container::value_type& __value_)
    841         {container->push_front(__value_); return *this;}
    842 #ifndef _LIBCPP_CXX03_LANG
    843     _LIBCPP_INLINE_VISIBILITY front_insert_iterator& operator=(typename _Container::value_type&& __value_)
    844         {container->push_front(_VSTD::move(__value_)); return *this;}
    845 #endif  // _LIBCPP_CXX03_LANG
    846     _LIBCPP_INLINE_VISIBILITY front_insert_iterator& operator*()     {return *this;}
    847     _LIBCPP_INLINE_VISIBILITY front_insert_iterator& operator++()    {return *this;}
    848     _LIBCPP_INLINE_VISIBILITY front_insert_iterator  operator++(int) {return *this;}
    849 };
    850 
    851 template <class _Container>
    852 inline _LIBCPP_INLINE_VISIBILITY
    853 front_insert_iterator<_Container>
    854 front_inserter(_Container& __x)
    855 {
    856     return front_insert_iterator<_Container>(__x);
    857 }
    858 
    859 template <class _Container>
    860 class _LIBCPP_TEMPLATE_VIS insert_iterator
    861     : public iterator<output_iterator_tag,
    862                       void,
    863                       void,
    864                       void,
    865                       void>
    866 {
    867 protected:
    868     _Container* container;
    869     typename _Container::iterator iter;
    870 public:
    871     typedef _Container container_type;
    872 
    873     _LIBCPP_INLINE_VISIBILITY insert_iterator(_Container& __x, typename _Container::iterator __i)
    874         : container(_VSTD::addressof(__x)), iter(__i) {}
    875     _LIBCPP_INLINE_VISIBILITY insert_iterator& operator=(const typename _Container::value_type& __value_)
    876         {iter = container->insert(iter, __value_); ++iter; return *this;}
    877 #ifndef _LIBCPP_CXX03_LANG
    878     _LIBCPP_INLINE_VISIBILITY insert_iterator& operator=(typename _Container::value_type&& __value_)
    879         {iter = container->insert(iter, _VSTD::move(__value_)); ++iter; return *this;}
    880 #endif  // _LIBCPP_CXX03_LANG
    881     _LIBCPP_INLINE_VISIBILITY insert_iterator& operator*()        {return *this;}
    882     _LIBCPP_INLINE_VISIBILITY insert_iterator& operator++()       {return *this;}
    883     _LIBCPP_INLINE_VISIBILITY insert_iterator& operator++(int)    {return *this;}
    884 };
    885 
    886 template <class _Container>
    887 inline _LIBCPP_INLINE_VISIBILITY
    888 insert_iterator<_Container>
    889 inserter(_Container& __x, typename _Container::iterator __i)
    890 {
    891     return insert_iterator<_Container>(__x, __i);
    892 }
    893 
    894 template <class _Tp, class _CharT = char,
    895           class _Traits = char_traits<_CharT>, class _Distance = ptrdiff_t>
    896 class _LIBCPP_TEMPLATE_VIS istream_iterator
    897     : public iterator<input_iterator_tag, _Tp, _Distance, const _Tp*, const _Tp&>
    898 {
    899 public:
    900     typedef _CharT char_type;
    901     typedef _Traits traits_type;
    902     typedef basic_istream<_CharT,_Traits> istream_type;
    903 private:
    904     istream_type* __in_stream_;
    905     _Tp __value_;
    906 public:
    907     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR istream_iterator() : __in_stream_(0), __value_() {}
    908     _LIBCPP_INLINE_VISIBILITY istream_iterator(istream_type& __s) : __in_stream_(_VSTD::addressof(__s))
    909         {
    910             if (!(*__in_stream_ >> __value_))
    911                 __in_stream_ = 0;
    912         }
    913 
    914     _LIBCPP_INLINE_VISIBILITY const _Tp& operator*() const {return __value_;}
    915     _LIBCPP_INLINE_VISIBILITY const _Tp* operator->() const {return _VSTD::addressof((operator*()));}
    916     _LIBCPP_INLINE_VISIBILITY istream_iterator& operator++()
    917         {
    918             if (!(*__in_stream_ >> __value_))
    919                 __in_stream_ = 0;
    920             return *this;
    921         }
    922     _LIBCPP_INLINE_VISIBILITY istream_iterator  operator++(int)
    923         {istream_iterator __t(*this); ++(*this); return __t;}
    924 
    925     template <class _Up, class _CharU, class _TraitsU, class _DistanceU>
    926     friend _LIBCPP_INLINE_VISIBILITY
    927     bool
    928     operator==(const istream_iterator<_Up, _CharU, _TraitsU, _DistanceU>& __x,
    929                const istream_iterator<_Up, _CharU, _TraitsU, _DistanceU>& __y);
    930 
    931     template <class _Up, class _CharU, class _TraitsU, class _DistanceU>
    932     friend _LIBCPP_INLINE_VISIBILITY
    933     bool
    934     operator==(const istream_iterator<_Up, _CharU, _TraitsU, _DistanceU>& __x,
    935                const istream_iterator<_Up, _CharU, _TraitsU, _DistanceU>& __y);
    936 };
    937 
    938 template <class _Tp, class _CharT, class _Traits, class _Distance>
    939 inline _LIBCPP_INLINE_VISIBILITY
    940 bool
    941 operator==(const istream_iterator<_Tp, _CharT, _Traits, _Distance>& __x,
    942            const istream_iterator<_Tp, _CharT, _Traits, _Distance>& __y)
    943 {
    944     return __x.__in_stream_ == __y.__in_stream_;
    945 }
    946 
    947 template <class _Tp, class _CharT, class _Traits, class _Distance>
    948 inline _LIBCPP_INLINE_VISIBILITY
    949 bool
    950 operator!=(const istream_iterator<_Tp, _CharT, _Traits, _Distance>& __x,
    951            const istream_iterator<_Tp, _CharT, _Traits, _Distance>& __y)
    952 {
    953     return !(__x == __y);
    954 }
    955 
    956 template <class _Tp, class _CharT = char, class _Traits = char_traits<_CharT> >
    957 class _LIBCPP_TEMPLATE_VIS ostream_iterator
    958     : public iterator<output_iterator_tag, void, void, void, void>
    959 {
    960 public:
    961     typedef _CharT char_type;
    962     typedef _Traits traits_type;
    963     typedef basic_ostream<_CharT,_Traits> ostream_type;
    964 private:
    965     ostream_type* __out_stream_;
    966     const char_type* __delim_;
    967 public:
    968     _LIBCPP_INLINE_VISIBILITY ostream_iterator(ostream_type& __s) _NOEXCEPT
    969         : __out_stream_(_VSTD::addressof(__s)), __delim_(0) {}
    970     _LIBCPP_INLINE_VISIBILITY ostream_iterator(ostream_type& __s, const _CharT* __delimiter) _NOEXCEPT
    971         : __out_stream_(_VSTD::addressof(__s)), __delim_(__delimiter) {}
    972     _LIBCPP_INLINE_VISIBILITY ostream_iterator& operator=(const _Tp& __value_)
    973         {
    974             *__out_stream_ << __value_;
    975             if (__delim_)
    976                 *__out_stream_ << __delim_;
    977             return *this;
    978         }
    979 
    980     _LIBCPP_INLINE_VISIBILITY ostream_iterator& operator*()     {return *this;}
    981     _LIBCPP_INLINE_VISIBILITY ostream_iterator& operator++()    {return *this;}
    982     _LIBCPP_INLINE_VISIBILITY ostream_iterator& operator++(int) {return *this;}
    983 };
    984 
    985 template<class _CharT, class _Traits>
    986 class _LIBCPP_TEMPLATE_VIS istreambuf_iterator
    987     : public iterator<input_iterator_tag, _CharT,
    988                       typename _Traits::off_type, _CharT*,
    989                       _CharT>
    990 {
    991 public:
    992     typedef _CharT                          char_type;
    993     typedef _Traits                         traits_type;
    994     typedef typename _Traits::int_type      int_type;
    995     typedef basic_streambuf<_CharT,_Traits> streambuf_type;
    996     typedef basic_istream<_CharT,_Traits>   istream_type;
    997 private:
    998     mutable streambuf_type* __sbuf_;
    999 
   1000     class __proxy
   1001     {
   1002         char_type __keep_;
   1003         streambuf_type* __sbuf_;
   1004         _LIBCPP_INLINE_VISIBILITY __proxy(char_type __c, streambuf_type* __s)
   1005             : __keep_(__c), __sbuf_(__s) {}
   1006         friend class istreambuf_iterator;
   1007     public:
   1008         _LIBCPP_INLINE_VISIBILITY char_type operator*() const {return __keep_;}
   1009     };
   1010 
   1011     _LIBCPP_INLINE_VISIBILITY
   1012     bool __test_for_eof() const
   1013     {
   1014         if (__sbuf_ && traits_type::eq_int_type(__sbuf_->sgetc(), traits_type::eof()))
   1015             __sbuf_ = 0;
   1016         return __sbuf_ == 0;
   1017     }
   1018 public:
   1019     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR istreambuf_iterator() _NOEXCEPT : __sbuf_(0) {}
   1020     _LIBCPP_INLINE_VISIBILITY istreambuf_iterator(istream_type& __s) _NOEXCEPT
   1021         : __sbuf_(__s.rdbuf()) {}
   1022     _LIBCPP_INLINE_VISIBILITY istreambuf_iterator(streambuf_type* __s) _NOEXCEPT
   1023         : __sbuf_(__s) {}
   1024     _LIBCPP_INLINE_VISIBILITY istreambuf_iterator(const __proxy& __p) _NOEXCEPT
   1025         : __sbuf_(__p.__sbuf_) {}
   1026 
   1027     _LIBCPP_INLINE_VISIBILITY char_type  operator*() const
   1028         {return static_cast<char_type>(__sbuf_->sgetc());}
   1029     _LIBCPP_INLINE_VISIBILITY istreambuf_iterator& operator++()
   1030         {
   1031             __sbuf_->sbumpc();
   1032             return *this;
   1033         }
   1034     _LIBCPP_INLINE_VISIBILITY __proxy              operator++(int)
   1035         {
   1036             return __proxy(__sbuf_->sbumpc(), __sbuf_);
   1037         }
   1038 
   1039     _LIBCPP_INLINE_VISIBILITY bool equal(const istreambuf_iterator& __b) const
   1040         {return __test_for_eof() == __b.__test_for_eof();}
   1041 };
   1042 
   1043 template <class _CharT, class _Traits>
   1044 inline _LIBCPP_INLINE_VISIBILITY
   1045 bool operator==(const istreambuf_iterator<_CharT,_Traits>& __a,
   1046                 const istreambuf_iterator<_CharT,_Traits>& __b)
   1047                 {return __a.equal(__b);}
   1048 
   1049 template <class _CharT, class _Traits>
   1050 inline _LIBCPP_INLINE_VISIBILITY
   1051 bool operator!=(const istreambuf_iterator<_CharT,_Traits>& __a,
   1052                 const istreambuf_iterator<_CharT,_Traits>& __b)
   1053                 {return !__a.equal(__b);}
   1054 
   1055 template <class _CharT, class _Traits>
   1056 class _LIBCPP_TEMPLATE_VIS ostreambuf_iterator
   1057     : public iterator<output_iterator_tag, void, void, void, void>
   1058 {
   1059 public:
   1060     typedef _CharT                          char_type;
   1061     typedef _Traits                         traits_type;
   1062     typedef basic_streambuf<_CharT,_Traits> streambuf_type;
   1063     typedef basic_ostream<_CharT,_Traits>   ostream_type;
   1064 private:
   1065     streambuf_type* __sbuf_;
   1066 public:
   1067     _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator(ostream_type& __s) _NOEXCEPT
   1068         : __sbuf_(__s.rdbuf()) {}
   1069     _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator(streambuf_type* __s) _NOEXCEPT
   1070         : __sbuf_(__s) {}
   1071     _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator& operator=(_CharT __c)
   1072         {
   1073             if (__sbuf_ && traits_type::eq_int_type(__sbuf_->sputc(__c), traits_type::eof()))
   1074                 __sbuf_ = 0;
   1075             return *this;
   1076         }
   1077     _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator& operator*()     {return *this;}
   1078     _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator& operator++()    {return *this;}
   1079     _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator& operator++(int) {return *this;}
   1080     _LIBCPP_INLINE_VISIBILITY bool failed() const _NOEXCEPT {return __sbuf_ == 0;}
   1081 
   1082 #if !defined(__APPLE__) || \
   1083     (defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED > __MAC_10_8) || \
   1084     (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_6_0)
   1085 
   1086     template <class _Ch, class _Tr>
   1087     friend
   1088     _LIBCPP_HIDDEN
   1089     ostreambuf_iterator<_Ch, _Tr>
   1090     __pad_and_output(ostreambuf_iterator<_Ch, _Tr> __s,
   1091                      const _Ch* __ob, const _Ch* __op, const _Ch* __oe,
   1092                      ios_base& __iob, _Ch __fl);
   1093 #endif
   1094 };
   1095 
   1096 template <class _Iter>
   1097 class _LIBCPP_TEMPLATE_VIS move_iterator
   1098 {
   1099 private:
   1100     _Iter __i;
   1101 public:
   1102     typedef _Iter                                            iterator_type;
   1103     typedef typename iterator_traits<iterator_type>::iterator_category iterator_category;
   1104     typedef typename iterator_traits<iterator_type>::value_type value_type;
   1105     typedef typename iterator_traits<iterator_type>::difference_type difference_type;
   1106     typedef iterator_type pointer;
   1107 #ifndef _LIBCPP_CXX03_LANG
   1108     typedef typename iterator_traits<iterator_type>::reference __reference;
   1109     typedef typename conditional<
   1110             is_reference<__reference>::value,
   1111             typename remove_reference<__reference>::type&&,
   1112             __reference
   1113         >::type reference;
   1114 #else
   1115     typedef typename iterator_traits<iterator_type>::reference reference;
   1116 #endif
   1117 
   1118     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1119     move_iterator() : __i() {}
   1120     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1121     explicit move_iterator(_Iter __x) : __i(__x) {}
   1122     template <class _Up>
   1123       _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1124       move_iterator(const move_iterator<_Up>& __u) : __i(__u.base()) {}
   1125     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 _Iter base() const {return __i;}
   1126     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 
   1127     reference operator*() const { return static_cast<reference>(*__i); }
   1128     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1129     pointer  operator->() const { return __i;}
   1130     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1131     move_iterator& operator++() {++__i; return *this;}
   1132     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1133     move_iterator  operator++(int) {move_iterator __tmp(*this); ++__i; return __tmp;}
   1134     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1135     move_iterator& operator--() {--__i; return *this;}
   1136     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1137     move_iterator  operator--(int) {move_iterator __tmp(*this); --__i; return __tmp;}
   1138     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1139     move_iterator  operator+ (difference_type __n) const {return move_iterator(__i + __n);}
   1140     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1141     move_iterator& operator+=(difference_type __n) {__i += __n; return *this;}
   1142     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1143     move_iterator  operator- (difference_type __n) const {return move_iterator(__i - __n);}
   1144     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1145     move_iterator& operator-=(difference_type __n) {__i -= __n; return *this;}
   1146     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1147     reference operator[](difference_type __n) const { return static_cast<reference>(__i[__n]); }
   1148 };
   1149 
   1150 template <class _Iter1, class _Iter2>
   1151 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1152 bool
   1153 operator==(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
   1154 {
   1155     return __x.base() == __y.base();
   1156 }
   1157 
   1158 template <class _Iter1, class _Iter2>
   1159 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1160 bool
   1161 operator<(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
   1162 {
   1163     return __x.base() < __y.base();
   1164 }
   1165 
   1166 template <class _Iter1, class _Iter2>
   1167 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1168 bool
   1169 operator!=(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
   1170 {
   1171     return __x.base() != __y.base();
   1172 }
   1173 
   1174 template <class _Iter1, class _Iter2>
   1175 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1176 bool
   1177 operator>(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
   1178 {
   1179     return __x.base() > __y.base();
   1180 }
   1181 
   1182 template <class _Iter1, class _Iter2>
   1183 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1184 bool
   1185 operator>=(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
   1186 {
   1187     return __x.base() >= __y.base();
   1188 }
   1189 
   1190 template <class _Iter1, class _Iter2>
   1191 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1192 bool
   1193 operator<=(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
   1194 {
   1195     return __x.base() <= __y.base();
   1196 }
   1197 
   1198 #ifndef _LIBCPP_CXX03_LANG
   1199 template <class _Iter1, class _Iter2>
   1200 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1201 auto
   1202 operator-(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
   1203 -> decltype(__x.base() - __y.base())
   1204 {
   1205     return __x.base() - __y.base();
   1206 }
   1207 #else
   1208 template <class _Iter1, class _Iter2>
   1209 inline _LIBCPP_INLINE_VISIBILITY
   1210 typename move_iterator<_Iter1>::difference_type
   1211 operator-(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
   1212 {
   1213     return __x.base() - __y.base();
   1214 }
   1215 #endif
   1216 
   1217 template <class _Iter>
   1218 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1219 move_iterator<_Iter>
   1220 operator+(typename move_iterator<_Iter>::difference_type __n, const move_iterator<_Iter>& __x)
   1221 {
   1222     return move_iterator<_Iter>(__x.base() + __n);
   1223 }
   1224 
   1225 template <class _Iter>
   1226 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1227 move_iterator<_Iter>
   1228 make_move_iterator(_Iter __i)
   1229 {
   1230     return move_iterator<_Iter>(__i);
   1231 }
   1232 
   1233 // __wrap_iter
   1234 
   1235 template <class _Iter> class __wrap_iter;
   1236 
   1237 template <class _Iter1, class _Iter2>
   1238 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
   1239 bool
   1240 operator==(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
   1241 
   1242 template <class _Iter1, class _Iter2>
   1243 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
   1244 bool
   1245 operator<(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
   1246 
   1247 template <class _Iter1, class _Iter2>
   1248 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
   1249 bool
   1250 operator!=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
   1251 
   1252 template <class _Iter1, class _Iter2>
   1253 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
   1254 bool
   1255 operator>(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
   1256 
   1257 template <class _Iter1, class _Iter2>
   1258 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
   1259 bool
   1260 operator>=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
   1261 
   1262 template <class _Iter1, class _Iter2>
   1263 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
   1264 bool
   1265 operator<=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
   1266 
   1267 #ifndef _LIBCPP_CXX03_LANG
   1268 template <class _Iter1, class _Iter2>
   1269 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
   1270 auto
   1271 operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT_DEBUG
   1272 -> decltype(__x.base() - __y.base());
   1273 #else
   1274 template <class _Iter1, class _Iter2>
   1275 _LIBCPP_INLINE_VISIBILITY
   1276 typename __wrap_iter<_Iter1>::difference_type
   1277 operator-(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
   1278 #endif
   1279 
   1280 template <class _Iter>
   1281 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
   1282 __wrap_iter<_Iter>
   1283 operator+(typename __wrap_iter<_Iter>::difference_type, __wrap_iter<_Iter>) _NOEXCEPT_DEBUG;
   1284 
   1285 template <class _Ip, class _Op> _Op _LIBCPP_INLINE_VISIBILITY copy(_Ip, _Ip, _Op);
   1286 template <class _B1, class _B2> _B2 _LIBCPP_INLINE_VISIBILITY copy_backward(_B1, _B1, _B2);
   1287 template <class _Ip, class _Op> _Op _LIBCPP_INLINE_VISIBILITY move(_Ip, _Ip, _Op);
   1288 template <class _B1, class _B2> _B2 _LIBCPP_INLINE_VISIBILITY move_backward(_B1, _B1, _B2);
   1289 
   1290 #if _LIBCPP_DEBUG_LEVEL < 2
   1291 
   1292 template <class _Tp>
   1293 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
   1294 typename enable_if
   1295 <
   1296     is_trivially_copy_assignable<_Tp>::value,
   1297     _Tp*
   1298 >::type
   1299 __unwrap_iter(__wrap_iter<_Tp*>);
   1300 
   1301 #else
   1302 
   1303 template <class _Tp>
   1304 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
   1305 typename enable_if
   1306 <
   1307     is_trivially_copy_assignable<_Tp>::value,
   1308     __wrap_iter<_Tp*>
   1309 >::type
   1310 __unwrap_iter(__wrap_iter<_Tp*> __i);
   1311 
   1312 #endif
   1313 
   1314 template <class _Iter>
   1315 class __wrap_iter
   1316 {
   1317 public:
   1318     typedef _Iter                                                      iterator_type;
   1319     typedef typename iterator_traits<iterator_type>::iterator_category iterator_category;
   1320     typedef typename iterator_traits<iterator_type>::value_type        value_type;
   1321     typedef typename iterator_traits<iterator_type>::difference_type   difference_type;
   1322     typedef typename iterator_traits<iterator_type>::pointer           pointer;
   1323     typedef typename iterator_traits<iterator_type>::reference         reference;
   1324 private:
   1325     iterator_type __i;
   1326 public:
   1327     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter() _NOEXCEPT_DEBUG
   1328 #if _LIBCPP_STD_VER > 11
   1329                 : __i{}
   1330 #endif
   1331     {
   1332 #if _LIBCPP_DEBUG_LEVEL >= 2
   1333         __get_db()->__insert_i(this);
   1334 #endif
   1335     }
   1336     template <class _Up> _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
   1337         __wrap_iter(const __wrap_iter<_Up>& __u,
   1338             typename enable_if<is_convertible<_Up, iterator_type>::value>::type* = 0) _NOEXCEPT_DEBUG
   1339             : __i(__u.base())
   1340     {
   1341 #if _LIBCPP_DEBUG_LEVEL >= 2
   1342         __get_db()->__iterator_copy(this, &__u);
   1343 #endif
   1344     }
   1345 #if _LIBCPP_DEBUG_LEVEL >= 2
   1346     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
   1347     __wrap_iter(const __wrap_iter& __x)
   1348         : __i(__x.base())
   1349     {
   1350         __get_db()->__iterator_copy(this, &__x);
   1351     }
   1352     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
   1353     __wrap_iter& operator=(const __wrap_iter& __x)
   1354     {
   1355         if (this != &__x)
   1356         {
   1357             __get_db()->__iterator_copy(this, &__x);
   1358             __i = __x.__i;
   1359         }
   1360         return *this;
   1361     }
   1362     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
   1363     ~__wrap_iter()
   1364     {
   1365         __get_db()->__erase_i(this);
   1366     }
   1367 #endif
   1368     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG reference operator*() const _NOEXCEPT_DEBUG
   1369     {
   1370 #if _LIBCPP_DEBUG_LEVEL >= 2
   1371         _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
   1372                        "Attempted to dereference a non-dereferenceable iterator");
   1373 #endif
   1374         return *__i;
   1375     }
   1376     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG pointer  operator->() const _NOEXCEPT_DEBUG
   1377     {
   1378 #if _LIBCPP_DEBUG_LEVEL >= 2
   1379         _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
   1380                        "Attempted to dereference a non-dereferenceable iterator");
   1381 #endif
   1382         return (pointer)_VSTD::addressof(*__i);
   1383     }
   1384     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter& operator++() _NOEXCEPT_DEBUG
   1385     {
   1386 #if _LIBCPP_DEBUG_LEVEL >= 2
   1387         _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
   1388                        "Attempted to increment non-incrementable iterator");
   1389 #endif
   1390         ++__i;
   1391         return *this;
   1392     }
   1393     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter  operator++(int) _NOEXCEPT_DEBUG
   1394         {__wrap_iter __tmp(*this); ++(*this); return __tmp;}
   1395 
   1396     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter& operator--() _NOEXCEPT_DEBUG
   1397     {
   1398 #if _LIBCPP_DEBUG_LEVEL >= 2
   1399         _LIBCPP_ASSERT(__get_const_db()->__decrementable(this),
   1400                        "Attempted to decrement non-decrementable iterator");
   1401 #endif
   1402         --__i;
   1403         return *this;
   1404     }
   1405     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter  operator--(int) _NOEXCEPT_DEBUG
   1406         {__wrap_iter __tmp(*this); --(*this); return __tmp;}
   1407     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter  operator+ (difference_type __n) const _NOEXCEPT_DEBUG
   1408         {__wrap_iter __w(*this); __w += __n; return __w;}
   1409     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter& operator+=(difference_type __n) _NOEXCEPT_DEBUG
   1410     {
   1411 #if _LIBCPP_DEBUG_LEVEL >= 2
   1412         _LIBCPP_ASSERT(__get_const_db()->__addable(this, __n),
   1413                    "Attempted to add/subtract iterator outside of valid range");
   1414 #endif
   1415         __i += __n;
   1416         return *this;
   1417     }
   1418     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter  operator- (difference_type __n) const _NOEXCEPT_DEBUG
   1419         {return *this + (-__n);}
   1420     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter& operator-=(difference_type __n) _NOEXCEPT_DEBUG
   1421         {*this += -__n; return *this;}
   1422     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG reference    operator[](difference_type __n) const _NOEXCEPT_DEBUG
   1423     {
   1424 #if _LIBCPP_DEBUG_LEVEL >= 2
   1425         _LIBCPP_ASSERT(__get_const_db()->__subscriptable(this, __n),
   1426                    "Attempted to subscript iterator outside of valid range");
   1427 #endif
   1428         return __i[__n];
   1429     }
   1430 
   1431     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG iterator_type base() const _NOEXCEPT_DEBUG {return __i;}
   1432 
   1433 private:
   1434 #if _LIBCPP_DEBUG_LEVEL >= 2
   1435     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter(const void* __p, iterator_type __x) : __i(__x)
   1436     {
   1437         __get_db()->__insert_ic(this, __p);
   1438     }
   1439 #else
   1440     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter(iterator_type __x) _NOEXCEPT_DEBUG : __i(__x) {}
   1441 #endif
   1442 
   1443     template <class _Up> friend class __wrap_iter;
   1444     template <class _CharT, class _Traits, class _Alloc> friend class basic_string;
   1445     template <class _Tp, class _Alloc> friend class _LIBCPP_TEMPLATE_VIS vector;
   1446     template <class _Tp, ptrdiff_t> friend class _LIBCPP_TEMPLATE_VIS span;
   1447 
   1448     template <class _Iter1, class _Iter2>
   1449     _LIBCPP_CONSTEXPR_IF_NODEBUG friend
   1450     bool
   1451     operator==(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
   1452 
   1453     template <class _Iter1, class _Iter2>
   1454     _LIBCPP_CONSTEXPR_IF_NODEBUG friend
   1455     bool
   1456     operator<(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
   1457 
   1458     template <class _Iter1, class _Iter2>
   1459     _LIBCPP_CONSTEXPR_IF_NODEBUG friend
   1460     bool
   1461     operator!=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
   1462 
   1463     template <class _Iter1, class _Iter2>
   1464     _LIBCPP_CONSTEXPR_IF_NODEBUG friend
   1465     bool
   1466     operator>(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
   1467 
   1468     template <class _Iter1, class _Iter2>
   1469     _LIBCPP_CONSTEXPR_IF_NODEBUG friend
   1470     bool
   1471     operator>=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
   1472 
   1473     template <class _Iter1, class _Iter2>
   1474     _LIBCPP_CONSTEXPR_IF_NODEBUG friend
   1475     bool
   1476     operator<=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
   1477 
   1478 #ifndef _LIBCPP_CXX03_LANG
   1479     template <class _Iter1, class _Iter2>
   1480     _LIBCPP_CONSTEXPR_IF_NODEBUG friend
   1481     auto
   1482     operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT_DEBUG
   1483     -> decltype(__x.base() - __y.base());
   1484 #else
   1485     template <class _Iter1, class _Iter2>
   1486     _LIBCPP_CONSTEXPR_IF_NODEBUG friend
   1487     typename __wrap_iter<_Iter1>::difference_type
   1488     operator-(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
   1489 #endif
   1490 
   1491     template <class _Iter1>
   1492     _LIBCPP_CONSTEXPR_IF_NODEBUG friend
   1493     __wrap_iter<_Iter1>
   1494     operator+(typename __wrap_iter<_Iter1>::difference_type, __wrap_iter<_Iter1>) _NOEXCEPT_DEBUG;
   1495 
   1496     template <class _Ip, class _Op> friend _Op copy(_Ip, _Ip, _Op);
   1497     template <class _B1, class _B2> friend _B2 copy_backward(_B1, _B1, _B2);
   1498     template <class _Ip, class _Op> friend _Op move(_Ip, _Ip, _Op);
   1499     template <class _B1, class _B2> friend _B2 move_backward(_B1, _B1, _B2);
   1500 
   1501 #if _LIBCPP_DEBUG_LEVEL < 2
   1502     template <class _Tp>
   1503     _LIBCPP_CONSTEXPR_IF_NODEBUG friend
   1504     typename enable_if
   1505     <
   1506         is_trivially_copy_assignable<_Tp>::value,
   1507         _Tp*
   1508     >::type
   1509     __unwrap_iter(__wrap_iter<_Tp*>);
   1510 #else
   1511   template <class _Tp>
   1512   inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
   1513   typename enable_if
   1514   <
   1515       is_trivially_copy_assignable<_Tp>::value,
   1516       __wrap_iter<_Tp*>
   1517   >::type
   1518   __unwrap_iter(__wrap_iter<_Tp*> __i);
   1519 #endif
   1520 };
   1521 
   1522 template <class _Iter1, class _Iter2>
   1523 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
   1524 bool
   1525 operator==(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT_DEBUG
   1526 {
   1527     return __x.base() == __y.base();
   1528 }
   1529 
   1530 template <class _Iter1, class _Iter2>
   1531 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
   1532 bool
   1533 operator<(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT_DEBUG
   1534 {
   1535 #if _LIBCPP_DEBUG_LEVEL >= 2
   1536     _LIBCPP_ASSERT(__get_const_db()->__less_than_comparable(&__x, &__y),
   1537                    "Attempted to compare incomparable iterators");
   1538 #endif
   1539     return __x.base() < __y.base();
   1540 }
   1541 
   1542 template <class _Iter1, class _Iter2>
   1543 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
   1544 bool
   1545 operator!=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT_DEBUG
   1546 {
   1547     return !(__x == __y);
   1548 }
   1549 
   1550 template <class _Iter1, class _Iter2>
   1551 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
   1552 bool
   1553 operator>(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT_DEBUG
   1554 {
   1555     return __y < __x;
   1556 }
   1557 
   1558 template <class _Iter1, class _Iter2>
   1559 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
   1560 bool
   1561 operator>=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT_DEBUG
   1562 {
   1563     return !(__x < __y);
   1564 }
   1565 
   1566 template <class _Iter1, class _Iter2>
   1567 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
   1568 bool
   1569 operator<=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT_DEBUG
   1570 {
   1571     return !(__y < __x);
   1572 }
   1573 
   1574 template <class _Iter1>
   1575 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
   1576 bool
   1577 operator!=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT_DEBUG
   1578 {
   1579     return !(__x == __y);
   1580 }
   1581 
   1582 template <class _Iter1>
   1583 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
   1584 bool
   1585 operator>(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT_DEBUG
   1586 {
   1587     return __y < __x;
   1588 }
   1589 
   1590 template <class _Iter1>
   1591 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
   1592 bool
   1593 operator>=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT_DEBUG
   1594 {
   1595     return !(__x < __y);
   1596 }
   1597 
   1598 template <class _Iter1>
   1599 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
   1600 bool
   1601 operator<=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT_DEBUG
   1602 {
   1603     return !(__y < __x);
   1604 }
   1605 
   1606 #ifndef _LIBCPP_CXX03_LANG
   1607 template <class _Iter1, class _Iter2>
   1608 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
   1609 auto
   1610 operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT_DEBUG
   1611 -> decltype(__x.base() - __y.base())
   1612 {
   1613 #if _LIBCPP_DEBUG_LEVEL >= 2
   1614     _LIBCPP_ASSERT(__get_const_db()->__less_than_comparable(&__x, &__y),
   1615                    "Attempted to subtract incompatible iterators");
   1616 #endif
   1617     return __x.base() - __y.base();
   1618 }
   1619 #else
   1620 template <class _Iter1, class _Iter2>
   1621 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
   1622 typename __wrap_iter<_Iter1>::difference_type
   1623 operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT_DEBUG
   1624 {
   1625 #if _LIBCPP_DEBUG_LEVEL >= 2
   1626     _LIBCPP_ASSERT(__get_const_db()->__less_than_comparable(&__x, &__y),
   1627                    "Attempted to subtract incompatible iterators");
   1628 #endif
   1629     return __x.base() - __y.base();
   1630 }
   1631 #endif
   1632 
   1633 template <class _Iter>
   1634 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
   1635 __wrap_iter<_Iter>
   1636 operator+(typename __wrap_iter<_Iter>::difference_type __n,
   1637           __wrap_iter<_Iter> __x) _NOEXCEPT_DEBUG
   1638 {
   1639     __x += __n;
   1640     return __x;
   1641 }
   1642 
   1643 template <class _Iter>
   1644 struct __libcpp_is_trivial_iterator
   1645     : public _LIBCPP_BOOL_CONSTANT(is_pointer<_Iter>::value) {};
   1646     
   1647 template <class _Iter>
   1648 struct __libcpp_is_trivial_iterator<move_iterator<_Iter> >
   1649     : public _LIBCPP_BOOL_CONSTANT(__libcpp_is_trivial_iterator<_Iter>::value) {};
   1650 
   1651 template <class _Iter>
   1652 struct __libcpp_is_trivial_iterator<reverse_iterator<_Iter> >
   1653     : public _LIBCPP_BOOL_CONSTANT(__libcpp_is_trivial_iterator<_Iter>::value) {};
   1654 
   1655 template <class _Iter>
   1656 struct __libcpp_is_trivial_iterator<__wrap_iter<_Iter> >
   1657     : public _LIBCPP_BOOL_CONSTANT(__libcpp_is_trivial_iterator<_Iter>::value) {};
   1658 
   1659 
   1660 template <class _Tp, size_t _Np>
   1661 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
   1662 _Tp*
   1663 begin(_Tp (&__array)[_Np])
   1664 {
   1665     return __array;
   1666 }
   1667 
   1668 template <class _Tp, size_t _Np>
   1669 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
   1670 _Tp*
   1671 end(_Tp (&__array)[_Np])
   1672 {
   1673     return __array + _Np;
   1674 }
   1675 
   1676 #if !defined(_LIBCPP_CXX03_LANG)
   1677 
   1678 template <class _Cp>
   1679 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1680 auto
   1681 begin(_Cp& __c) -> decltype(__c.begin())
   1682 {
   1683     return __c.begin();
   1684 }
   1685 
   1686 template <class _Cp>
   1687 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1688 auto
   1689 begin(const _Cp& __c) -> decltype(__c.begin())
   1690 {
   1691     return __c.begin();
   1692 }
   1693 
   1694 template <class _Cp>
   1695 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1696 auto
   1697 end(_Cp& __c) -> decltype(__c.end())
   1698 {
   1699     return __c.end();
   1700 }
   1701 
   1702 template <class _Cp>
   1703 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1704 auto
   1705 end(const _Cp& __c) -> decltype(__c.end())
   1706 {
   1707     return __c.end();
   1708 }
   1709 
   1710 #if _LIBCPP_STD_VER > 11
   1711 
   1712 template <class _Tp, size_t _Np>
   1713 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1714 reverse_iterator<_Tp*> rbegin(_Tp (&__array)[_Np])
   1715 {
   1716     return reverse_iterator<_Tp*>(__array + _Np);
   1717 }
   1718 
   1719 template <class _Tp, size_t _Np>
   1720 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1721 reverse_iterator<_Tp*> rend(_Tp (&__array)[_Np])
   1722 {
   1723     return reverse_iterator<_Tp*>(__array);
   1724 }
   1725 
   1726 template <class _Ep>
   1727 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1728 reverse_iterator<const _Ep*> rbegin(initializer_list<_Ep> __il)
   1729 {
   1730     return reverse_iterator<const _Ep*>(__il.end());
   1731 }
   1732 
   1733 template <class _Ep>
   1734 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1735 reverse_iterator<const _Ep*> rend(initializer_list<_Ep> __il)
   1736 {
   1737     return reverse_iterator<const _Ep*>(__il.begin());
   1738 }
   1739 
   1740 template <class _Cp>
   1741 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
   1742 auto cbegin(const _Cp& __c) -> decltype(_VSTD::begin(__c))
   1743 {
   1744     return _VSTD::begin(__c);
   1745 }
   1746 
   1747 template <class _Cp>
   1748 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
   1749 auto cend(const _Cp& __c) -> decltype(_VSTD::end(__c))
   1750 {
   1751     return _VSTD::end(__c);
   1752 }
   1753 
   1754 template <class _Cp>
   1755 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1756 auto rbegin(_Cp& __c) -> decltype(__c.rbegin())
   1757 {
   1758     return __c.rbegin();
   1759 }
   1760 
   1761 template <class _Cp>
   1762 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1763 auto rbegin(const _Cp& __c) -> decltype(__c.rbegin())
   1764 {
   1765     return __c.rbegin();
   1766 }
   1767 
   1768 template <class _Cp>
   1769 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1770 auto rend(_Cp& __c) -> decltype(__c.rend())
   1771 {
   1772     return __c.rend();
   1773 }
   1774 
   1775 template <class _Cp>
   1776 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1777 auto rend(const _Cp& __c) -> decltype(__c.rend())
   1778 {
   1779     return __c.rend();
   1780 }
   1781 
   1782 template <class _Cp>
   1783 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1784 auto crbegin(const _Cp& __c) -> decltype(_VSTD::rbegin(__c))
   1785 {
   1786     return _VSTD::rbegin(__c);
   1787 }
   1788 
   1789 template <class _Cp>
   1790 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
   1791 auto crend(const _Cp& __c) -> decltype(_VSTD::rend(__c))
   1792 {
   1793     return _VSTD::rend(__c);
   1794 }
   1795 
   1796 #endif
   1797 
   1798 
   1799 #else  // defined(_LIBCPP_CXX03_LANG)
   1800 
   1801 template <class _Cp>
   1802 inline _LIBCPP_INLINE_VISIBILITY
   1803 typename _Cp::iterator
   1804 begin(_Cp& __c)
   1805 {
   1806     return __c.begin();
   1807 }
   1808 
   1809 template <class _Cp>
   1810 inline _LIBCPP_INLINE_VISIBILITY
   1811 typename _Cp::const_iterator
   1812 begin(const _Cp& __c)
   1813 {
   1814     return __c.begin();
   1815 }
   1816 
   1817 template <class _Cp>
   1818 inline _LIBCPP_INLINE_VISIBILITY
   1819 typename _Cp::iterator
   1820 end(_Cp& __c)
   1821 {
   1822     return __c.end();
   1823 }
   1824 
   1825 template <class _Cp>
   1826 inline _LIBCPP_INLINE_VISIBILITY
   1827 typename _Cp::const_iterator
   1828 end(const _Cp& __c)
   1829 {
   1830     return __c.end();
   1831 }
   1832 
   1833 #endif  // !defined(_LIBCPP_CXX03_LANG)
   1834 
   1835 #if _LIBCPP_STD_VER > 14
   1836 
   1837 // #if _LIBCPP_STD_VER > 11
   1838 // template <>
   1839 // struct _LIBCPP_TEMPLATE_VIS plus<void>
   1840 // {
   1841 //     template <class _T1, class _T2>
   1842 //     _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
   1843 //     auto operator()(_T1&& __t, _T2&& __u) const
   1844 //     _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) + _VSTD::forward<_T2>(__u)))
   1845 //     -> decltype        (_VSTD::forward<_T1>(__t) + _VSTD::forward<_T2>(__u))
   1846 //         { return        _VSTD::forward<_T1>(__t) + _VSTD::forward<_T2>(__u); }
   1847 //     typedef void is_transparent;
   1848 // };
   1849 // #endif
   1850 
   1851 template <class _Cont>
   1852 inline _LIBCPP_INLINE_VISIBILITY
   1853 constexpr auto size(const _Cont& __c)
   1854 _NOEXCEPT_(noexcept(__c.size()))
   1855 -> decltype        (__c.size())
   1856 { return            __c.size(); }
   1857 
   1858 template <class _Tp, size_t _Sz>
   1859 inline _LIBCPP_INLINE_VISIBILITY
   1860 constexpr size_t size(const _Tp (&)[_Sz]) noexcept { return _Sz; }
   1861 
   1862 template <class _Cont>
   1863 _LIBCPP_NODISCARD_AFTER_CXX17 inline _LIBCPP_INLINE_VISIBILITY
   1864 constexpr auto empty(const _Cont& __c)
   1865 _NOEXCEPT_(noexcept(__c.empty()))
   1866 -> decltype        (__c.empty())
   1867 { return            __c.empty(); }
   1868 
   1869 template <class _Tp, size_t _Sz>
   1870 _LIBCPP_NODISCARD_AFTER_CXX17 inline _LIBCPP_INLINE_VISIBILITY
   1871 constexpr bool empty(const _Tp (&)[_Sz]) noexcept { return false; }
   1872 
   1873 template <class _Ep>
   1874 _LIBCPP_NODISCARD_AFTER_CXX17 inline _LIBCPP_INLINE_VISIBILITY
   1875 constexpr bool empty(initializer_list<_Ep> __il) noexcept { return __il.size() == 0; }
   1876 
   1877 template <class _Cont> constexpr
   1878 inline _LIBCPP_INLINE_VISIBILITY
   1879 auto data(_Cont& __c)
   1880 _NOEXCEPT_(noexcept(__c.data()))
   1881 -> decltype        (__c.data())
   1882 { return            __c.data(); }
   1883 
   1884 template <class _Cont> constexpr
   1885 inline _LIBCPP_INLINE_VISIBILITY
   1886 auto data(const _Cont& __c)
   1887 _NOEXCEPT_(noexcept(__c.data()))
   1888 -> decltype        (__c.data()) 
   1889 { return            __c.data(); }
   1890 
   1891 template <class _Tp, size_t _Sz>
   1892 inline _LIBCPP_INLINE_VISIBILITY
   1893 constexpr _Tp* data(_Tp (&__array)[_Sz]) noexcept { return __array; }
   1894 
   1895 template <class _Ep>
   1896 inline _LIBCPP_INLINE_VISIBILITY
   1897 constexpr const _Ep* data(initializer_list<_Ep> __il) noexcept { return __il.begin(); }
   1898 #endif
   1899 
   1900 
   1901 _LIBCPP_END_NAMESPACE_STD
   1902 
   1903 #endif  // _LIBCPP_ITERATOR
   1904