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