Import gcc-4.7.2 to new vendor branch
[dragonfly.git] / contrib / gcc-4.7 / libstdc++-v3 / include / bits / stl_vector.h
1 // Vector implementation -*- C++ -*-
2
3 // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
4 // 2011 Free Software Foundation, Inc.
5 //
6 // This file is part of the GNU ISO C++ Library.  This library is free
7 // software; you can redistribute it and/or modify it under the
8 // terms of the GNU General Public License as published by the
9 // Free Software Foundation; either version 3, or (at your option)
10 // any later version.
11
12 // This library is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 // GNU General Public License for more details.
16
17 // Under Section 7 of GPL version 3, you are granted additional
18 // permissions described in the GCC Runtime Library Exception, version
19 // 3.1, as published by the Free Software Foundation.
20
21 // You should have received a copy of the GNU General Public License and
22 // a copy of the GCC Runtime Library Exception along with this program;
23 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24 // <http://www.gnu.org/licenses/>.
25
26 /*
27  *
28  * Copyright (c) 1994
29  * Hewlett-Packard Company
30  *
31  * Permission to use, copy, modify, distribute and sell this software
32  * and its documentation for any purpose is hereby granted without fee,
33  * provided that the above copyright notice appear in all copies and
34  * that both that copyright notice and this permission notice appear
35  * in supporting documentation.  Hewlett-Packard Company makes no
36  * representations about the suitability of this software for any
37  * purpose.  It is provided "as is" without express or implied warranty.
38  *
39  *
40  * Copyright (c) 1996
41  * Silicon Graphics Computer Systems, Inc.
42  *
43  * Permission to use, copy, modify, distribute and sell this software
44  * and its documentation for any purpose is hereby granted without fee,
45  * provided that the above copyright notice appear in all copies and
46  * that both that copyright notice and this permission notice appear
47  * in supporting documentation.  Silicon Graphics makes no
48  * representations about the suitability of this  software for any
49  * purpose.  It is provided "as is" without express or implied warranty.
50  */
51
52 /** @file bits/stl_vector.h
53  *  This is an internal header file, included by other library headers.
54  *  Do not attempt to use it directly. @headername{vector}
55  */
56
57 #ifndef _STL_VECTOR_H
58 #define _STL_VECTOR_H 1
59
60 #include <bits/stl_iterator_base_funcs.h>
61 #include <bits/functexcept.h>
62 #include <bits/concept_check.h>
63 #ifdef __GXX_EXPERIMENTAL_CXX0X__
64 #include <initializer_list>
65 #endif
66
67 namespace std _GLIBCXX_VISIBILITY(default)
68 {
69 _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
70
71   /// See bits/stl_deque.h's _Deque_base for an explanation.
72   template<typename _Tp, typename _Alloc>
73     struct _Vector_base
74     {
75       typedef typename __gnu_cxx::__alloc_traits<_Alloc>::template
76         rebind<_Tp>::other _Tp_alloc_type;
77       typedef typename __gnu_cxx::__alloc_traits<_Tp_alloc_type>::pointer
78         pointer;
79
80       struct _Vector_impl 
81       : public _Tp_alloc_type
82       {
83         pointer _M_start;
84         pointer _M_finish;
85         pointer _M_end_of_storage;
86
87         _Vector_impl()
88         : _Tp_alloc_type(), _M_start(0), _M_finish(0), _M_end_of_storage(0)
89         { }
90
91         _Vector_impl(_Tp_alloc_type const& __a)
92         : _Tp_alloc_type(__a), _M_start(0), _M_finish(0), _M_end_of_storage(0)
93         { }
94
95 #ifdef __GXX_EXPERIMENTAL_CXX0X__
96         _Vector_impl(_Tp_alloc_type&& __a)
97         : _Tp_alloc_type(std::move(__a)),
98           _M_start(0), _M_finish(0), _M_end_of_storage(0)
99         { }
100 #endif
101
102         void _M_swap_data(_Vector_impl& __x)
103         {
104           std::swap(_M_start, __x._M_start);
105           std::swap(_M_finish, __x._M_finish);
106           std::swap(_M_end_of_storage, __x._M_end_of_storage);
107         }
108       };
109       
110     public:
111       typedef _Alloc allocator_type;
112
113       _Tp_alloc_type&
114       _M_get_Tp_allocator() _GLIBCXX_NOEXCEPT
115       { return *static_cast<_Tp_alloc_type*>(&this->_M_impl); }
116
117       const _Tp_alloc_type&
118       _M_get_Tp_allocator() const _GLIBCXX_NOEXCEPT
119       { return *static_cast<const _Tp_alloc_type*>(&this->_M_impl); }
120
121       allocator_type
122       get_allocator() const _GLIBCXX_NOEXCEPT
123       { return allocator_type(_M_get_Tp_allocator()); }
124
125       _Vector_base()
126       : _M_impl() { }
127
128       _Vector_base(const allocator_type& __a)
129       : _M_impl(__a) { }
130
131       _Vector_base(size_t __n)
132       : _M_impl()
133       { _M_create_storage(__n); }
134
135       _Vector_base(size_t __n, const allocator_type& __a)
136       : _M_impl(__a)
137       { _M_create_storage(__n); }
138
139 #ifdef __GXX_EXPERIMENTAL_CXX0X__
140       _Vector_base(_Tp_alloc_type&& __a)
141       : _M_impl(std::move(__a)) { }
142
143       _Vector_base(_Vector_base&& __x)
144       : _M_impl(std::move(__x._M_get_Tp_allocator()))
145       { this->_M_impl._M_swap_data(__x._M_impl); }
146
147       _Vector_base(_Vector_base&& __x, const allocator_type& __a)
148       : _M_impl(__a)
149       {
150         if (__x.get_allocator() == __a)
151           this->_M_impl._M_swap_data(__x._M_impl);
152         else
153           {
154             size_t __n = __x._M_impl._M_finish - __x._M_impl._M_start;
155             _M_create_storage(__n);
156           }
157       }
158 #endif
159
160       ~_Vector_base()
161       { _M_deallocate(this->_M_impl._M_start, this->_M_impl._M_end_of_storage
162                       - this->_M_impl._M_start); }
163
164     public:
165       _Vector_impl _M_impl;
166
167       pointer
168       _M_allocate(size_t __n)
169       { return __n != 0 ? _M_impl.allocate(__n) : 0; }
170
171       void
172       _M_deallocate(pointer __p, size_t __n)
173       {
174         if (__p)
175           _M_impl.deallocate(__p, __n);
176       }
177
178     private:
179       void
180       _M_create_storage(size_t __n)
181       {
182         this->_M_impl._M_start = this->_M_allocate(__n);
183         this->_M_impl._M_finish = this->_M_impl._M_start;
184         this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
185       }
186     };
187
188
189   /**
190    *  @brief A standard container which offers fixed time access to
191    *  individual elements in any order.
192    *
193    *  @ingroup sequences
194    *
195    *  Meets the requirements of a <a href="tables.html#65">container</a>, a
196    *  <a href="tables.html#66">reversible container</a>, and a
197    *  <a href="tables.html#67">sequence</a>, including the
198    *  <a href="tables.html#68">optional sequence requirements</a> with the
199    *  %exception of @c push_front and @c pop_front.
200    *
201    *  In some terminology a %vector can be described as a dynamic
202    *  C-style array, it offers fast and efficient access to individual
203    *  elements in any order and saves the user from worrying about
204    *  memory and size allocation.  Subscripting ( @c [] ) access is
205    *  also provided as with C-style arrays.
206   */
207   template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
208     class vector : protected _Vector_base<_Tp, _Alloc>
209     {
210       // Concept requirements.
211       typedef typename _Alloc::value_type                _Alloc_value_type;
212       __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
213       __glibcxx_class_requires2(_Tp, _Alloc_value_type, _SameTypeConcept)
214       
215       typedef _Vector_base<_Tp, _Alloc>                  _Base;
216       typedef typename _Base::_Tp_alloc_type             _Tp_alloc_type;
217       typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type>  _Alloc_traits;
218
219     public:
220       typedef _Tp                                        value_type;
221       typedef typename _Base::pointer                    pointer;
222       typedef typename _Alloc_traits::const_pointer      const_pointer;
223       typedef typename _Alloc_traits::reference          reference;
224       typedef typename _Alloc_traits::const_reference    const_reference;
225       typedef __gnu_cxx::__normal_iterator<pointer, vector> iterator;
226       typedef __gnu_cxx::__normal_iterator<const_pointer, vector>
227       const_iterator;
228       typedef std::reverse_iterator<const_iterator>  const_reverse_iterator;
229       typedef std::reverse_iterator<iterator>            reverse_iterator;
230       typedef size_t                                     size_type;
231       typedef ptrdiff_t                                  difference_type;
232       typedef _Alloc                                     allocator_type;
233
234     protected:
235       using _Base::_M_allocate;
236       using _Base::_M_deallocate;
237       using _Base::_M_impl;
238       using _Base::_M_get_Tp_allocator;
239
240     public:
241       // [23.2.4.1] construct/copy/destroy
242       // (assign() and get_allocator() are also listed in this section)
243       /**
244        *  @brief  Default constructor creates no elements.
245        */
246       vector()
247       : _Base() { }
248
249       /**
250        *  @brief  Creates a %vector with no elements.
251        *  @param  __a  An allocator object.
252        */
253       explicit
254       vector(const allocator_type& __a)
255       : _Base(__a) { }
256
257 #ifdef __GXX_EXPERIMENTAL_CXX0X__
258       /**
259        *  @brief  Creates a %vector with default constructed elements.
260        *  @param  __n  The number of elements to initially create.
261        *
262        *  This constructor fills the %vector with @a __n default
263        *  constructed elements.
264        */
265       explicit
266       vector(size_type __n)
267       : _Base(__n)
268       { _M_default_initialize(__n); }
269
270       /**
271        *  @brief  Creates a %vector with copies of an exemplar element.
272        *  @param  __n  The number of elements to initially create.
273        *  @param  __value  An element to copy.
274        *  @param  __a  An allocator.
275        *
276        *  This constructor fills the %vector with @a __n copies of @a __value.
277        */
278       vector(size_type __n, const value_type& __value,
279              const allocator_type& __a = allocator_type())
280       : _Base(__n, __a)
281       { _M_fill_initialize(__n, __value); }
282 #else
283       /**
284        *  @brief  Creates a %vector with copies of an exemplar element.
285        *  @param  __n  The number of elements to initially create.
286        *  @param  __value  An element to copy.
287        *  @param  __a  An allocator.
288        *
289        *  This constructor fills the %vector with @a __n copies of @a __value.
290        */
291       explicit
292       vector(size_type __n, const value_type& __value = value_type(),
293              const allocator_type& __a = allocator_type())
294       : _Base(__n, __a)
295       { _M_fill_initialize(__n, __value); }
296 #endif
297
298       /**
299        *  @brief  %Vector copy constructor.
300        *  @param  __x  A %vector of identical element and allocator types.
301        *
302        *  The newly-created %vector uses a copy of the allocation
303        *  object used by @a __x.  All the elements of @a __x are copied,
304        *  but any extra memory in
305        *  @a __x (for fast expansion) will not be copied.
306        */
307       vector(const vector& __x)
308       : _Base(__x.size(),
309         _Alloc_traits::_S_select_on_copy(__x._M_get_Tp_allocator()))
310       { this->_M_impl._M_finish =
311           std::__uninitialized_copy_a(__x.begin(), __x.end(),
312                                       this->_M_impl._M_start,
313                                       _M_get_Tp_allocator());
314       }
315
316 #ifdef __GXX_EXPERIMENTAL_CXX0X__
317       /**
318        *  @brief  %Vector move constructor.
319        *  @param  __x  A %vector of identical element and allocator types.
320        *
321        *  The newly-created %vector contains the exact contents of @a __x.
322        *  The contents of @a __x are a valid, but unspecified %vector.
323        */
324       vector(vector&& __x) noexcept
325       : _Base(std::move(__x)) { }
326
327       /// Copy constructor with alternative allocator
328       vector(const vector& __x, const allocator_type& __a)
329       : _Base(__x.size(), __a)
330       { this->_M_impl._M_finish =
331           std::__uninitialized_copy_a(__x.begin(), __x.end(),
332                                       this->_M_impl._M_start,
333                                       _M_get_Tp_allocator());
334       }
335
336       /// Move constructor with alternative allocator
337       vector(vector&& __rv, const allocator_type& __m)
338       : _Base(std::move(__rv), __m)
339       {
340         if (__rv.get_allocator() != __m)
341           {
342             this->_M_impl._M_finish =
343               std::__uninitialized_move_a(__rv.begin(), __rv.end(),
344                                           this->_M_impl._M_start,
345                                           _M_get_Tp_allocator());
346             __rv.clear();
347           }
348       }
349
350       /**
351        *  @brief  Builds a %vector from an initializer list.
352        *  @param  __l  An initializer_list.
353        *  @param  __a  An allocator.
354        *
355        *  Create a %vector consisting of copies of the elements in the
356        *  initializer_list @a __l.
357        *
358        *  This will call the element type's copy constructor N times
359        *  (where N is @a __l.size()) and do no memory reallocation.
360        */
361       vector(initializer_list<value_type> __l,
362              const allocator_type& __a = allocator_type())
363       : _Base(__a)
364       {
365         _M_range_initialize(__l.begin(), __l.end(),
366                             random_access_iterator_tag());
367       }
368 #endif
369
370       /**
371        *  @brief  Builds a %vector from a range.
372        *  @param  __first  An input iterator.
373        *  @param  __last  An input iterator.
374        *  @param  __a  An allocator.
375        *
376        *  Create a %vector consisting of copies of the elements from
377        *  [first,last).
378        *
379        *  If the iterators are forward, bidirectional, or
380        *  random-access, then this will call the elements' copy
381        *  constructor N times (where N is distance(first,last)) and do
382        *  no memory reallocation.  But if only input iterators are
383        *  used, then this will do at most 2N calls to the copy
384        *  constructor, and logN memory reallocations.
385        */
386       template<typename _InputIterator>
387         vector(_InputIterator __first, _InputIterator __last,
388                const allocator_type& __a = allocator_type())
389         : _Base(__a)
390         {
391           // Check whether it's an integral type.  If so, it's not an iterator.
392           typedef typename std::__is_integer<_InputIterator>::__type _Integral;
393           _M_initialize_dispatch(__first, __last, _Integral());
394         }
395
396       /**
397        *  The dtor only erases the elements, and note that if the
398        *  elements themselves are pointers, the pointed-to memory is
399        *  not touched in any way.  Managing the pointer is the user's
400        *  responsibility.
401        */
402       ~vector() _GLIBCXX_NOEXCEPT
403       { std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
404                       _M_get_Tp_allocator()); }
405
406       /**
407        *  @brief  %Vector assignment operator.
408        *  @param  __x  A %vector of identical element and allocator types.
409        *
410        *  All the elements of @a __x are copied, but any extra memory in
411        *  @a __x (for fast expansion) will not be copied.  Unlike the
412        *  copy constructor, the allocator object is not copied.
413        */
414       vector&
415       operator=(const vector& __x);
416
417 #ifdef __GXX_EXPERIMENTAL_CXX0X__
418       /**
419        *  @brief  %Vector move assignment operator.
420        *  @param  __x  A %vector of identical element and allocator types.
421        *
422        *  The contents of @a __x are moved into this %vector (without copying,
423        *  if the allocators permit it).
424        *  @a __x is a valid, but unspecified %vector.
425        */
426       vector&
427       operator=(vector&& __x) noexcept(_Alloc_traits::_S_nothrow_move())
428       {
429         constexpr bool __move_storage =
430           _Alloc_traits::_S_propagate_on_move_assign()
431           || _Alloc_traits::_S_always_equal();
432         _M_move_assign(std::move(__x),
433                        integral_constant<bool, __move_storage>());
434         return *this;
435       }
436
437       /**
438        *  @brief  %Vector list assignment operator.
439        *  @param  __l  An initializer_list.
440        *
441        *  This function fills a %vector with copies of the elements in the
442        *  initializer list @a __l.
443        *
444        *  Note that the assignment completely changes the %vector and
445        *  that the resulting %vector's size is the same as the number
446        *  of elements assigned.  Old data may be lost.
447        */
448       vector&
449       operator=(initializer_list<value_type> __l)
450       {
451         this->assign(__l.begin(), __l.end());
452         return *this;
453       }
454 #endif
455
456       /**
457        *  @brief  Assigns a given value to a %vector.
458        *  @param  __n  Number of elements to be assigned.
459        *  @param  __val  Value to be assigned.
460        *
461        *  This function fills a %vector with @a __n copies of the given
462        *  value.  Note that the assignment completely changes the
463        *  %vector and that the resulting %vector's size is the same as
464        *  the number of elements assigned.  Old data may be lost.
465        */
466       void
467       assign(size_type __n, const value_type& __val)
468       { _M_fill_assign(__n, __val); }
469
470       /**
471        *  @brief  Assigns a range to a %vector.
472        *  @param  __first  An input iterator.
473        *  @param  __last   An input iterator.
474        *
475        *  This function fills a %vector with copies of the elements in the
476        *  range [__first,__last).
477        *
478        *  Note that the assignment completely changes the %vector and
479        *  that the resulting %vector's size is the same as the number
480        *  of elements assigned.  Old data may be lost.
481        */
482       template<typename _InputIterator>
483         void
484         assign(_InputIterator __first, _InputIterator __last)
485         {
486           // Check whether it's an integral type.  If so, it's not an iterator.
487           typedef typename std::__is_integer<_InputIterator>::__type _Integral;
488           _M_assign_dispatch(__first, __last, _Integral());
489         }
490
491 #ifdef __GXX_EXPERIMENTAL_CXX0X__
492       /**
493        *  @brief  Assigns an initializer list to a %vector.
494        *  @param  __l  An initializer_list.
495        *
496        *  This function fills a %vector with copies of the elements in the
497        *  initializer list @a __l.
498        *
499        *  Note that the assignment completely changes the %vector and
500        *  that the resulting %vector's size is the same as the number
501        *  of elements assigned.  Old data may be lost.
502        */
503       void
504       assign(initializer_list<value_type> __l)
505       { this->assign(__l.begin(), __l.end()); }
506 #endif
507
508       /// Get a copy of the memory allocation object.
509       using _Base::get_allocator;
510
511       // iterators
512       /**
513        *  Returns a read/write iterator that points to the first
514        *  element in the %vector.  Iteration is done in ordinary
515        *  element order.
516        */
517       iterator
518       begin() _GLIBCXX_NOEXCEPT
519       { return iterator(this->_M_impl._M_start); }
520
521       /**
522        *  Returns a read-only (constant) iterator that points to the
523        *  first element in the %vector.  Iteration is done in ordinary
524        *  element order.
525        */
526       const_iterator
527       begin() const _GLIBCXX_NOEXCEPT
528       { return const_iterator(this->_M_impl._M_start); }
529
530       /**
531        *  Returns a read/write iterator that points one past the last
532        *  element in the %vector.  Iteration is done in ordinary
533        *  element order.
534        */
535       iterator
536       end() _GLIBCXX_NOEXCEPT
537       { return iterator(this->_M_impl._M_finish); }
538
539       /**
540        *  Returns a read-only (constant) iterator that points one past
541        *  the last element in the %vector.  Iteration is done in
542        *  ordinary element order.
543        */
544       const_iterator
545       end() const _GLIBCXX_NOEXCEPT
546       { return const_iterator(this->_M_impl._M_finish); }
547
548       /**
549        *  Returns a read/write reverse iterator that points to the
550        *  last element in the %vector.  Iteration is done in reverse
551        *  element order.
552        */
553       reverse_iterator
554       rbegin() _GLIBCXX_NOEXCEPT
555       { return reverse_iterator(end()); }
556
557       /**
558        *  Returns a read-only (constant) reverse iterator that points
559        *  to the last element in the %vector.  Iteration is done in
560        *  reverse element order.
561        */
562       const_reverse_iterator
563       rbegin() const _GLIBCXX_NOEXCEPT
564       { return const_reverse_iterator(end()); }
565
566       /**
567        *  Returns a read/write reverse iterator that points to one
568        *  before the first element in the %vector.  Iteration is done
569        *  in reverse element order.
570        */
571       reverse_iterator
572       rend() _GLIBCXX_NOEXCEPT
573       { return reverse_iterator(begin()); }
574
575       /**
576        *  Returns a read-only (constant) reverse iterator that points
577        *  to one before the first element in the %vector.  Iteration
578        *  is done in reverse element order.
579        */
580       const_reverse_iterator
581       rend() const _GLIBCXX_NOEXCEPT
582       { return const_reverse_iterator(begin()); }
583
584 #ifdef __GXX_EXPERIMENTAL_CXX0X__
585       /**
586        *  Returns a read-only (constant) iterator that points to the
587        *  first element in the %vector.  Iteration is done in ordinary
588        *  element order.
589        */
590       const_iterator
591       cbegin() const noexcept
592       { return const_iterator(this->_M_impl._M_start); }
593
594       /**
595        *  Returns a read-only (constant) iterator that points one past
596        *  the last element in the %vector.  Iteration is done in
597        *  ordinary element order.
598        */
599       const_iterator
600       cend() const noexcept
601       { return const_iterator(this->_M_impl._M_finish); }
602
603       /**
604        *  Returns a read-only (constant) reverse iterator that points
605        *  to the last element in the %vector.  Iteration is done in
606        *  reverse element order.
607        */
608       const_reverse_iterator
609       crbegin() const noexcept
610       { return const_reverse_iterator(end()); }
611
612       /**
613        *  Returns a read-only (constant) reverse iterator that points
614        *  to one before the first element in the %vector.  Iteration
615        *  is done in reverse element order.
616        */
617       const_reverse_iterator
618       crend() const noexcept
619       { return const_reverse_iterator(begin()); }
620 #endif
621
622       // [23.2.4.2] capacity
623       /**  Returns the number of elements in the %vector.  */
624       size_type
625       size() const _GLIBCXX_NOEXCEPT
626       { return size_type(this->_M_impl._M_finish - this->_M_impl._M_start); }
627
628       /**  Returns the size() of the largest possible %vector.  */
629       size_type
630       max_size() const _GLIBCXX_NOEXCEPT
631       { return _Alloc_traits::max_size(_M_get_Tp_allocator()); }
632
633 #ifdef __GXX_EXPERIMENTAL_CXX0X__
634       /**
635        *  @brief  Resizes the %vector to the specified number of elements.
636        *  @param  __new_size  Number of elements the %vector should contain.
637        *
638        *  This function will %resize the %vector to the specified
639        *  number of elements.  If the number is smaller than the
640        *  %vector's current size the %vector is truncated, otherwise
641        *  default constructed elements are appended.
642        */
643       void
644       resize(size_type __new_size)
645       {
646         if (__new_size > size())
647           _M_default_append(__new_size - size());
648         else if (__new_size < size())
649           _M_erase_at_end(this->_M_impl._M_start + __new_size);
650       }
651
652       /**
653        *  @brief  Resizes the %vector to the specified number of elements.
654        *  @param  __new_size  Number of elements the %vector should contain.
655        *  @param  __x  Data with which new elements should be populated.
656        *
657        *  This function will %resize the %vector to the specified
658        *  number of elements.  If the number is smaller than the
659        *  %vector's current size the %vector is truncated, otherwise
660        *  the %vector is extended and new elements are populated with
661        *  given data.
662        */
663       void
664       resize(size_type __new_size, const value_type& __x)
665       {
666         if (__new_size > size())
667           insert(end(), __new_size - size(), __x);
668         else if (__new_size < size())
669           _M_erase_at_end(this->_M_impl._M_start + __new_size);
670       }
671 #else
672       /**
673        *  @brief  Resizes the %vector to the specified number of elements.
674        *  @param  __new_size  Number of elements the %vector should contain.
675        *  @param  __x  Data with which new elements should be populated.
676        *
677        *  This function will %resize the %vector to the specified
678        *  number of elements.  If the number is smaller than the
679        *  %vector's current size the %vector is truncated, otherwise
680        *  the %vector is extended and new elements are populated with
681        *  given data.
682        */
683       void
684       resize(size_type __new_size, value_type __x = value_type())
685       {
686         if (__new_size > size())
687           insert(end(), __new_size - size(), __x);
688         else if (__new_size < size())
689           _M_erase_at_end(this->_M_impl._M_start + __new_size);
690       }
691 #endif
692
693 #ifdef __GXX_EXPERIMENTAL_CXX0X__
694       /**  A non-binding request to reduce capacity() to size().  */
695       void
696       shrink_to_fit()
697       { _M_shrink_to_fit(); }
698 #endif
699
700       /**
701        *  Returns the total number of elements that the %vector can
702        *  hold before needing to allocate more memory.
703        */
704       size_type
705       capacity() const _GLIBCXX_NOEXCEPT
706       { return size_type(this->_M_impl._M_end_of_storage
707                          - this->_M_impl._M_start); }
708
709       /**
710        *  Returns true if the %vector is empty.  (Thus begin() would
711        *  equal end().)
712        */
713       bool
714       empty() const _GLIBCXX_NOEXCEPT
715       { return begin() == end(); }
716
717       /**
718        *  @brief  Attempt to preallocate enough memory for specified number of
719        *          elements.
720        *  @param  __n  Number of elements required.
721        *  @throw  std::length_error  If @a n exceeds @c max_size().
722        *
723        *  This function attempts to reserve enough memory for the
724        *  %vector to hold the specified number of elements.  If the
725        *  number requested is more than max_size(), length_error is
726        *  thrown.
727        *
728        *  The advantage of this function is that if optimal code is a
729        *  necessity and the user can determine the number of elements
730        *  that will be required, the user can reserve the memory in
731        *  %advance, and thus prevent a possible reallocation of memory
732        *  and copying of %vector data.
733        */
734       void
735       reserve(size_type __n);
736
737       // element access
738       /**
739        *  @brief  Subscript access to the data contained in the %vector.
740        *  @param __n The index of the element for which data should be
741        *  accessed.
742        *  @return  Read/write reference to data.
743        *
744        *  This operator allows for easy, array-style, data access.
745        *  Note that data access with this operator is unchecked and
746        *  out_of_range lookups are not defined. (For checked lookups
747        *  see at().)
748        */
749       reference
750       operator[](size_type __n)
751       { return *(this->_M_impl._M_start + __n); }
752
753       /**
754        *  @brief  Subscript access to the data contained in the %vector.
755        *  @param __n The index of the element for which data should be
756        *  accessed.
757        *  @return  Read-only (constant) reference to data.
758        *
759        *  This operator allows for easy, array-style, data access.
760        *  Note that data access with this operator is unchecked and
761        *  out_of_range lookups are not defined. (For checked lookups
762        *  see at().)
763        */
764       const_reference
765       operator[](size_type __n) const
766       { return *(this->_M_impl._M_start + __n); }
767
768     protected:
769       /// Safety check used only from at().
770       void
771       _M_range_check(size_type __n) const
772       {
773         if (__n >= this->size())
774           __throw_out_of_range(__N("vector::_M_range_check"));
775       }
776
777     public:
778       /**
779        *  @brief  Provides access to the data contained in the %vector.
780        *  @param __n The index of the element for which data should be
781        *  accessed.
782        *  @return  Read/write reference to data.
783        *  @throw  std::out_of_range  If @a __n is an invalid index.
784        *
785        *  This function provides for safer data access.  The parameter
786        *  is first checked that it is in the range of the vector.  The
787        *  function throws out_of_range if the check fails.
788        */
789       reference
790       at(size_type __n)
791       {
792         _M_range_check(__n);
793         return (*this)[__n]; 
794       }
795
796       /**
797        *  @brief  Provides access to the data contained in the %vector.
798        *  @param __n The index of the element for which data should be
799        *  accessed.
800        *  @return  Read-only (constant) reference to data.
801        *  @throw  std::out_of_range  If @a __n is an invalid index.
802        *
803        *  This function provides for safer data access.  The parameter
804        *  is first checked that it is in the range of the vector.  The
805        *  function throws out_of_range if the check fails.
806        */
807       const_reference
808       at(size_type __n) const
809       {
810         _M_range_check(__n);
811         return (*this)[__n];
812       }
813
814       /**
815        *  Returns a read/write reference to the data at the first
816        *  element of the %vector.
817        */
818       reference
819       front()
820       { return *begin(); }
821
822       /**
823        *  Returns a read-only (constant) reference to the data at the first
824        *  element of the %vector.
825        */
826       const_reference
827       front() const
828       { return *begin(); }
829
830       /**
831        *  Returns a read/write reference to the data at the last
832        *  element of the %vector.
833        */
834       reference
835       back()
836       { return *(end() - 1); }
837       
838       /**
839        *  Returns a read-only (constant) reference to the data at the
840        *  last element of the %vector.
841        */
842       const_reference
843       back() const
844       { return *(end() - 1); }
845
846       // _GLIBCXX_RESOLVE_LIB_DEFECTS
847       // DR 464. Suggestion for new member functions in standard containers.
848       // data access
849       /**
850        *   Returns a pointer such that [data(), data() + size()) is a valid
851        *   range.  For a non-empty %vector, data() == &front().
852        */
853 #ifdef __GXX_EXPERIMENTAL_CXX0X__
854       _Tp*
855 #else
856       pointer
857 #endif
858       data() _GLIBCXX_NOEXCEPT
859       { return std::__addressof(front()); }
860
861 #ifdef __GXX_EXPERIMENTAL_CXX0X__
862       const _Tp*
863 #else
864       const_pointer
865 #endif
866       data() const _GLIBCXX_NOEXCEPT
867       { return std::__addressof(front()); }
868
869       // [23.2.4.3] modifiers
870       /**
871        *  @brief  Add data to the end of the %vector.
872        *  @param  __x  Data to be added.
873        *
874        *  This is a typical stack operation.  The function creates an
875        *  element at the end of the %vector and assigns the given data
876        *  to it.  Due to the nature of a %vector this operation can be
877        *  done in constant time if the %vector has preallocated space
878        *  available.
879        */
880       void
881       push_back(const value_type& __x)
882       {
883         if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
884           {
885             _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
886                                      __x);
887             ++this->_M_impl._M_finish;
888           }
889         else
890 #ifdef __GXX_EXPERIMENTAL_CXX0X__
891           _M_emplace_back_aux(__x);
892 #else
893           _M_insert_aux(end(), __x);
894 #endif
895       }
896
897 #ifdef __GXX_EXPERIMENTAL_CXX0X__
898       void
899       push_back(value_type&& __x)
900       { emplace_back(std::move(__x)); }
901
902       template<typename... _Args>
903         void
904         emplace_back(_Args&&... __args);
905 #endif
906
907       /**
908        *  @brief  Removes last element.
909        *
910        *  This is a typical stack operation. It shrinks the %vector by one.
911        *
912        *  Note that no data is returned, and if the last element's
913        *  data is needed, it should be retrieved before pop_back() is
914        *  called.
915        */
916       void
917       pop_back()
918       {
919         --this->_M_impl._M_finish;
920         _Alloc_traits::destroy(this->_M_impl, this->_M_impl._M_finish);
921       }
922
923 #ifdef __GXX_EXPERIMENTAL_CXX0X__
924       /**
925        *  @brief  Inserts an object in %vector before specified iterator.
926        *  @param  __position  An iterator into the %vector.
927        *  @param  __args  Arguments.
928        *  @return  An iterator that points to the inserted data.
929        *
930        *  This function will insert an object of type T constructed
931        *  with T(std::forward<Args>(args)...) before the specified location.
932        *  Note that this kind of operation could be expensive for a %vector
933        *  and if it is frequently used the user should consider using
934        *  std::list.
935        */
936       template<typename... _Args>
937         iterator
938         emplace(iterator __position, _Args&&... __args);
939 #endif
940
941       /**
942        *  @brief  Inserts given value into %vector before specified iterator.
943        *  @param  __position  An iterator into the %vector.
944        *  @param  __x  Data to be inserted.
945        *  @return  An iterator that points to the inserted data.
946        *
947        *  This function will insert a copy of the given value before
948        *  the specified location.  Note that this kind of operation
949        *  could be expensive for a %vector and if it is frequently
950        *  used the user should consider using std::list.
951        */
952       iterator
953       insert(iterator __position, const value_type& __x);
954
955 #ifdef __GXX_EXPERIMENTAL_CXX0X__
956       /**
957        *  @brief  Inserts given rvalue into %vector before specified iterator.
958        *  @param  __position  An iterator into the %vector.
959        *  @param  __x  Data to be inserted.
960        *  @return  An iterator that points to the inserted data.
961        *
962        *  This function will insert a copy of the given rvalue before
963        *  the specified location.  Note that this kind of operation
964        *  could be expensive for a %vector and if it is frequently
965        *  used the user should consider using std::list.
966        */
967       iterator
968       insert(iterator __position, value_type&& __x)
969       { return emplace(__position, std::move(__x)); }
970
971       /**
972        *  @brief  Inserts an initializer_list into the %vector.
973        *  @param  __position  An iterator into the %vector.
974        *  @param  __l  An initializer_list.
975        *
976        *  This function will insert copies of the data in the 
977        *  initializer_list @a l into the %vector before the location
978        *  specified by @a position.
979        *
980        *  Note that this kind of operation could be expensive for a
981        *  %vector and if it is frequently used the user should
982        *  consider using std::list.
983        */
984       void
985       insert(iterator __position, initializer_list<value_type> __l)
986       { this->insert(__position, __l.begin(), __l.end()); }
987 #endif
988
989       /**
990        *  @brief  Inserts a number of copies of given data into the %vector.
991        *  @param  __position  An iterator into the %vector.
992        *  @param  __n  Number of elements to be inserted.
993        *  @param  __x  Data to be inserted.
994        *
995        *  This function will insert a specified number of copies of
996        *  the given data before the location specified by @a position.
997        *
998        *  Note that this kind of operation could be expensive for a
999        *  %vector and if it is frequently used the user should
1000        *  consider using std::list.
1001        */
1002       void
1003       insert(iterator __position, size_type __n, const value_type& __x)
1004       { _M_fill_insert(__position, __n, __x); }
1005
1006       /**
1007        *  @brief  Inserts a range into the %vector.
1008        *  @param  __position  An iterator into the %vector.
1009        *  @param  __first  An input iterator.
1010        *  @param  __last   An input iterator.
1011        *
1012        *  This function will insert copies of the data in the range
1013        *  [__first,__last) into the %vector before the location specified
1014        *  by @a pos.
1015        *
1016        *  Note that this kind of operation could be expensive for a
1017        *  %vector and if it is frequently used the user should
1018        *  consider using std::list.
1019        */
1020       template<typename _InputIterator>
1021         void
1022         insert(iterator __position, _InputIterator __first,
1023                _InputIterator __last)
1024         {
1025           // Check whether it's an integral type.  If so, it's not an iterator.
1026           typedef typename std::__is_integer<_InputIterator>::__type _Integral;
1027           _M_insert_dispatch(__position, __first, __last, _Integral());
1028         }
1029
1030       /**
1031        *  @brief  Remove element at given position.
1032        *  @param  __position  Iterator pointing to element to be erased.
1033        *  @return  An iterator pointing to the next element (or end()).
1034        *
1035        *  This function will erase the element at the given position and thus
1036        *  shorten the %vector by one.
1037        *
1038        *  Note This operation could be expensive and if it is
1039        *  frequently used the user should consider using std::list.
1040        *  The user is also cautioned that this function only erases
1041        *  the element, and that if the element is itself a pointer,
1042        *  the pointed-to memory is not touched in any way.  Managing
1043        *  the pointer is the user's responsibility.
1044        */
1045       iterator
1046       erase(iterator __position);
1047
1048       /**
1049        *  @brief  Remove a range of elements.
1050        *  @param  __first  Iterator pointing to the first element to be erased.
1051        *  @param  __last  Iterator pointing to one past the last element to be
1052        *                  erased.
1053        *  @return  An iterator pointing to the element pointed to by @a __last
1054        *           prior to erasing (or end()).
1055        *
1056        *  This function will erase the elements in the range
1057        *  [__first,__last) and shorten the %vector accordingly.
1058        *
1059        *  Note This operation could be expensive and if it is
1060        *  frequently used the user should consider using std::list.
1061        *  The user is also cautioned that this function only erases
1062        *  the elements, and that if the elements themselves are
1063        *  pointers, the pointed-to memory is not touched in any way.
1064        *  Managing the pointer is the user's responsibility.
1065        */
1066       iterator
1067       erase(iterator __first, iterator __last);
1068
1069       /**
1070        *  @brief  Swaps data with another %vector.
1071        *  @param  __x  A %vector of the same element and allocator types.
1072        *
1073        *  This exchanges the elements between two vectors in constant time.
1074        *  (Three pointers, so it should be quite fast.)
1075        *  Note that the global std::swap() function is specialized such that
1076        *  std::swap(v1,v2) will feed to this function.
1077        */
1078       void
1079       swap(vector& __x)
1080 #ifdef __GXX_EXPERIMENTAL_CXX0X__
1081                         noexcept(_Alloc_traits::_S_nothrow_swap())
1082 #endif
1083       {
1084         this->_M_impl._M_swap_data(__x._M_impl);
1085         _Alloc_traits::_S_on_swap(_M_get_Tp_allocator(),
1086                                   __x._M_get_Tp_allocator());
1087       }
1088
1089       /**
1090        *  Erases all the elements.  Note that this function only erases the
1091        *  elements, and that if the elements themselves are pointers, the
1092        *  pointed-to memory is not touched in any way.  Managing the pointer is
1093        *  the user's responsibility.
1094        */
1095       void
1096       clear() _GLIBCXX_NOEXCEPT
1097       { _M_erase_at_end(this->_M_impl._M_start); }
1098
1099     protected:
1100       /**
1101        *  Memory expansion handler.  Uses the member allocation function to
1102        *  obtain @a n bytes of memory, and then copies [first,last) into it.
1103        */
1104       template<typename _ForwardIterator>
1105         pointer
1106         _M_allocate_and_copy(size_type __n,
1107                              _ForwardIterator __first, _ForwardIterator __last)
1108         {
1109           pointer __result = this->_M_allocate(__n);
1110           __try
1111             {
1112               std::__uninitialized_copy_a(__first, __last, __result,
1113                                           _M_get_Tp_allocator());
1114               return __result;
1115             }
1116           __catch(...)
1117             {
1118               _M_deallocate(__result, __n);
1119               __throw_exception_again;
1120             }
1121         }
1122
1123
1124       // Internal constructor functions follow.
1125
1126       // Called by the range constructor to implement [23.1.1]/9
1127
1128       // _GLIBCXX_RESOLVE_LIB_DEFECTS
1129       // 438. Ambiguity in the "do the right thing" clause
1130       template<typename _Integer>
1131         void
1132         _M_initialize_dispatch(_Integer __n, _Integer __value, __true_type)
1133         {
1134           this->_M_impl._M_start = _M_allocate(static_cast<size_type>(__n));
1135           this->_M_impl._M_end_of_storage =
1136             this->_M_impl._M_start + static_cast<size_type>(__n);
1137           _M_fill_initialize(static_cast<size_type>(__n), __value);
1138         }
1139
1140       // Called by the range constructor to implement [23.1.1]/9
1141       template<typename _InputIterator>
1142         void
1143         _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
1144                                __false_type)
1145         {
1146           typedef typename std::iterator_traits<_InputIterator>::
1147             iterator_category _IterCategory;
1148           _M_range_initialize(__first, __last, _IterCategory());
1149         }
1150
1151       // Called by the second initialize_dispatch above
1152       template<typename _InputIterator>
1153         void
1154         _M_range_initialize(_InputIterator __first,
1155                             _InputIterator __last, std::input_iterator_tag)
1156         {
1157           for (; __first != __last; ++__first)
1158             push_back(*__first);
1159         }
1160
1161       // Called by the second initialize_dispatch above
1162       template<typename _ForwardIterator>
1163         void
1164         _M_range_initialize(_ForwardIterator __first,
1165                             _ForwardIterator __last, std::forward_iterator_tag)
1166         {
1167           const size_type __n = std::distance(__first, __last);
1168           this->_M_impl._M_start = this->_M_allocate(__n);
1169           this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
1170           this->_M_impl._M_finish =
1171             std::__uninitialized_copy_a(__first, __last,
1172                                         this->_M_impl._M_start,
1173                                         _M_get_Tp_allocator());
1174         }
1175
1176       // Called by the first initialize_dispatch above and by the
1177       // vector(n,value,a) constructor.
1178       void
1179       _M_fill_initialize(size_type __n, const value_type& __value)
1180       {
1181         std::__uninitialized_fill_n_a(this->_M_impl._M_start, __n, __value, 
1182                                       _M_get_Tp_allocator());
1183         this->_M_impl._M_finish = this->_M_impl._M_end_of_storage;
1184       }
1185
1186 #ifdef __GXX_EXPERIMENTAL_CXX0X__
1187       // Called by the vector(n) constructor.
1188       void
1189       _M_default_initialize(size_type __n)
1190       {
1191         std::__uninitialized_default_n_a(this->_M_impl._M_start, __n, 
1192                                          _M_get_Tp_allocator());
1193         this->_M_impl._M_finish = this->_M_impl._M_end_of_storage;
1194       }
1195 #endif
1196
1197       // Internal assign functions follow.  The *_aux functions do the actual
1198       // assignment work for the range versions.
1199
1200       // Called by the range assign to implement [23.1.1]/9
1201
1202       // _GLIBCXX_RESOLVE_LIB_DEFECTS
1203       // 438. Ambiguity in the "do the right thing" clause
1204       template<typename _Integer>
1205         void
1206         _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)
1207         { _M_fill_assign(__n, __val); }
1208
1209       // Called by the range assign to implement [23.1.1]/9
1210       template<typename _InputIterator>
1211         void
1212         _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
1213                            __false_type)
1214         {
1215           typedef typename std::iterator_traits<_InputIterator>::
1216             iterator_category _IterCategory;
1217           _M_assign_aux(__first, __last, _IterCategory());
1218         }
1219
1220       // Called by the second assign_dispatch above
1221       template<typename _InputIterator>
1222         void
1223         _M_assign_aux(_InputIterator __first, _InputIterator __last,
1224                       std::input_iterator_tag);
1225
1226       // Called by the second assign_dispatch above
1227       template<typename _ForwardIterator>
1228         void
1229         _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
1230                       std::forward_iterator_tag);
1231
1232       // Called by assign(n,t), and the range assign when it turns out
1233       // to be the same thing.
1234       void
1235       _M_fill_assign(size_type __n, const value_type& __val);
1236
1237
1238       // Internal insert functions follow.
1239
1240       // Called by the range insert to implement [23.1.1]/9
1241
1242       // _GLIBCXX_RESOLVE_LIB_DEFECTS
1243       // 438. Ambiguity in the "do the right thing" clause
1244       template<typename _Integer>
1245         void
1246         _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __val,
1247                            __true_type)
1248         { _M_fill_insert(__pos, __n, __val); }
1249
1250       // Called by the range insert to implement [23.1.1]/9
1251       template<typename _InputIterator>
1252         void
1253         _M_insert_dispatch(iterator __pos, _InputIterator __first,
1254                            _InputIterator __last, __false_type)
1255         {
1256           typedef typename std::iterator_traits<_InputIterator>::
1257             iterator_category _IterCategory;
1258           _M_range_insert(__pos, __first, __last, _IterCategory());
1259         }
1260
1261       // Called by the second insert_dispatch above
1262       template<typename _InputIterator>
1263         void
1264         _M_range_insert(iterator __pos, _InputIterator __first,
1265                         _InputIterator __last, std::input_iterator_tag);
1266
1267       // Called by the second insert_dispatch above
1268       template<typename _ForwardIterator>
1269         void
1270         _M_range_insert(iterator __pos, _ForwardIterator __first,
1271                         _ForwardIterator __last, std::forward_iterator_tag);
1272
1273       // Called by insert(p,n,x), and the range insert when it turns out to be
1274       // the same thing.
1275       void
1276       _M_fill_insert(iterator __pos, size_type __n, const value_type& __x);
1277
1278 #ifdef __GXX_EXPERIMENTAL_CXX0X__
1279       // Called by resize(n).
1280       void
1281       _M_default_append(size_type __n);
1282
1283       bool
1284       _M_shrink_to_fit();
1285 #endif
1286
1287       // Called by insert(p,x)
1288 #ifndef __GXX_EXPERIMENTAL_CXX0X__
1289       void
1290       _M_insert_aux(iterator __position, const value_type& __x);
1291 #else
1292       template<typename... _Args>
1293         void
1294         _M_insert_aux(iterator __position, _Args&&... __args);
1295
1296       template<typename... _Args>
1297         void
1298         _M_emplace_back_aux(_Args&&... __args);
1299 #endif
1300
1301       // Called by the latter.
1302       size_type
1303       _M_check_len(size_type __n, const char* __s) const
1304       {
1305         if (max_size() - size() < __n)
1306           __throw_length_error(__N(__s));
1307
1308         const size_type __len = size() + std::max(size(), __n);
1309         return (__len < size() || __len > max_size()) ? max_size() : __len;
1310       }
1311
1312       // Internal erase functions follow.
1313
1314       // Called by erase(q1,q2), clear(), resize(), _M_fill_assign,
1315       // _M_assign_aux.
1316       void
1317       _M_erase_at_end(pointer __pos)
1318       {
1319         std::_Destroy(__pos, this->_M_impl._M_finish, _M_get_Tp_allocator());
1320         this->_M_impl._M_finish = __pos;
1321       }
1322
1323 #ifdef __GXX_EXPERIMENTAL_CXX0X__
1324     private:
1325       // Constant-time move assignment when source object's memory can be
1326       // moved, either because the source's allocator will move too
1327       // or because the allocators are equal.
1328       void
1329       _M_move_assign(vector&& __x, std::true_type) noexcept
1330       {
1331         const vector __tmp(std::move(*this));
1332         this->_M_impl._M_swap_data(__x._M_impl);
1333         if (_Alloc_traits::_S_propagate_on_move_assign())
1334           std::__alloc_on_move(_M_get_Tp_allocator(),
1335                                __x._M_get_Tp_allocator());
1336       }
1337
1338       // Do move assignment when it might not be possible to move source
1339       // object's memory, resulting in a linear-time operation.
1340       void
1341       _M_move_assign(vector&& __x, std::false_type)
1342       {
1343         if (__x._M_get_Tp_allocator() == this->_M_get_Tp_allocator())
1344           _M_move_assign(std::move(__x), std::true_type());
1345         else
1346           {
1347             // The rvalue's allocator cannot be moved and is not equal,
1348             // so we need to individually move each element.
1349             this->assign(std::__make_move_if_noexcept_iterator(__x.begin()),
1350                          std::__make_move_if_noexcept_iterator(__x.end()));
1351             __x.clear();
1352           }
1353       }
1354 #endif
1355     };
1356
1357
1358   /**
1359    *  @brief  Vector equality comparison.
1360    *  @param  __x  A %vector.
1361    *  @param  __y  A %vector of the same type as @a __x.
1362    *  @return  True iff the size and elements of the vectors are equal.
1363    *
1364    *  This is an equivalence relation.  It is linear in the size of the
1365    *  vectors.  Vectors are considered equivalent if their sizes are equal,
1366    *  and if corresponding elements compare equal.
1367   */
1368   template<typename _Tp, typename _Alloc>
1369     inline bool
1370     operator==(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
1371     { return (__x.size() == __y.size()
1372               && std::equal(__x.begin(), __x.end(), __y.begin())); }
1373
1374   /**
1375    *  @brief  Vector ordering relation.
1376    *  @param  __x  A %vector.
1377    *  @param  __y  A %vector of the same type as @a __x.
1378    *  @return  True iff @a __x is lexicographically less than @a __y.
1379    *
1380    *  This is a total ordering relation.  It is linear in the size of the
1381    *  vectors.  The elements must be comparable with @c <.
1382    *
1383    *  See std::lexicographical_compare() for how the determination is made.
1384   */
1385   template<typename _Tp, typename _Alloc>
1386     inline bool
1387     operator<(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
1388     { return std::lexicographical_compare(__x.begin(), __x.end(),
1389                                           __y.begin(), __y.end()); }
1390
1391   /// Based on operator==
1392   template<typename _Tp, typename _Alloc>
1393     inline bool
1394     operator!=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
1395     { return !(__x == __y); }
1396
1397   /// Based on operator<
1398   template<typename _Tp, typename _Alloc>
1399     inline bool
1400     operator>(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
1401     { return __y < __x; }
1402
1403   /// Based on operator<
1404   template<typename _Tp, typename _Alloc>
1405     inline bool
1406     operator<=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
1407     { return !(__y < __x); }
1408
1409   /// Based on operator<
1410   template<typename _Tp, typename _Alloc>
1411     inline bool
1412     operator>=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
1413     { return !(__x < __y); }
1414
1415   /// See std::vector::swap().
1416   template<typename _Tp, typename _Alloc>
1417     inline void
1418     swap(vector<_Tp, _Alloc>& __x, vector<_Tp, _Alloc>& __y)
1419     { __x.swap(__y); }
1420
1421 _GLIBCXX_END_NAMESPACE_CONTAINER
1422 } // namespace std
1423
1424 #endif /* _STL_VECTOR_H */