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