Import GCC-8 to a new vendor branch
[dragonfly.git] / contrib / gcc-8.0 / libstdc++-v3 / include / bits / stl_iterator.h
1 // Iterators -*- C++ -*-
2
3 // Copyright (C) 2001-2018 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library.  This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
9 // any later version.
10
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 // GNU General Public License for more details.
15
16 // Under Section 7 of GPL version 3, you are granted additional
17 // permissions described in the GCC Runtime Library Exception, version
18 // 3.1, as published by the Free Software Foundation.
19
20 // You should have received a copy of the GNU General Public License and
21 // a copy of the GCC Runtime Library Exception along with this program;
22 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23 // <http://www.gnu.org/licenses/>.
24
25 /*
26  *
27  * Copyright (c) 1994
28  * Hewlett-Packard Company
29  *
30  * Permission to use, copy, modify, distribute and sell this software
31  * and its documentation for any purpose is hereby granted without fee,
32  * provided that the above copyright notice appear in all copies and
33  * that both that copyright notice and this permission notice appear
34  * in supporting documentation.  Hewlett-Packard Company makes no
35  * representations about the suitability of this software for any
36  * purpose.  It is provided "as is" without express or implied warranty.
37  *
38  *
39  * Copyright (c) 1996-1998
40  * Silicon Graphics Computer Systems, Inc.
41  *
42  * Permission to use, copy, modify, distribute and sell this software
43  * and its documentation for any purpose is hereby granted without fee,
44  * provided that the above copyright notice appear in all copies and
45  * that both that copyright notice and this permission notice appear
46  * in supporting documentation.  Silicon Graphics makes no
47  * representations about the suitability of this software for any
48  * purpose.  It is provided "as is" without express or implied warranty.
49  */
50
51 /** @file bits/stl_iterator.h
52  *  This is an internal header file, included by other library headers.
53  *  Do not attempt to use it directly. @headername{iterator}
54  *
55  *  This file implements reverse_iterator, back_insert_iterator,
56  *  front_insert_iterator, insert_iterator, __normal_iterator, and their
57  *  supporting functions and overloaded operators.
58  */
59
60 #ifndef _STL_ITERATOR_H
61 #define _STL_ITERATOR_H 1
62
63 #include <bits/cpp_type_traits.h>
64 #include <ext/type_traits.h>
65 #include <bits/move.h>
66 #include <bits/ptr_traits.h>
67
68 #if __cplusplus > 201402L
69 # define __cpp_lib_array_constexpr 201603
70 #endif
71
72 namespace std _GLIBCXX_VISIBILITY(default)
73 {
74 _GLIBCXX_BEGIN_NAMESPACE_VERSION
75
76   /**
77    * @addtogroup iterators
78    * @{
79    */
80
81   // 24.4.1 Reverse iterators
82   /**
83    *  Bidirectional and random access iterators have corresponding reverse
84    *  %iterator adaptors that iterate through the data structure in the
85    *  opposite direction.  They have the same signatures as the corresponding
86    *  iterators.  The fundamental relation between a reverse %iterator and its
87    *  corresponding %iterator @c i is established by the identity:
88    *  @code
89    *      &*(reverse_iterator(i)) == &*(i - 1)
90    *  @endcode
91    *
92    *  <em>This mapping is dictated by the fact that while there is always a
93    *  pointer past the end of an array, there might not be a valid pointer
94    *  before the beginning of an array.</em> [24.4.1]/1,2
95    *
96    *  Reverse iterators can be tricky and surprising at first.  Their
97    *  semantics make sense, however, and the trickiness is a side effect of
98    *  the requirement that the iterators must be safe.
99   */
100   template<typename _Iterator>
101     class reverse_iterator
102     : public iterator<typename iterator_traits<_Iterator>::iterator_category,
103                       typename iterator_traits<_Iterator>::value_type,
104                       typename iterator_traits<_Iterator>::difference_type,
105                       typename iterator_traits<_Iterator>::pointer,
106                       typename iterator_traits<_Iterator>::reference>
107     {
108     protected:
109       _Iterator current;
110
111       typedef iterator_traits<_Iterator>                __traits_type;
112
113     public:
114       typedef _Iterator                                 iterator_type;
115       typedef typename __traits_type::difference_type   difference_type;
116       typedef typename __traits_type::pointer           pointer;
117       typedef typename __traits_type::reference         reference;
118
119       /**
120        *  The default constructor value-initializes member @p current.
121        *  If it is a pointer, that means it is zero-initialized.
122       */
123       // _GLIBCXX_RESOLVE_LIB_DEFECTS
124       // 235 No specification of default ctor for reverse_iterator
125       _GLIBCXX17_CONSTEXPR
126       reverse_iterator() : current() { }
127
128       /**
129        *  This %iterator will move in the opposite direction that @p x does.
130       */
131       explicit _GLIBCXX17_CONSTEXPR
132       reverse_iterator(iterator_type __x) : current(__x) { }
133
134       /**
135        *  The copy constructor is normal.
136       */
137       _GLIBCXX17_CONSTEXPR
138       reverse_iterator(const reverse_iterator& __x)
139       : current(__x.current) { }
140
141       /**
142        *  A %reverse_iterator across other types can be copied if the
143        *  underlying %iterator can be converted to the type of @c current.
144       */
145       template<typename _Iter>
146         _GLIBCXX17_CONSTEXPR
147         reverse_iterator(const reverse_iterator<_Iter>& __x)
148         : current(__x.base()) { }
149
150       /**
151        *  @return  @c current, the %iterator used for underlying work.
152       */
153       _GLIBCXX17_CONSTEXPR iterator_type
154       base() const
155       { return current; }
156
157       /**
158        *  @return  A reference to the value at @c --current
159        *
160        *  This requires that @c --current is dereferenceable.
161        *
162        *  @warning This implementation requires that for an iterator of the
163        *           underlying iterator type, @c x, a reference obtained by
164        *           @c *x remains valid after @c x has been modified or
165        *           destroyed. This is a bug: http://gcc.gnu.org/PR51823
166       */
167       _GLIBCXX17_CONSTEXPR reference
168       operator*() const
169       {
170         _Iterator __tmp = current;
171         return *--__tmp;
172       }
173
174       /**
175        *  @return  A pointer to the value at @c --current
176        *
177        *  This requires that @c --current is dereferenceable.
178       */
179       _GLIBCXX17_CONSTEXPR pointer
180       operator->() const
181       { return &(operator*()); }
182
183       /**
184        *  @return  @c *this
185        *
186        *  Decrements the underlying iterator.
187       */
188       _GLIBCXX17_CONSTEXPR reverse_iterator&
189       operator++()
190       {
191         --current;
192         return *this;
193       }
194
195       /**
196        *  @return  The original value of @c *this
197        *
198        *  Decrements the underlying iterator.
199       */
200       _GLIBCXX17_CONSTEXPR reverse_iterator
201       operator++(int)
202       {
203         reverse_iterator __tmp = *this;
204         --current;
205         return __tmp;
206       }
207
208       /**
209        *  @return  @c *this
210        *
211        *  Increments the underlying iterator.
212       */
213       _GLIBCXX17_CONSTEXPR reverse_iterator&
214       operator--()
215       {
216         ++current;
217         return *this;
218       }
219
220       /**
221        *  @return  A reverse_iterator with the previous value of @c *this
222        *
223        *  Increments the underlying iterator.
224       */
225       _GLIBCXX17_CONSTEXPR reverse_iterator
226       operator--(int)
227       {
228         reverse_iterator __tmp = *this;
229         ++current;
230         return __tmp;
231       }
232
233       /**
234        *  @return  A reverse_iterator that refers to @c current - @a __n
235        *
236        *  The underlying iterator must be a Random Access Iterator.
237       */
238       _GLIBCXX17_CONSTEXPR reverse_iterator
239       operator+(difference_type __n) const
240       { return reverse_iterator(current - __n); }
241
242       /**
243        *  @return  *this
244        *
245        *  Moves the underlying iterator backwards @a __n steps.
246        *  The underlying iterator must be a Random Access Iterator.
247       */
248       _GLIBCXX17_CONSTEXPR reverse_iterator&
249       operator+=(difference_type __n)
250       {
251         current -= __n;
252         return *this;
253       }
254
255       /**
256        *  @return  A reverse_iterator that refers to @c current - @a __n
257        *
258        *  The underlying iterator must be a Random Access Iterator.
259       */
260       _GLIBCXX17_CONSTEXPR reverse_iterator
261       operator-(difference_type __n) const
262       { return reverse_iterator(current + __n); }
263
264       /**
265        *  @return  *this
266        *
267        *  Moves the underlying iterator forwards @a __n steps.
268        *  The underlying iterator must be a Random Access Iterator.
269       */
270       _GLIBCXX17_CONSTEXPR reverse_iterator&
271       operator-=(difference_type __n)
272       {
273         current += __n;
274         return *this;
275       }
276
277       /**
278        *  @return  The value at @c current - @a __n - 1
279        *
280        *  The underlying iterator must be a Random Access Iterator.
281       */
282       _GLIBCXX17_CONSTEXPR reference
283       operator[](difference_type __n) const
284       { return *(*this + __n); }
285     };
286
287   //@{
288   /**
289    *  @param  __x  A %reverse_iterator.
290    *  @param  __y  A %reverse_iterator.
291    *  @return  A simple bool.
292    *
293    *  Reverse iterators forward many operations to their underlying base()
294    *  iterators.  Others are implemented in terms of one another.
295    *
296   */
297   template<typename _Iterator>
298     inline _GLIBCXX17_CONSTEXPR bool
299     operator==(const reverse_iterator<_Iterator>& __x,
300                const reverse_iterator<_Iterator>& __y)
301     { return __x.base() == __y.base(); }
302
303   template<typename _Iterator>
304     inline _GLIBCXX17_CONSTEXPR bool
305     operator<(const reverse_iterator<_Iterator>& __x,
306               const reverse_iterator<_Iterator>& __y)
307     { return __y.base() < __x.base(); }
308
309   template<typename _Iterator>
310     inline _GLIBCXX17_CONSTEXPR bool
311     operator!=(const reverse_iterator<_Iterator>& __x,
312                const reverse_iterator<_Iterator>& __y)
313     { return !(__x == __y); }
314
315   template<typename _Iterator>
316     inline _GLIBCXX17_CONSTEXPR bool
317     operator>(const reverse_iterator<_Iterator>& __x,
318               const reverse_iterator<_Iterator>& __y)
319     { return __y < __x; }
320
321   template<typename _Iterator>
322     inline _GLIBCXX17_CONSTEXPR bool
323     operator<=(const reverse_iterator<_Iterator>& __x,
324                const reverse_iterator<_Iterator>& __y)
325     { return !(__y < __x); }
326
327   template<typename _Iterator>
328     inline _GLIBCXX17_CONSTEXPR bool
329     operator>=(const reverse_iterator<_Iterator>& __x,
330                const reverse_iterator<_Iterator>& __y)
331     { return !(__x < __y); }
332
333   // _GLIBCXX_RESOLVE_LIB_DEFECTS
334   // DR 280. Comparison of reverse_iterator to const reverse_iterator.
335   template<typename _IteratorL, typename _IteratorR>
336     inline _GLIBCXX17_CONSTEXPR bool
337     operator==(const reverse_iterator<_IteratorL>& __x,
338                const reverse_iterator<_IteratorR>& __y)
339     { return __x.base() == __y.base(); }
340
341   template<typename _IteratorL, typename _IteratorR>
342     inline _GLIBCXX17_CONSTEXPR bool
343     operator<(const reverse_iterator<_IteratorL>& __x,
344               const reverse_iterator<_IteratorR>& __y)
345     { return __y.base() < __x.base(); }
346
347   template<typename _IteratorL, typename _IteratorR>
348     inline _GLIBCXX17_CONSTEXPR bool
349     operator!=(const reverse_iterator<_IteratorL>& __x,
350                const reverse_iterator<_IteratorR>& __y)
351     { return !(__x == __y); }
352
353   template<typename _IteratorL, typename _IteratorR>
354     inline _GLIBCXX17_CONSTEXPR bool
355     operator>(const reverse_iterator<_IteratorL>& __x,
356               const reverse_iterator<_IteratorR>& __y)
357     { return __y < __x; }
358
359   template<typename _IteratorL, typename _IteratorR>
360     inline _GLIBCXX17_CONSTEXPR bool
361     operator<=(const reverse_iterator<_IteratorL>& __x,
362                const reverse_iterator<_IteratorR>& __y)
363     { return !(__y < __x); }
364
365   template<typename _IteratorL, typename _IteratorR>
366     inline _GLIBCXX17_CONSTEXPR bool
367     operator>=(const reverse_iterator<_IteratorL>& __x,
368                const reverse_iterator<_IteratorR>& __y)
369     { return !(__x < __y); }
370   //@}
371
372 #if __cplusplus < 201103L
373   template<typename _Iterator>
374     inline typename reverse_iterator<_Iterator>::difference_type
375     operator-(const reverse_iterator<_Iterator>& __x,
376               const reverse_iterator<_Iterator>& __y)
377     { return __y.base() - __x.base(); }
378
379   template<typename _IteratorL, typename _IteratorR>
380     inline typename reverse_iterator<_IteratorL>::difference_type
381     operator-(const reverse_iterator<_IteratorL>& __x,
382               const reverse_iterator<_IteratorR>& __y)
383     { return __y.base() - __x.base(); }
384 #else
385   // _GLIBCXX_RESOLVE_LIB_DEFECTS
386   // DR 685. reverse_iterator/move_iterator difference has invalid signatures
387   template<typename _IteratorL, typename _IteratorR>
388     inline _GLIBCXX17_CONSTEXPR auto
389     operator-(const reverse_iterator<_IteratorL>& __x,
390               const reverse_iterator<_IteratorR>& __y)
391     -> decltype(__y.base() - __x.base())
392     { return __y.base() - __x.base(); }
393 #endif
394
395   template<typename _Iterator>
396     inline _GLIBCXX17_CONSTEXPR reverse_iterator<_Iterator>
397     operator+(typename reverse_iterator<_Iterator>::difference_type __n,
398               const reverse_iterator<_Iterator>& __x)
399     { return reverse_iterator<_Iterator>(__x.base() - __n); }
400
401 #if __cplusplus >= 201103L
402   // Same as C++14 make_reverse_iterator but used in C++03 mode too.
403   template<typename _Iterator>
404     inline _GLIBCXX17_CONSTEXPR reverse_iterator<_Iterator>
405     __make_reverse_iterator(_Iterator __i)
406     { return reverse_iterator<_Iterator>(__i); }
407
408 # if __cplusplus > 201103L
409 #  define __cpp_lib_make_reverse_iterator 201402
410
411   // _GLIBCXX_RESOLVE_LIB_DEFECTS
412   // DR 2285. make_reverse_iterator
413   /// Generator function for reverse_iterator.
414   template<typename _Iterator>
415     inline _GLIBCXX17_CONSTEXPR reverse_iterator<_Iterator>
416     make_reverse_iterator(_Iterator __i)
417     { return reverse_iterator<_Iterator>(__i); }
418 # endif
419 #endif
420
421 #if __cplusplus >= 201103L
422   template<typename _Iterator>
423     auto
424     __niter_base(reverse_iterator<_Iterator> __it)
425     -> decltype(__make_reverse_iterator(__niter_base(__it.base())))
426     { return __make_reverse_iterator(__niter_base(__it.base())); }
427
428   template<typename _Iterator>
429     struct __is_move_iterator<reverse_iterator<_Iterator> >
430       : __is_move_iterator<_Iterator>
431     { };
432
433   template<typename _Iterator>
434     auto
435     __miter_base(reverse_iterator<_Iterator> __it)
436     -> decltype(__make_reverse_iterator(__miter_base(__it.base())))
437     { return __make_reverse_iterator(__miter_base(__it.base())); }
438 #endif
439
440   // 24.4.2.2.1 back_insert_iterator
441   /**
442    *  @brief  Turns assignment into insertion.
443    *
444    *  These are output iterators, constructed from a container-of-T.
445    *  Assigning a T to the iterator appends it to the container using
446    *  push_back.
447    *
448    *  Tip:  Using the back_inserter function to create these iterators can
449    *  save typing.
450   */
451   template<typename _Container>
452     class back_insert_iterator
453     : public iterator<output_iterator_tag, void, void, void, void>
454     {
455     protected:
456       _Container* container;
457
458     public:
459       /// A nested typedef for the type of whatever container you used.
460       typedef _Container          container_type;
461
462       /// The only way to create this %iterator is with a container.
463       explicit
464       back_insert_iterator(_Container& __x)
465       : container(std::__addressof(__x)) { }
466
467       /**
468        *  @param  __value  An instance of whatever type
469        *                 container_type::const_reference is; presumably a
470        *                 reference-to-const T for container<T>.
471        *  @return  This %iterator, for chained operations.
472        *
473        *  This kind of %iterator doesn't really have a @a position in the
474        *  container (you can think of the position as being permanently at
475        *  the end, if you like).  Assigning a value to the %iterator will
476        *  always append the value to the end of the container.
477       */
478 #if __cplusplus < 201103L
479       back_insert_iterator&
480       operator=(typename _Container::const_reference __value)
481       {
482         container->push_back(__value);
483         return *this;
484       }
485 #else
486       back_insert_iterator&
487       operator=(const typename _Container::value_type& __value)
488       {
489         container->push_back(__value);
490         return *this;
491       }
492
493       back_insert_iterator&
494       operator=(typename _Container::value_type&& __value)
495       {
496         container->push_back(std::move(__value));
497         return *this;
498       }
499 #endif
500
501       /// Simply returns *this.
502       back_insert_iterator&
503       operator*()
504       { return *this; }
505
506       /// Simply returns *this.  (This %iterator does not @a move.)
507       back_insert_iterator&
508       operator++()
509       { return *this; }
510
511       /// Simply returns *this.  (This %iterator does not @a move.)
512       back_insert_iterator
513       operator++(int)
514       { return *this; }
515     };
516
517   /**
518    *  @param  __x  A container of arbitrary type.
519    *  @return  An instance of back_insert_iterator working on @p __x.
520    *
521    *  This wrapper function helps in creating back_insert_iterator instances.
522    *  Typing the name of the %iterator requires knowing the precise full
523    *  type of the container, which can be tedious and impedes generic
524    *  programming.  Using this function lets you take advantage of automatic
525    *  template parameter deduction, making the compiler match the correct
526    *  types for you.
527   */
528   template<typename _Container>
529     inline back_insert_iterator<_Container>
530     back_inserter(_Container& __x)
531     { return back_insert_iterator<_Container>(__x); }
532
533   /**
534    *  @brief  Turns assignment into insertion.
535    *
536    *  These are output iterators, constructed from a container-of-T.
537    *  Assigning a T to the iterator prepends it to the container using
538    *  push_front.
539    *
540    *  Tip:  Using the front_inserter function to create these iterators can
541    *  save typing.
542   */
543   template<typename _Container>
544     class front_insert_iterator
545     : public iterator<output_iterator_tag, void, void, void, void>
546     {
547     protected:
548       _Container* container;
549
550     public:
551       /// A nested typedef for the type of whatever container you used.
552       typedef _Container          container_type;
553
554       /// The only way to create this %iterator is with a container.
555       explicit front_insert_iterator(_Container& __x)
556       : container(std::__addressof(__x)) { }
557
558       /**
559        *  @param  __value  An instance of whatever type
560        *                 container_type::const_reference is; presumably a
561        *                 reference-to-const T for container<T>.
562        *  @return  This %iterator, for chained operations.
563        *
564        *  This kind of %iterator doesn't really have a @a position in the
565        *  container (you can think of the position as being permanently at
566        *  the front, if you like).  Assigning a value to the %iterator will
567        *  always prepend the value to the front of the container.
568       */
569 #if __cplusplus < 201103L
570       front_insert_iterator&
571       operator=(typename _Container::const_reference __value)
572       {
573         container->push_front(__value);
574         return *this;
575       }
576 #else
577       front_insert_iterator&
578       operator=(const typename _Container::value_type& __value)
579       {
580         container->push_front(__value);
581         return *this;
582       }
583
584       front_insert_iterator&
585       operator=(typename _Container::value_type&& __value)
586       {
587         container->push_front(std::move(__value));
588         return *this;
589       }
590 #endif
591
592       /// Simply returns *this.
593       front_insert_iterator&
594       operator*()
595       { return *this; }
596
597       /// Simply returns *this.  (This %iterator does not @a move.)
598       front_insert_iterator&
599       operator++()
600       { return *this; }
601
602       /// Simply returns *this.  (This %iterator does not @a move.)
603       front_insert_iterator
604       operator++(int)
605       { return *this; }
606     };
607
608   /**
609    *  @param  __x  A container of arbitrary type.
610    *  @return  An instance of front_insert_iterator working on @p x.
611    *
612    *  This wrapper function helps in creating front_insert_iterator instances.
613    *  Typing the name of the %iterator requires knowing the precise full
614    *  type of the container, which can be tedious and impedes generic
615    *  programming.  Using this function lets you take advantage of automatic
616    *  template parameter deduction, making the compiler match the correct
617    *  types for you.
618   */
619   template<typename _Container>
620     inline front_insert_iterator<_Container>
621     front_inserter(_Container& __x)
622     { return front_insert_iterator<_Container>(__x); }
623
624   /**
625    *  @brief  Turns assignment into insertion.
626    *
627    *  These are output iterators, constructed from a container-of-T.
628    *  Assigning a T to the iterator inserts it in the container at the
629    *  %iterator's position, rather than overwriting the value at that
630    *  position.
631    *
632    *  (Sequences will actually insert a @e copy of the value before the
633    *  %iterator's position.)
634    *
635    *  Tip:  Using the inserter function to create these iterators can
636    *  save typing.
637   */
638   template<typename _Container>
639     class insert_iterator
640     : public iterator<output_iterator_tag, void, void, void, void>
641     {
642     protected:
643       _Container* container;
644       typename _Container::iterator iter;
645
646     public:
647       /// A nested typedef for the type of whatever container you used.
648       typedef _Container          container_type;
649
650       /**
651        *  The only way to create this %iterator is with a container and an
652        *  initial position (a normal %iterator into the container).
653       */
654       insert_iterator(_Container& __x, typename _Container::iterator __i)
655       : container(std::__addressof(__x)), iter(__i) {}
656
657       /**
658        *  @param  __value  An instance of whatever type
659        *                 container_type::const_reference is; presumably a
660        *                 reference-to-const T for container<T>.
661        *  @return  This %iterator, for chained operations.
662        *
663        *  This kind of %iterator maintains its own position in the
664        *  container.  Assigning a value to the %iterator will insert the
665        *  value into the container at the place before the %iterator.
666        *
667        *  The position is maintained such that subsequent assignments will
668        *  insert values immediately after one another.  For example,
669        *  @code
670        *     // vector v contains A and Z
671        *
672        *     insert_iterator i (v, ++v.begin());
673        *     i = 1;
674        *     i = 2;
675        *     i = 3;
676        *
677        *     // vector v contains A, 1, 2, 3, and Z
678        *  @endcode
679       */
680 #if __cplusplus < 201103L
681       insert_iterator&
682       operator=(typename _Container::const_reference __value)
683       {
684         iter = container->insert(iter, __value);
685         ++iter;
686         return *this;
687       }
688 #else
689       insert_iterator&
690       operator=(const typename _Container::value_type& __value)
691       {
692         iter = container->insert(iter, __value);
693         ++iter;
694         return *this;
695       }
696
697       insert_iterator&
698       operator=(typename _Container::value_type&& __value)
699       {
700         iter = container->insert(iter, std::move(__value));
701         ++iter;
702         return *this;
703       }
704 #endif
705
706       /// Simply returns *this.
707       insert_iterator&
708       operator*()
709       { return *this; }
710
711       /// Simply returns *this.  (This %iterator does not @a move.)
712       insert_iterator&
713       operator++()
714       { return *this; }
715
716       /// Simply returns *this.  (This %iterator does not @a move.)
717       insert_iterator&
718       operator++(int)
719       { return *this; }
720     };
721
722   /**
723    *  @param __x  A container of arbitrary type.
724    *  @param __i  An iterator into the container.
725    *  @return  An instance of insert_iterator working on @p __x.
726    *
727    *  This wrapper function helps in creating insert_iterator instances.
728    *  Typing the name of the %iterator requires knowing the precise full
729    *  type of the container, which can be tedious and impedes generic
730    *  programming.  Using this function lets you take advantage of automatic
731    *  template parameter deduction, making the compiler match the correct
732    *  types for you.
733   */
734   template<typename _Container, typename _Iterator>
735     inline insert_iterator<_Container>
736     inserter(_Container& __x, _Iterator __i)
737     {
738       return insert_iterator<_Container>(__x,
739                                          typename _Container::iterator(__i));
740     }
741
742   // @} group iterators
743
744 _GLIBCXX_END_NAMESPACE_VERSION
745 } // namespace
746
747 namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
748 {
749 _GLIBCXX_BEGIN_NAMESPACE_VERSION
750
751   // This iterator adapter is @a normal in the sense that it does not
752   // change the semantics of any of the operators of its iterator
753   // parameter.  Its primary purpose is to convert an iterator that is
754   // not a class, e.g. a pointer, into an iterator that is a class.
755   // The _Container parameter exists solely so that different containers
756   // using this template can instantiate different types, even if the
757   // _Iterator parameter is the same.
758   using std::iterator_traits;
759   using std::iterator;
760   template<typename _Iterator, typename _Container>
761     class __normal_iterator
762     {
763     protected:
764       _Iterator _M_current;
765
766       typedef iterator_traits<_Iterator>                __traits_type;
767
768     public:
769       typedef _Iterator                                 iterator_type;
770       typedef typename __traits_type::iterator_category iterator_category;
771       typedef typename __traits_type::value_type        value_type;
772       typedef typename __traits_type::difference_type   difference_type;
773       typedef typename __traits_type::reference         reference;
774       typedef typename __traits_type::pointer           pointer;
775
776       _GLIBCXX_CONSTEXPR __normal_iterator() _GLIBCXX_NOEXCEPT
777       : _M_current(_Iterator()) { }
778
779       explicit
780       __normal_iterator(const _Iterator& __i) _GLIBCXX_NOEXCEPT
781       : _M_current(__i) { }
782
783       // Allow iterator to const_iterator conversion
784       template<typename _Iter>
785         __normal_iterator(const __normal_iterator<_Iter,
786                           typename __enable_if<
787                (std::__are_same<_Iter, typename _Container::pointer>::__value),
788                       _Container>::__type>& __i) _GLIBCXX_NOEXCEPT
789         : _M_current(__i.base()) { }
790
791       // Forward iterator requirements
792       reference
793       operator*() const _GLIBCXX_NOEXCEPT
794       { return *_M_current; }
795
796       pointer
797       operator->() const _GLIBCXX_NOEXCEPT
798       { return _M_current; }
799
800       __normal_iterator&
801       operator++() _GLIBCXX_NOEXCEPT
802       {
803         ++_M_current;
804         return *this;
805       }
806
807       __normal_iterator
808       operator++(int) _GLIBCXX_NOEXCEPT
809       { return __normal_iterator(_M_current++); }
810
811       // Bidirectional iterator requirements
812       __normal_iterator&
813       operator--() _GLIBCXX_NOEXCEPT
814       {
815         --_M_current;
816         return *this;
817       }
818
819       __normal_iterator
820       operator--(int) _GLIBCXX_NOEXCEPT
821       { return __normal_iterator(_M_current--); }
822
823       // Random access iterator requirements
824       reference
825       operator[](difference_type __n) const _GLIBCXX_NOEXCEPT
826       { return _M_current[__n]; }
827
828       __normal_iterator&
829       operator+=(difference_type __n) _GLIBCXX_NOEXCEPT
830       { _M_current += __n; return *this; }
831
832       __normal_iterator
833       operator+(difference_type __n) const _GLIBCXX_NOEXCEPT
834       { return __normal_iterator(_M_current + __n); }
835
836       __normal_iterator&
837       operator-=(difference_type __n) _GLIBCXX_NOEXCEPT
838       { _M_current -= __n; return *this; }
839
840       __normal_iterator
841       operator-(difference_type __n) const _GLIBCXX_NOEXCEPT
842       { return __normal_iterator(_M_current - __n); }
843
844       const _Iterator&
845       base() const _GLIBCXX_NOEXCEPT
846       { return _M_current; }
847     };
848
849   // Note: In what follows, the left- and right-hand-side iterators are
850   // allowed to vary in types (conceptually in cv-qualification) so that
851   // comparison between cv-qualified and non-cv-qualified iterators be
852   // valid.  However, the greedy and unfriendly operators in std::rel_ops
853   // will make overload resolution ambiguous (when in scope) if we don't
854   // provide overloads whose operands are of the same type.  Can someone
855   // remind me what generic programming is about? -- Gaby
856
857   // Forward iterator requirements
858   template<typename _IteratorL, typename _IteratorR, typename _Container>
859     inline bool
860     operator==(const __normal_iterator<_IteratorL, _Container>& __lhs,
861                const __normal_iterator<_IteratorR, _Container>& __rhs)
862     _GLIBCXX_NOEXCEPT
863     { return __lhs.base() == __rhs.base(); }
864
865   template<typename _Iterator, typename _Container>
866     inline bool
867     operator==(const __normal_iterator<_Iterator, _Container>& __lhs,
868                const __normal_iterator<_Iterator, _Container>& __rhs)
869     _GLIBCXX_NOEXCEPT
870     { return __lhs.base() == __rhs.base(); }
871
872   template<typename _IteratorL, typename _IteratorR, typename _Container>
873     inline bool
874     operator!=(const __normal_iterator<_IteratorL, _Container>& __lhs,
875                const __normal_iterator<_IteratorR, _Container>& __rhs)
876     _GLIBCXX_NOEXCEPT
877     { return __lhs.base() != __rhs.base(); }
878
879   template<typename _Iterator, typename _Container>
880     inline bool
881     operator!=(const __normal_iterator<_Iterator, _Container>& __lhs,
882                const __normal_iterator<_Iterator, _Container>& __rhs)
883     _GLIBCXX_NOEXCEPT
884     { return __lhs.base() != __rhs.base(); }
885
886   // Random access iterator requirements
887   template<typename _IteratorL, typename _IteratorR, typename _Container>
888     inline bool
889     operator<(const __normal_iterator<_IteratorL, _Container>& __lhs,
890               const __normal_iterator<_IteratorR, _Container>& __rhs)
891     _GLIBCXX_NOEXCEPT
892     { return __lhs.base() < __rhs.base(); }
893
894   template<typename _Iterator, typename _Container>
895     inline bool
896     operator<(const __normal_iterator<_Iterator, _Container>& __lhs,
897               const __normal_iterator<_Iterator, _Container>& __rhs)
898     _GLIBCXX_NOEXCEPT
899     { return __lhs.base() < __rhs.base(); }
900
901   template<typename _IteratorL, typename _IteratorR, typename _Container>
902     inline bool
903     operator>(const __normal_iterator<_IteratorL, _Container>& __lhs,
904               const __normal_iterator<_IteratorR, _Container>& __rhs)
905     _GLIBCXX_NOEXCEPT
906     { return __lhs.base() > __rhs.base(); }
907
908   template<typename _Iterator, typename _Container>
909     inline bool
910     operator>(const __normal_iterator<_Iterator, _Container>& __lhs,
911               const __normal_iterator<_Iterator, _Container>& __rhs)
912     _GLIBCXX_NOEXCEPT
913     { return __lhs.base() > __rhs.base(); }
914
915   template<typename _IteratorL, typename _IteratorR, typename _Container>
916     inline bool
917     operator<=(const __normal_iterator<_IteratorL, _Container>& __lhs,
918                const __normal_iterator<_IteratorR, _Container>& __rhs)
919     _GLIBCXX_NOEXCEPT
920     { return __lhs.base() <= __rhs.base(); }
921
922   template<typename _Iterator, typename _Container>
923     inline bool
924     operator<=(const __normal_iterator<_Iterator, _Container>& __lhs,
925                const __normal_iterator<_Iterator, _Container>& __rhs)
926     _GLIBCXX_NOEXCEPT
927     { return __lhs.base() <= __rhs.base(); }
928
929   template<typename _IteratorL, typename _IteratorR, typename _Container>
930     inline bool
931     operator>=(const __normal_iterator<_IteratorL, _Container>& __lhs,
932                const __normal_iterator<_IteratorR, _Container>& __rhs)
933     _GLIBCXX_NOEXCEPT
934     { return __lhs.base() >= __rhs.base(); }
935
936   template<typename _Iterator, typename _Container>
937     inline bool
938     operator>=(const __normal_iterator<_Iterator, _Container>& __lhs,
939                const __normal_iterator<_Iterator, _Container>& __rhs)
940     _GLIBCXX_NOEXCEPT
941     { return __lhs.base() >= __rhs.base(); }
942
943   // _GLIBCXX_RESOLVE_LIB_DEFECTS
944   // According to the resolution of DR179 not only the various comparison
945   // operators but also operator- must accept mixed iterator/const_iterator
946   // parameters.
947   template<typename _IteratorL, typename _IteratorR, typename _Container>
948 #if __cplusplus >= 201103L
949     // DR 685.
950     inline auto
951     operator-(const __normal_iterator<_IteratorL, _Container>& __lhs,
952               const __normal_iterator<_IteratorR, _Container>& __rhs) noexcept
953     -> decltype(__lhs.base() - __rhs.base())
954 #else
955     inline typename __normal_iterator<_IteratorL, _Container>::difference_type
956     operator-(const __normal_iterator<_IteratorL, _Container>& __lhs,
957               const __normal_iterator<_IteratorR, _Container>& __rhs)
958 #endif
959     { return __lhs.base() - __rhs.base(); }
960
961   template<typename _Iterator, typename _Container>
962     inline typename __normal_iterator<_Iterator, _Container>::difference_type
963     operator-(const __normal_iterator<_Iterator, _Container>& __lhs,
964               const __normal_iterator<_Iterator, _Container>& __rhs)
965     _GLIBCXX_NOEXCEPT
966     { return __lhs.base() - __rhs.base(); }
967
968   template<typename _Iterator, typename _Container>
969     inline __normal_iterator<_Iterator, _Container>
970     operator+(typename __normal_iterator<_Iterator, _Container>::difference_type
971               __n, const __normal_iterator<_Iterator, _Container>& __i)
972     _GLIBCXX_NOEXCEPT
973     { return __normal_iterator<_Iterator, _Container>(__i.base() + __n); }
974
975 _GLIBCXX_END_NAMESPACE_VERSION
976 } // namespace
977
978 namespace std _GLIBCXX_VISIBILITY(default)
979 {
980 _GLIBCXX_BEGIN_NAMESPACE_VERSION
981
982   template<typename _Iterator, typename _Container>
983     _Iterator
984     __niter_base(__gnu_cxx::__normal_iterator<_Iterator, _Container> __it)
985     { return __it.base(); }
986
987 #if __cplusplus >= 201103L
988
989   /**
990    * @addtogroup iterators
991    * @{
992    */
993
994   // 24.4.3  Move iterators
995   /**
996    *  Class template move_iterator is an iterator adapter with the same
997    *  behavior as the underlying iterator except that its dereference
998    *  operator implicitly converts the value returned by the underlying
999    *  iterator's dereference operator to an rvalue reference.  Some
1000    *  generic algorithms can be called with move iterators to replace
1001    *  copying with moving.
1002    */
1003   template<typename _Iterator>
1004     class move_iterator
1005     {
1006     protected:
1007       _Iterator _M_current;
1008
1009       typedef iterator_traits<_Iterator>                __traits_type;
1010       typedef typename __traits_type::reference         __base_ref;
1011
1012     public:
1013       typedef _Iterator                                 iterator_type;
1014       typedef typename __traits_type::iterator_category iterator_category;
1015       typedef typename __traits_type::value_type        value_type;
1016       typedef typename __traits_type::difference_type   difference_type;
1017       // NB: DR 680.
1018       typedef _Iterator                                 pointer;
1019       // _GLIBCXX_RESOLVE_LIB_DEFECTS
1020       // 2106. move_iterator wrapping iterators returning prvalues
1021       typedef typename conditional<is_reference<__base_ref>::value,
1022                          typename remove_reference<__base_ref>::type&&,
1023                          __base_ref>::type              reference;
1024
1025       _GLIBCXX17_CONSTEXPR
1026       move_iterator()
1027       : _M_current() { }
1028
1029       explicit _GLIBCXX17_CONSTEXPR
1030       move_iterator(iterator_type __i)
1031       : _M_current(__i) { }
1032
1033       template<typename _Iter>
1034         _GLIBCXX17_CONSTEXPR
1035         move_iterator(const move_iterator<_Iter>& __i)
1036         : _M_current(__i.base()) { }
1037
1038       _GLIBCXX17_CONSTEXPR iterator_type
1039       base() const
1040       { return _M_current; }
1041
1042       _GLIBCXX17_CONSTEXPR reference
1043       operator*() const
1044       { return static_cast<reference>(*_M_current); }
1045
1046       _GLIBCXX17_CONSTEXPR pointer
1047       operator->() const
1048       { return _M_current; }
1049
1050       _GLIBCXX17_CONSTEXPR move_iterator&
1051       operator++()
1052       {
1053         ++_M_current;
1054         return *this;
1055       }
1056
1057       _GLIBCXX17_CONSTEXPR move_iterator
1058       operator++(int)
1059       {
1060         move_iterator __tmp = *this;
1061         ++_M_current;
1062         return __tmp;
1063       }
1064
1065       _GLIBCXX17_CONSTEXPR move_iterator&
1066       operator--()
1067       {
1068         --_M_current;
1069         return *this;
1070       }
1071
1072       _GLIBCXX17_CONSTEXPR move_iterator
1073       operator--(int)
1074       {
1075         move_iterator __tmp = *this;
1076         --_M_current;
1077         return __tmp;
1078       }
1079
1080       _GLIBCXX17_CONSTEXPR move_iterator
1081       operator+(difference_type __n) const
1082       { return move_iterator(_M_current + __n); }
1083
1084       _GLIBCXX17_CONSTEXPR move_iterator&
1085       operator+=(difference_type __n)
1086       {
1087         _M_current += __n;
1088         return *this;
1089       }
1090
1091       _GLIBCXX17_CONSTEXPR move_iterator
1092       operator-(difference_type __n) const
1093       { return move_iterator(_M_current - __n); }
1094     
1095       _GLIBCXX17_CONSTEXPR move_iterator&
1096       operator-=(difference_type __n)
1097       { 
1098         _M_current -= __n;
1099         return *this;
1100       }
1101
1102       _GLIBCXX17_CONSTEXPR reference
1103       operator[](difference_type __n) const
1104       { return std::move(_M_current[__n]); }
1105     };
1106
1107   // Note: See __normal_iterator operators note from Gaby to understand
1108   // why there are always 2 versions for most of the move_iterator
1109   // operators.
1110   template<typename _IteratorL, typename _IteratorR>
1111     inline _GLIBCXX17_CONSTEXPR bool
1112     operator==(const move_iterator<_IteratorL>& __x,
1113                const move_iterator<_IteratorR>& __y)
1114     { return __x.base() == __y.base(); }
1115
1116   template<typename _Iterator>
1117     inline _GLIBCXX17_CONSTEXPR bool
1118     operator==(const move_iterator<_Iterator>& __x,
1119                const move_iterator<_Iterator>& __y)
1120     { return __x.base() == __y.base(); }
1121
1122   template<typename _IteratorL, typename _IteratorR>
1123     inline _GLIBCXX17_CONSTEXPR bool
1124     operator!=(const move_iterator<_IteratorL>& __x,
1125                const move_iterator<_IteratorR>& __y)
1126     { return !(__x == __y); }
1127
1128   template<typename _Iterator>
1129     inline _GLIBCXX17_CONSTEXPR bool
1130     operator!=(const move_iterator<_Iterator>& __x,
1131                const move_iterator<_Iterator>& __y)
1132     { return !(__x == __y); }
1133
1134   template<typename _IteratorL, typename _IteratorR>
1135     inline _GLIBCXX17_CONSTEXPR bool
1136     operator<(const move_iterator<_IteratorL>& __x,
1137               const move_iterator<_IteratorR>& __y)
1138     { return __x.base() < __y.base(); }
1139
1140   template<typename _Iterator>
1141     inline _GLIBCXX17_CONSTEXPR bool
1142     operator<(const move_iterator<_Iterator>& __x,
1143               const move_iterator<_Iterator>& __y)
1144     { return __x.base() < __y.base(); }
1145
1146   template<typename _IteratorL, typename _IteratorR>
1147     inline _GLIBCXX17_CONSTEXPR bool
1148     operator<=(const move_iterator<_IteratorL>& __x,
1149                const move_iterator<_IteratorR>& __y)
1150     { return !(__y < __x); }
1151
1152   template<typename _Iterator>
1153     inline _GLIBCXX17_CONSTEXPR bool
1154     operator<=(const move_iterator<_Iterator>& __x,
1155                const move_iterator<_Iterator>& __y)
1156     { return !(__y < __x); }
1157
1158   template<typename _IteratorL, typename _IteratorR>
1159     inline _GLIBCXX17_CONSTEXPR bool
1160     operator>(const move_iterator<_IteratorL>& __x,
1161               const move_iterator<_IteratorR>& __y)
1162     { return __y < __x; }
1163
1164   template<typename _Iterator>
1165     inline _GLIBCXX17_CONSTEXPR bool
1166     operator>(const move_iterator<_Iterator>& __x,
1167               const move_iterator<_Iterator>& __y)
1168     { return __y < __x; }
1169
1170   template<typename _IteratorL, typename _IteratorR>
1171     inline _GLIBCXX17_CONSTEXPR bool
1172     operator>=(const move_iterator<_IteratorL>& __x,
1173                const move_iterator<_IteratorR>& __y)
1174     { return !(__x < __y); }
1175
1176   template<typename _Iterator>
1177     inline _GLIBCXX17_CONSTEXPR bool
1178     operator>=(const move_iterator<_Iterator>& __x,
1179                const move_iterator<_Iterator>& __y)
1180     { return !(__x < __y); }
1181
1182   // DR 685.
1183   template<typename _IteratorL, typename _IteratorR>
1184     inline _GLIBCXX17_CONSTEXPR auto
1185     operator-(const move_iterator<_IteratorL>& __x,
1186               const move_iterator<_IteratorR>& __y)
1187     -> decltype(__x.base() - __y.base())
1188     { return __x.base() - __y.base(); }
1189
1190   template<typename _Iterator>
1191     inline _GLIBCXX17_CONSTEXPR move_iterator<_Iterator>
1192     operator+(typename move_iterator<_Iterator>::difference_type __n,
1193               const move_iterator<_Iterator>& __x)
1194     { return __x + __n; }
1195
1196   template<typename _Iterator>
1197     inline _GLIBCXX17_CONSTEXPR move_iterator<_Iterator>
1198     make_move_iterator(_Iterator __i)
1199     { return move_iterator<_Iterator>(__i); }
1200
1201   template<typename _Iterator, typename _ReturnType
1202     = typename conditional<__move_if_noexcept_cond
1203       <typename iterator_traits<_Iterator>::value_type>::value,
1204                 _Iterator, move_iterator<_Iterator>>::type>
1205     inline _GLIBCXX17_CONSTEXPR _ReturnType
1206     __make_move_if_noexcept_iterator(_Iterator __i)
1207     { return _ReturnType(__i); }
1208
1209   // Overload for pointers that matches std::move_if_noexcept more closely,
1210   // returning a constant iterator when we don't want to move.
1211   template<typename _Tp, typename _ReturnType
1212     = typename conditional<__move_if_noexcept_cond<_Tp>::value,
1213                            const _Tp*, move_iterator<_Tp*>>::type>
1214     inline _GLIBCXX17_CONSTEXPR _ReturnType
1215     __make_move_if_noexcept_iterator(_Tp* __i)
1216     { return _ReturnType(__i); }
1217
1218   // @} group iterators
1219
1220   template<typename _Iterator>
1221     auto
1222     __niter_base(move_iterator<_Iterator> __it)
1223     -> decltype(make_move_iterator(__niter_base(__it.base())))
1224     { return make_move_iterator(__niter_base(__it.base())); }
1225
1226   template<typename _Iterator>
1227     struct __is_move_iterator<move_iterator<_Iterator> >
1228     {
1229       enum { __value = 1 };
1230       typedef __true_type __type;
1231     };
1232
1233   template<typename _Iterator>
1234     auto
1235     __miter_base(move_iterator<_Iterator> __it)
1236     -> decltype(__miter_base(__it.base()))
1237     { return __miter_base(__it.base()); }
1238
1239 #define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) std::make_move_iterator(_Iter)
1240 #define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) \
1241   std::__make_move_if_noexcept_iterator(_Iter)
1242 #else
1243 #define _GLIBCXX_MAKE_MOVE_ITERATOR(_Iter) (_Iter)
1244 #define _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(_Iter) (_Iter)
1245 #endif // C++11
1246
1247 #if __cpp_deduction_guides >= 201606
1248   // These helper traits are used for deduction guides
1249   // of associative containers.
1250   template<typename _InputIterator>
1251     using __iter_key_t = remove_const_t<
1252     typename iterator_traits<_InputIterator>::value_type::first_type>;
1253
1254   template<typename _InputIterator>
1255     using __iter_val_t =
1256     typename iterator_traits<_InputIterator>::value_type::second_type;
1257
1258   template<typename _T1, typename _T2>
1259     struct pair;
1260
1261   template<typename _InputIterator>
1262     using __iter_to_alloc_t =
1263     pair<add_const_t<__iter_key_t<_InputIterator>>,
1264          __iter_val_t<_InputIterator>>;
1265
1266 #endif
1267
1268 _GLIBCXX_END_NAMESPACE_VERSION
1269 } // namespace
1270
1271 #ifdef _GLIBCXX_DEBUG
1272 # include <debug/stl_iterator.h>
1273 #endif
1274
1275 #endif