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