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