100db7afdSDavid E. O'Brien // Vector implementation -*- C++ -*-
200db7afdSDavid E. O'Brien 
3f8a1b7d9SAlexander Kabaev // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006
4f8a1b7d9SAlexander Kabaev // Free Software Foundation, Inc.
500db7afdSDavid E. O'Brien //
600db7afdSDavid E. O'Brien // This file is part of the GNU ISO C++ Library.  This library is free
700db7afdSDavid E. O'Brien // software; you can redistribute it and/or modify it under the
800db7afdSDavid E. O'Brien // terms of the GNU General Public License as published by the
900db7afdSDavid E. O'Brien // Free Software Foundation; either version 2, or (at your option)
1000db7afdSDavid E. O'Brien // any later version.
1100db7afdSDavid E. O'Brien 
1200db7afdSDavid E. O'Brien // This library is distributed in the hope that it will be useful,
1300db7afdSDavid E. O'Brien // but WITHOUT ANY WARRANTY; without even the implied warranty of
1400db7afdSDavid E. O'Brien // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1500db7afdSDavid E. O'Brien // GNU General Public License for more details.
1600db7afdSDavid E. O'Brien 
1700db7afdSDavid E. O'Brien // You should have received a copy of the GNU General Public License along
1800db7afdSDavid E. O'Brien // with this library; see the file COPYING.  If not, write to the Free
19f8a1b7d9SAlexander Kabaev // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
2000db7afdSDavid E. O'Brien // USA.
2100db7afdSDavid E. O'Brien 
2200db7afdSDavid E. O'Brien // As a special exception, you may use this file as part of a free software
2300db7afdSDavid E. O'Brien // library without restriction.  Specifically, if other files instantiate
2400db7afdSDavid E. O'Brien // templates or use macros or inline functions from this file, or you compile
2500db7afdSDavid E. O'Brien // this file and link it with other files to produce an executable, this
2600db7afdSDavid E. O'Brien // file does not by itself cause the resulting executable to be covered by
2700db7afdSDavid E. O'Brien // the GNU General Public License.  This exception does not however
2800db7afdSDavid E. O'Brien // invalidate any other reasons why the executable file might be covered by
2900db7afdSDavid E. O'Brien // the GNU General Public License.
3000db7afdSDavid E. O'Brien 
3100db7afdSDavid E. O'Brien /*
3200db7afdSDavid E. O'Brien  *
3300db7afdSDavid E. O'Brien  * Copyright (c) 1994
3400db7afdSDavid E. O'Brien  * Hewlett-Packard Company
3500db7afdSDavid E. O'Brien  *
3600db7afdSDavid E. O'Brien  * Permission to use, copy, modify, distribute and sell this software
3700db7afdSDavid E. O'Brien  * and its documentation for any purpose is hereby granted without fee,
3800db7afdSDavid E. O'Brien  * provided that the above copyright notice appear in all copies and
3900db7afdSDavid E. O'Brien  * that both that copyright notice and this permission notice appear
4000db7afdSDavid E. O'Brien  * in supporting documentation.  Hewlett-Packard Company makes no
4100db7afdSDavid E. O'Brien  * representations about the suitability of this software for any
4200db7afdSDavid E. O'Brien  * purpose.  It is provided "as is" without express or implied warranty.
4300db7afdSDavid E. O'Brien  *
4400db7afdSDavid E. O'Brien  *
4500db7afdSDavid E. O'Brien  * Copyright (c) 1996
4600db7afdSDavid E. O'Brien  * Silicon Graphics Computer Systems, Inc.
4700db7afdSDavid E. O'Brien  *
4800db7afdSDavid E. O'Brien  * Permission to use, copy, modify, distribute and sell this software
4900db7afdSDavid E. O'Brien  * and its documentation for any purpose is hereby granted without fee,
5000db7afdSDavid E. O'Brien  * provided that the above copyright notice appear in all copies and
5100db7afdSDavid E. O'Brien  * that both that copyright notice and this permission notice appear
5200db7afdSDavid E. O'Brien  * in supporting documentation.  Silicon Graphics makes no
5300db7afdSDavid E. O'Brien  * representations about the suitability of this  software for any
5400db7afdSDavid E. O'Brien  * purpose.  It is provided "as is" without express or implied warranty.
5500db7afdSDavid E. O'Brien  */
5600db7afdSDavid E. O'Brien 
5700db7afdSDavid E. O'Brien /** @file stl_vector.h
5800db7afdSDavid E. O'Brien  *  This is an internal header file, included by other library headers.
5900db7afdSDavid E. O'Brien  *  You should not attempt to use it directly.
6000db7afdSDavid E. O'Brien  */
6100db7afdSDavid E. O'Brien 
62ffeaf689SAlexander Kabaev #ifndef _VECTOR_H
63ffeaf689SAlexander Kabaev #define _VECTOR_H 1
6400db7afdSDavid E. O'Brien 
6500db7afdSDavid E. O'Brien #include <bits/stl_iterator_base_funcs.h>
6600db7afdSDavid E. O'Brien #include <bits/functexcept.h>
6700db7afdSDavid E. O'Brien #include <bits/concept_check.h>
6800db7afdSDavid E. O'Brien 
69f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD)
70f8a1b7d9SAlexander Kabaev 
711b86b14eSAlexander Kabaev   /**
721b86b14eSAlexander Kabaev    *  @if maint
731b86b14eSAlexander Kabaev    *  See bits/stl_deque.h's _Deque_base for an explanation.
741b86b14eSAlexander Kabaev    *  @endif
751b86b14eSAlexander Kabaev   */
761b86b14eSAlexander Kabaev   template<typename _Tp, typename _Alloc>
7700db7afdSDavid E. O'Brien     struct _Vector_base
7800db7afdSDavid E. O'Brien     {
79f8a1b7d9SAlexander Kabaev       typedef typename _Alloc::template rebind<_Tp>::other _Tp_alloc_type;
80f8a1b7d9SAlexander Kabaev 
81ffeaf689SAlexander Kabaev       struct _Vector_impl
82f8a1b7d9SAlexander Kabaev       : public _Tp_alloc_type
83f8a1b7d9SAlexander Kabaev       {
84ffeaf689SAlexander Kabaev 	_Tp*           _M_start;
85ffeaf689SAlexander Kabaev 	_Tp*           _M_finish;
86ffeaf689SAlexander Kabaev 	_Tp*           _M_end_of_storage;
87dc3fe0ffSPedro F. Giffuni 
_Vector_impl_Vector_base::_Vector_impl88dc3fe0ffSPedro F. Giffuni 	_Vector_impl()
89dc3fe0ffSPedro F. Giffuni 	: _Tp_alloc_type(), _M_start(0), _M_finish(0), _M_end_of_storage(0)
90dc3fe0ffSPedro F. Giffuni 	{ }
91dc3fe0ffSPedro F. Giffuni 
_Vector_impl_Vector_base::_Vector_impl92f8a1b7d9SAlexander Kabaev 	_Vector_impl(_Tp_alloc_type const& __a)
93f8a1b7d9SAlexander Kabaev 	: _Tp_alloc_type(__a), _M_start(0), _M_finish(0), _M_end_of_storage(0)
94ffeaf689SAlexander Kabaev 	{ }
95ffeaf689SAlexander Kabaev       };
9600db7afdSDavid E. O'Brien 
97ffeaf689SAlexander Kabaev     public:
98ffeaf689SAlexander Kabaev       typedef _Alloc allocator_type;
99ffeaf689SAlexander Kabaev 
100f8a1b7d9SAlexander Kabaev       _Tp_alloc_type&
_M_get_Tp_allocator_Vector_base101f8a1b7d9SAlexander Kabaev       _M_get_Tp_allocator()
102f8a1b7d9SAlexander Kabaev       { return *static_cast<_Tp_alloc_type*>(&this->_M_impl); }
103ffeaf689SAlexander Kabaev 
104f8a1b7d9SAlexander Kabaev       const _Tp_alloc_type&
_M_get_Tp_allocator_Vector_base105f8a1b7d9SAlexander Kabaev       _M_get_Tp_allocator() const
106f8a1b7d9SAlexander Kabaev       { return *static_cast<const _Tp_alloc_type*>(&this->_M_impl); }
107f8a1b7d9SAlexander Kabaev 
108f8a1b7d9SAlexander Kabaev       allocator_type
get_allocator_Vector_base109f8a1b7d9SAlexander Kabaev       get_allocator() const
110f8a1b7d9SAlexander Kabaev       { return allocator_type(_M_get_Tp_allocator()); }
111f8a1b7d9SAlexander Kabaev 
_Vector_base_Vector_base112dc3fe0ffSPedro F. Giffuni       _Vector_base()
113dc3fe0ffSPedro F. Giffuni       : _M_impl() { }
114dc3fe0ffSPedro F. Giffuni 
_Vector_base_Vector_base115f8a1b7d9SAlexander Kabaev       _Vector_base(const allocator_type& __a)
116f8a1b7d9SAlexander Kabaev       : _M_impl(__a)
117ffeaf689SAlexander Kabaev       { }
1181b86b14eSAlexander Kabaev 
_Vector_base_Vector_base1191b86b14eSAlexander Kabaev       _Vector_base(size_t __n, const allocator_type& __a)
120ffeaf689SAlexander Kabaev       : _M_impl(__a)
1211b86b14eSAlexander Kabaev       {
122*096464d3SPedro F. Giffuni 	  if (__n)
123*096464d3SPedro F. Giffuni 	  {
124ffeaf689SAlexander Kabaev 	    this->_M_impl._M_start = this->_M_allocate(__n);
125ffeaf689SAlexander Kabaev 	    this->_M_impl._M_finish = this->_M_impl._M_start;
126ffeaf689SAlexander Kabaev 	    this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
12700db7afdSDavid E. O'Brien 	  }
128*096464d3SPedro F. Giffuni       }
12900db7afdSDavid E. O'Brien 
~_Vector_base_Vector_base1301b86b14eSAlexander Kabaev       ~_Vector_base()
131f8a1b7d9SAlexander Kabaev       { _M_deallocate(this->_M_impl._M_start, this->_M_impl._M_end_of_storage
132f8a1b7d9SAlexander Kabaev 		      - this->_M_impl._M_start); }
133ffeaf689SAlexander Kabaev 
134ffeaf689SAlexander Kabaev     public:
135ffeaf689SAlexander Kabaev       _Vector_impl _M_impl;
136ffeaf689SAlexander Kabaev 
137ffeaf689SAlexander Kabaev       _Tp*
_M_allocate_Vector_base138f8a1b7d9SAlexander Kabaev       _M_allocate(size_t __n)
139f8a1b7d9SAlexander Kabaev       { return _M_impl.allocate(__n); }
140ffeaf689SAlexander Kabaev 
141ffeaf689SAlexander Kabaev       void
_M_deallocate_Vector_base142ffeaf689SAlexander Kabaev       _M_deallocate(_Tp* __p, size_t __n)
143f8a1b7d9SAlexander Kabaev       {
144f8a1b7d9SAlexander Kabaev 	if (__p)
145f8a1b7d9SAlexander Kabaev 	  _M_impl.deallocate(__p, __n);
146f8a1b7d9SAlexander Kabaev       }
14700db7afdSDavid E. O'Brien     };
14800db7afdSDavid E. O'Brien 
14900db7afdSDavid E. O'Brien 
15000db7afdSDavid E. O'Brien   /**
151ffeaf689SAlexander Kabaev    *  @brief A standard container which offers fixed time access to
152ffeaf689SAlexander Kabaev    *  individual elements in any order.
15300db7afdSDavid E. O'Brien    *
15400db7afdSDavid E. O'Brien    *  @ingroup Containers
15500db7afdSDavid E. O'Brien    *  @ingroup Sequences
15600db7afdSDavid E. O'Brien    *
15700db7afdSDavid E. O'Brien    *  Meets the requirements of a <a href="tables.html#65">container</a>, a
15800db7afdSDavid E. O'Brien    *  <a href="tables.html#66">reversible container</a>, and a
15900db7afdSDavid E. O'Brien    *  <a href="tables.html#67">sequence</a>, including the
16000db7afdSDavid E. O'Brien    *  <a href="tables.html#68">optional sequence requirements</a> with the
16100db7afdSDavid E. O'Brien    *  %exception of @c push_front and @c pop_front.
16200db7afdSDavid E. O'Brien    *
163ffeaf689SAlexander Kabaev    *  In some terminology a %vector can be described as a dynamic
164ffeaf689SAlexander Kabaev    *  C-style array, it offers fast and efficient access to individual
165ffeaf689SAlexander Kabaev    *  elements in any order and saves the user from worrying about
166ffeaf689SAlexander Kabaev    *  memory and size allocation.  Subscripting ( @c [] ) access is
167ffeaf689SAlexander Kabaev    *  also provided as with C-style arrays.
16800db7afdSDavid E. O'Brien   */
169f8a1b7d9SAlexander Kabaev   template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
17000db7afdSDavid E. O'Brien     class vector : protected _Vector_base<_Tp, _Alloc>
17100db7afdSDavid E. O'Brien     {
1721b86b14eSAlexander Kabaev       // Concept requirements.
173f8a1b7d9SAlexander Kabaev       typedef typename _Alloc::value_type                _Alloc_value_type;
174ffeaf689SAlexander Kabaev       __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
175f8a1b7d9SAlexander Kabaev       __glibcxx_class_requires2(_Tp, _Alloc_value_type, _SameTypeConcept)
17600db7afdSDavid E. O'Brien 
17700db7afdSDavid E. O'Brien       typedef _Vector_base<_Tp, _Alloc>			 _Base;
17800db7afdSDavid E. O'Brien       typedef vector<_Tp, _Alloc>			 vector_type;
179f8a1b7d9SAlexander Kabaev       typedef typename _Base::_Tp_alloc_type		 _Tp_alloc_type;
1801b86b14eSAlexander Kabaev 
18100db7afdSDavid E. O'Brien     public:
18200db7afdSDavid E. O'Brien       typedef _Tp					 value_type;
183f8a1b7d9SAlexander Kabaev       typedef typename _Tp_alloc_type::pointer           pointer;
184f8a1b7d9SAlexander Kabaev       typedef typename _Tp_alloc_type::const_pointer     const_pointer;
185f8a1b7d9SAlexander Kabaev       typedef typename _Tp_alloc_type::reference         reference;
186f8a1b7d9SAlexander Kabaev       typedef typename _Tp_alloc_type::const_reference   const_reference;
18700db7afdSDavid E. O'Brien       typedef __gnu_cxx::__normal_iterator<pointer, vector_type> iterator;
18800db7afdSDavid E. O'Brien       typedef __gnu_cxx::__normal_iterator<const_pointer, vector_type>
18900db7afdSDavid E. O'Brien       const_iterator;
1901b86b14eSAlexander Kabaev       typedef std::reverse_iterator<const_iterator>  const_reverse_iterator;
1911b86b14eSAlexander Kabaev       typedef std::reverse_iterator<iterator>		 reverse_iterator;
19200db7afdSDavid E. O'Brien       typedef size_t					 size_type;
19300db7afdSDavid E. O'Brien       typedef ptrdiff_t					 difference_type;
194f8a1b7d9SAlexander Kabaev       typedef _Alloc                        		 allocator_type;
19500db7afdSDavid E. O'Brien 
19600db7afdSDavid E. O'Brien     protected:
19700db7afdSDavid E. O'Brien       using _Base::_M_allocate;
19800db7afdSDavid E. O'Brien       using _Base::_M_deallocate;
199ffeaf689SAlexander Kabaev       using _Base::_M_impl;
200f8a1b7d9SAlexander Kabaev       using _Base::_M_get_Tp_allocator;
20100db7afdSDavid E. O'Brien 
20200db7afdSDavid E. O'Brien     public:
2031b86b14eSAlexander Kabaev       // [23.2.4.1] construct/copy/destroy
2041b86b14eSAlexander Kabaev       // (assign() and get_allocator() are also listed in this section)
20500db7afdSDavid E. O'Brien       /**
2061b86b14eSAlexander Kabaev        *  @brief  Default constructor creates no elements.
20700db7afdSDavid E. O'Brien        */
vector()208dc3fe0ffSPedro F. Giffuni       vector()
209dc3fe0ffSPedro F. Giffuni       : _Base() { }
210dc3fe0ffSPedro F. Giffuni 
2111b86b14eSAlexander Kabaev       explicit
vector(const allocator_type & __a)212dc3fe0ffSPedro F. Giffuni       vector(const allocator_type& __a)
213f8a1b7d9SAlexander Kabaev       : _Base(__a)
214f8a1b7d9SAlexander Kabaev       { }
21500db7afdSDavid E. O'Brien 
2161b86b14eSAlexander Kabaev       /**
2171b86b14eSAlexander Kabaev        *  @brief  Create a %vector with copies of an exemplar element.
2181b86b14eSAlexander Kabaev        *  @param  n  The number of elements to initially create.
2191b86b14eSAlexander Kabaev        *  @param  value  An element to copy.
2201b86b14eSAlexander Kabaev        *
2211b86b14eSAlexander Kabaev        *  This constructor fills the %vector with @a n copies of @a value.
2221b86b14eSAlexander Kabaev        */
223f8a1b7d9SAlexander Kabaev       explicit
224f8a1b7d9SAlexander Kabaev       vector(size_type __n, const value_type& __value = value_type(),
22500db7afdSDavid E. O'Brien 	     const allocator_type& __a = allocator_type())
_Base(__n,__a)22600db7afdSDavid E. O'Brien       : _Base(__n, __a)
227f8a1b7d9SAlexander Kabaev       {
228f8a1b7d9SAlexander Kabaev 	std::__uninitialized_fill_n_a(this->_M_impl._M_start, __n, __value,
229f8a1b7d9SAlexander Kabaev 				      _M_get_Tp_allocator());
230f8a1b7d9SAlexander Kabaev 	this->_M_impl._M_finish = this->_M_impl._M_start + __n;
231f8a1b7d9SAlexander Kabaev       }
23200db7afdSDavid E. O'Brien 
2331b86b14eSAlexander Kabaev       /**
2341b86b14eSAlexander Kabaev        *  @brief  %Vector copy constructor.
2351b86b14eSAlexander Kabaev        *  @param  x  A %vector of identical element and allocator types.
2361b86b14eSAlexander Kabaev        *
2371b86b14eSAlexander Kabaev        *  The newly-created %vector uses a copy of the allocation
2381b86b14eSAlexander Kabaev        *  object used by @a x.  All the elements of @a x are copied,
2391b86b14eSAlexander Kabaev        *  but any extra memory in
2401b86b14eSAlexander Kabaev        *  @a x (for fast expansion) will not be copied.
2411b86b14eSAlexander Kabaev        */
vector(const vector & __x)2421b86b14eSAlexander Kabaev       vector(const vector& __x)
243f8a1b7d9SAlexander Kabaev       : _Base(__x.size(), __x._M_get_Tp_allocator())
244f8a1b7d9SAlexander Kabaev       { this->_M_impl._M_finish =
245f8a1b7d9SAlexander Kabaev 	  std::__uninitialized_copy_a(__x.begin(), __x.end(),
246f8a1b7d9SAlexander Kabaev 				      this->_M_impl._M_start,
247f8a1b7d9SAlexander Kabaev 				      _M_get_Tp_allocator());
248ffeaf689SAlexander Kabaev       }
24900db7afdSDavid E. O'Brien 
2501b86b14eSAlexander Kabaev       /**
2511b86b14eSAlexander Kabaev        *  @brief  Builds a %vector from a range.
2521b86b14eSAlexander Kabaev        *  @param  first  An input iterator.
2531b86b14eSAlexander Kabaev        *  @param  last  An input iterator.
2541b86b14eSAlexander Kabaev        *
2551b86b14eSAlexander Kabaev        *  Create a %vector consisting of copies of the elements from
2561b86b14eSAlexander Kabaev        *  [first,last).
2571b86b14eSAlexander Kabaev        *
258ffeaf689SAlexander Kabaev        *  If the iterators are forward, bidirectional, or
259ffeaf689SAlexander Kabaev        *  random-access, then this will call the elements' copy
260ffeaf689SAlexander Kabaev        *  constructor N times (where N is distance(first,last)) and do
261ffeaf689SAlexander Kabaev        *  no memory reallocation.  But if only input iterators are
262ffeaf689SAlexander Kabaev        *  used, then this will do at most 2N calls to the copy
263ffeaf689SAlexander Kabaev        *  constructor, and logN memory reallocations.
2641b86b14eSAlexander Kabaev        */
2651b86b14eSAlexander Kabaev       template<typename _InputIterator>
26600db7afdSDavid E. O'Brien         vector(_InputIterator __first, _InputIterator __last,
26700db7afdSDavid E. O'Brien 	       const allocator_type& __a = allocator_type())
_Base(__a)26800db7afdSDavid E. O'Brien 	: _Base(__a)
26900db7afdSDavid E. O'Brien         {
2701b86b14eSAlexander Kabaev 	  // Check whether it's an integral type.  If so, it's not an iterator.
271f8a1b7d9SAlexander Kabaev 	  typedef typename std::__is_integer<_InputIterator>::__type _Integral;
2721b86b14eSAlexander Kabaev 	  _M_initialize_dispatch(__first, __last, _Integral());
27300db7afdSDavid E. O'Brien 	}
27400db7afdSDavid E. O'Brien 
27500db7afdSDavid E. O'Brien       /**
276ffeaf689SAlexander Kabaev        *  The dtor only erases the elements, and note that if the
277ffeaf689SAlexander Kabaev        *  elements themselves are pointers, the pointed-to memory is
278ffeaf689SAlexander Kabaev        *  not touched in any way.  Managing the pointer is the user's
279ffeaf689SAlexander Kabaev        *  responsibilty.
28000db7afdSDavid E. O'Brien        */
~vector()281f8a1b7d9SAlexander Kabaev       ~vector()
282f8a1b7d9SAlexander Kabaev       { std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
283f8a1b7d9SAlexander Kabaev 		      _M_get_Tp_allocator()); }
28400db7afdSDavid E. O'Brien 
28500db7afdSDavid E. O'Brien       /**
2861b86b14eSAlexander Kabaev        *  @brief  %Vector assignment operator.
2871b86b14eSAlexander Kabaev        *  @param  x  A %vector of identical element and allocator types.
2881b86b14eSAlexander Kabaev        *
2891b86b14eSAlexander Kabaev        *  All the elements of @a x are copied, but any extra memory in
2901b86b14eSAlexander Kabaev        *  @a x (for fast expansion) will not be copied.  Unlike the
2911b86b14eSAlexander Kabaev        *  copy constructor, the allocator object is not copied.
2921b86b14eSAlexander Kabaev        */
2931b86b14eSAlexander Kabaev       vector&
2941b86b14eSAlexander Kabaev       operator=(const vector& __x);
2951b86b14eSAlexander Kabaev 
2961b86b14eSAlexander Kabaev       /**
2971b86b14eSAlexander Kabaev        *  @brief  Assigns a given value to a %vector.
29800db7afdSDavid E. O'Brien        *  @param  n  Number of elements to be assigned.
29900db7afdSDavid E. O'Brien        *  @param  val  Value to be assigned.
30000db7afdSDavid E. O'Brien        *
3011b86b14eSAlexander Kabaev        *  This function fills a %vector with @a n copies of the given
3021b86b14eSAlexander Kabaev        *  value.  Note that the assignment completely changes the
3031b86b14eSAlexander Kabaev        *  %vector and that the resulting %vector's size is the same as
3041b86b14eSAlexander Kabaev        *  the number of elements assigned.  Old data may be lost.
30500db7afdSDavid E. O'Brien        */
3061b86b14eSAlexander Kabaev       void
assign(size_type __n,const value_type & __val)3071b86b14eSAlexander Kabaev       assign(size_type __n, const value_type& __val)
3081b86b14eSAlexander Kabaev       { _M_fill_assign(__n, __val); }
30900db7afdSDavid E. O'Brien 
3101b86b14eSAlexander Kabaev       /**
3111b86b14eSAlexander Kabaev        *  @brief  Assigns a range to a %vector.
3121b86b14eSAlexander Kabaev        *  @param  first  An input iterator.
3131b86b14eSAlexander Kabaev        *  @param  last   An input iterator.
3141b86b14eSAlexander Kabaev        *
3151b86b14eSAlexander Kabaev        *  This function fills a %vector with copies of the elements in the
3161b86b14eSAlexander Kabaev        *  range [first,last).
3171b86b14eSAlexander Kabaev        *
3181b86b14eSAlexander Kabaev        *  Note that the assignment completely changes the %vector and
3191b86b14eSAlexander Kabaev        *  that the resulting %vector's size is the same as the number
3201b86b14eSAlexander Kabaev        *  of elements assigned.  Old data may be lost.
3211b86b14eSAlexander Kabaev        */
3221b86b14eSAlexander Kabaev       template<typename _InputIterator>
32300db7afdSDavid E. O'Brien         void
assign(_InputIterator __first,_InputIterator __last)32400db7afdSDavid E. O'Brien         assign(_InputIterator __first, _InputIterator __last)
32500db7afdSDavid E. O'Brien         {
3261b86b14eSAlexander Kabaev 	  // Check whether it's an integral type.  If so, it's not an iterator.
327f8a1b7d9SAlexander Kabaev 	  typedef typename std::__is_integer<_InputIterator>::__type _Integral;
32800db7afdSDavid E. O'Brien 	  _M_assign_dispatch(__first, __last, _Integral());
32900db7afdSDavid E. O'Brien 	}
33000db7afdSDavid E. O'Brien 
3311b86b14eSAlexander Kabaev       /// Get a copy of the memory allocation object.
332ffeaf689SAlexander Kabaev       using _Base::get_allocator;
33300db7afdSDavid E. O'Brien 
3341b86b14eSAlexander Kabaev       // iterators
33500db7afdSDavid E. O'Brien       /**
336ffeaf689SAlexander Kabaev        *  Returns a read/write iterator that points to the first
337ffeaf689SAlexander Kabaev        *  element in the %vector.  Iteration is done in ordinary
338ffeaf689SAlexander Kabaev        *  element order.
33900db7afdSDavid E. O'Brien        */
34000db7afdSDavid E. O'Brien       iterator
begin()341f8a1b7d9SAlexander Kabaev       begin()
342f8a1b7d9SAlexander Kabaev       { return iterator(this->_M_impl._M_start); }
34300db7afdSDavid E. O'Brien 
34400db7afdSDavid E. O'Brien       /**
3451b86b14eSAlexander Kabaev        *  Returns a read-only (constant) iterator that points to the
3461b86b14eSAlexander Kabaev        *  first element in the %vector.  Iteration is done in ordinary
3471b86b14eSAlexander Kabaev        *  element order.
3481b86b14eSAlexander Kabaev        */
3491b86b14eSAlexander Kabaev       const_iterator
begin()350f8a1b7d9SAlexander Kabaev       begin() const
351f8a1b7d9SAlexander Kabaev       { return const_iterator(this->_M_impl._M_start); }
3521b86b14eSAlexander Kabaev 
3531b86b14eSAlexander Kabaev       /**
3541b86b14eSAlexander Kabaev        *  Returns a read/write iterator that points one past the last
3551b86b14eSAlexander Kabaev        *  element in the %vector.  Iteration is done in ordinary
3561b86b14eSAlexander Kabaev        *  element order.
35700db7afdSDavid E. O'Brien        */
35800db7afdSDavid E. O'Brien       iterator
end()359f8a1b7d9SAlexander Kabaev       end()
360f8a1b7d9SAlexander Kabaev       { return iterator(this->_M_impl._M_finish); }
36100db7afdSDavid E. O'Brien 
36200db7afdSDavid E. O'Brien       /**
363ffeaf689SAlexander Kabaev        *  Returns a read-only (constant) iterator that points one past
364ffeaf689SAlexander Kabaev        *  the last element in the %vector.  Iteration is done in
365ffeaf689SAlexander Kabaev        *  ordinary element order.
36600db7afdSDavid E. O'Brien        */
3671b86b14eSAlexander Kabaev       const_iterator
end()368f8a1b7d9SAlexander Kabaev       end() const
369f8a1b7d9SAlexander Kabaev       { return const_iterator(this->_M_impl._M_finish); }
37000db7afdSDavid E. O'Brien 
37100db7afdSDavid E. O'Brien       /**
3721b86b14eSAlexander Kabaev        *  Returns a read/write reverse iterator that points to the
3731b86b14eSAlexander Kabaev        *  last element in the %vector.  Iteration is done in reverse
3741b86b14eSAlexander Kabaev        *  element order.
37500db7afdSDavid E. O'Brien        */
3761b86b14eSAlexander Kabaev       reverse_iterator
rbegin()377f8a1b7d9SAlexander Kabaev       rbegin()
378f8a1b7d9SAlexander Kabaev       { return reverse_iterator(end()); }
37900db7afdSDavid E. O'Brien 
38000db7afdSDavid E. O'Brien       /**
3811b86b14eSAlexander Kabaev        *  Returns a read-only (constant) reverse iterator that points
3821b86b14eSAlexander Kabaev        *  to the last element in the %vector.  Iteration is done in
3831b86b14eSAlexander Kabaev        *  reverse element order.
38400db7afdSDavid E. O'Brien        */
3851b86b14eSAlexander Kabaev       const_reverse_iterator
rbegin()386f8a1b7d9SAlexander Kabaev       rbegin() const
387f8a1b7d9SAlexander Kabaev       { return const_reverse_iterator(end()); }
38800db7afdSDavid E. O'Brien 
38900db7afdSDavid E. O'Brien       /**
390ffeaf689SAlexander Kabaev        *  Returns a read/write reverse iterator that points to one
391ffeaf689SAlexander Kabaev        *  before the first element in the %vector.  Iteration is done
392ffeaf689SAlexander Kabaev        *  in reverse element order.
39300db7afdSDavid E. O'Brien        */
3941b86b14eSAlexander Kabaev       reverse_iterator
rend()395f8a1b7d9SAlexander Kabaev       rend()
396f8a1b7d9SAlexander Kabaev       { return reverse_iterator(begin()); }
39700db7afdSDavid E. O'Brien 
39800db7afdSDavid E. O'Brien       /**
3991b86b14eSAlexander Kabaev        *  Returns a read-only (constant) reverse iterator that points
4001b86b14eSAlexander Kabaev        *  to one before the first element in the %vector.  Iteration
4011b86b14eSAlexander Kabaev        *  is done in reverse element order.
4021b86b14eSAlexander Kabaev        */
4031b86b14eSAlexander Kabaev       const_reverse_iterator
rend()404f8a1b7d9SAlexander Kabaev       rend() const
405f8a1b7d9SAlexander Kabaev       { return const_reverse_iterator(begin()); }
4061b86b14eSAlexander Kabaev 
4071b86b14eSAlexander Kabaev       // [23.2.4.2] capacity
4081b86b14eSAlexander Kabaev       /**  Returns the number of elements in the %vector.  */
4091b86b14eSAlexander Kabaev       size_type
size()410f8a1b7d9SAlexander Kabaev       size() const
411f8a1b7d9SAlexander Kabaev       { return size_type(this->_M_impl._M_finish - this->_M_impl._M_start); }
4121b86b14eSAlexander Kabaev 
4131b86b14eSAlexander Kabaev       /**  Returns the size() of the largest possible %vector.  */
4141b86b14eSAlexander Kabaev       size_type
max_size()415f8a1b7d9SAlexander Kabaev       max_size() const
416f8a1b7d9SAlexander Kabaev       { return _M_get_Tp_allocator().max_size(); }
4171b86b14eSAlexander Kabaev 
4181b86b14eSAlexander Kabaev       /**
4191b86b14eSAlexander Kabaev        *  @brief  Resizes the %vector to the specified number of elements.
4201b86b14eSAlexander Kabaev        *  @param  new_size  Number of elements the %vector should contain.
42100db7afdSDavid E. O'Brien        *  @param  x  Data with which new elements should be populated.
42200db7afdSDavid E. O'Brien        *
4231b86b14eSAlexander Kabaev        *  This function will %resize the %vector to the specified
4241b86b14eSAlexander Kabaev        *  number of elements.  If the number is smaller than the
4251b86b14eSAlexander Kabaev        *  %vector's current size the %vector is truncated, otherwise
4261b86b14eSAlexander Kabaev        *  the %vector is extended and new elements are populated with
4271b86b14eSAlexander Kabaev        *  given data.
42800db7afdSDavid E. O'Brien        */
4291b86b14eSAlexander Kabaev       void
430f8a1b7d9SAlexander Kabaev       resize(size_type __new_size, value_type __x = value_type())
4311b86b14eSAlexander Kabaev       {
43200db7afdSDavid E. O'Brien 	if (__new_size < size())
433f8a1b7d9SAlexander Kabaev 	  _M_erase_at_end(this->_M_impl._M_start + __new_size);
43400db7afdSDavid E. O'Brien 	else
43500db7afdSDavid E. O'Brien 	  insert(end(), __new_size - size(), __x);
43600db7afdSDavid E. O'Brien       }
43700db7afdSDavid E. O'Brien 
43800db7afdSDavid E. O'Brien       /**
439ffeaf689SAlexander Kabaev        *  Returns the total number of elements that the %vector can
440ffeaf689SAlexander Kabaev        *  hold before needing to allocate more memory.
4411b86b14eSAlexander Kabaev        */
4421b86b14eSAlexander Kabaev       size_type
capacity()4431b86b14eSAlexander Kabaev       capacity() const
444f8a1b7d9SAlexander Kabaev       { return size_type(this->_M_impl._M_end_of_storage
445f8a1b7d9SAlexander Kabaev 			 - this->_M_impl._M_start); }
4461b86b14eSAlexander Kabaev 
4471b86b14eSAlexander Kabaev       /**
4481b86b14eSAlexander Kabaev        *  Returns true if the %vector is empty.  (Thus begin() would
4491b86b14eSAlexander Kabaev        *  equal end().)
4501b86b14eSAlexander Kabaev        */
4511b86b14eSAlexander Kabaev       bool
empty()452f8a1b7d9SAlexander Kabaev       empty() const
453f8a1b7d9SAlexander Kabaev       { return begin() == end(); }
4541b86b14eSAlexander Kabaev 
4551b86b14eSAlexander Kabaev       /**
4561b86b14eSAlexander Kabaev        *  @brief  Attempt to preallocate enough memory for specified number of
4571b86b14eSAlexander Kabaev        *          elements.
4581b86b14eSAlexander Kabaev        *  @param  n  Number of elements required.
4591b86b14eSAlexander Kabaev        *  @throw  std::length_error  If @a n exceeds @c max_size().
4601b86b14eSAlexander Kabaev        *
4611b86b14eSAlexander Kabaev        *  This function attempts to reserve enough memory for the
4621b86b14eSAlexander Kabaev        *  %vector to hold the specified number of elements.  If the
4631b86b14eSAlexander Kabaev        *  number requested is more than max_size(), length_error is
4641b86b14eSAlexander Kabaev        *  thrown.
4651b86b14eSAlexander Kabaev        *
4661b86b14eSAlexander Kabaev        *  The advantage of this function is that if optimal code is a
4671b86b14eSAlexander Kabaev        *  necessity and the user can determine the number of elements
4681b86b14eSAlexander Kabaev        *  that will be required, the user can reserve the memory in
4691b86b14eSAlexander Kabaev        *  %advance, and thus prevent a possible reallocation of memory
4701b86b14eSAlexander Kabaev        *  and copying of %vector data.
4711b86b14eSAlexander Kabaev        */
4721b86b14eSAlexander Kabaev       void
4731b86b14eSAlexander Kabaev       reserve(size_type __n);
4741b86b14eSAlexander Kabaev 
4751b86b14eSAlexander Kabaev       // element access
4761b86b14eSAlexander Kabaev       /**
4771b86b14eSAlexander Kabaev        *  @brief  Subscript access to the data contained in the %vector.
478ffeaf689SAlexander Kabaev        *  @param n The index of the element for which data should be
479ffeaf689SAlexander Kabaev        *  accessed.
4801b86b14eSAlexander Kabaev        *  @return  Read/write reference to data.
4811b86b14eSAlexander Kabaev        *
4821b86b14eSAlexander Kabaev        *  This operator allows for easy, array-style, data access.
4831b86b14eSAlexander Kabaev        *  Note that data access with this operator is unchecked and
4841b86b14eSAlexander Kabaev        *  out_of_range lookups are not defined. (For checked lookups
4851b86b14eSAlexander Kabaev        *  see at().)
4861b86b14eSAlexander Kabaev        */
4871b86b14eSAlexander Kabaev       reference
488f8a1b7d9SAlexander Kabaev       operator[](size_type __n)
489f8a1b7d9SAlexander Kabaev       { return *(this->_M_impl._M_start + __n); }
4901b86b14eSAlexander Kabaev 
4911b86b14eSAlexander Kabaev       /**
4921b86b14eSAlexander Kabaev        *  @brief  Subscript access to the data contained in the %vector.
4931b86b14eSAlexander Kabaev        *  @param n The index of the element for which data should be
4941b86b14eSAlexander Kabaev        *  accessed.
4951b86b14eSAlexander Kabaev        *  @return  Read-only (constant) reference to data.
4961b86b14eSAlexander Kabaev        *
4971b86b14eSAlexander Kabaev        *  This operator allows for easy, array-style, data access.
4981b86b14eSAlexander Kabaev        *  Note that data access with this operator is unchecked and
4991b86b14eSAlexander Kabaev        *  out_of_range lookups are not defined. (For checked lookups
5001b86b14eSAlexander Kabaev        *  see at().)
5011b86b14eSAlexander Kabaev        */
5021b86b14eSAlexander Kabaev       const_reference
503f8a1b7d9SAlexander Kabaev       operator[](size_type __n) const
504f8a1b7d9SAlexander Kabaev       { return *(this->_M_impl._M_start + __n); }
5051b86b14eSAlexander Kabaev 
5061b86b14eSAlexander Kabaev     protected:
5071b86b14eSAlexander Kabaev       /// @if maint Safety check used only from at().  @endif
5081b86b14eSAlexander Kabaev       void
_M_range_check(size_type __n)5091b86b14eSAlexander Kabaev       _M_range_check(size_type __n) const
5101b86b14eSAlexander Kabaev       {
5111b86b14eSAlexander Kabaev 	if (__n >= this->size())
512ffeaf689SAlexander Kabaev 	  __throw_out_of_range(__N("vector::_M_range_check"));
5131b86b14eSAlexander Kabaev       }
5141b86b14eSAlexander Kabaev 
5151b86b14eSAlexander Kabaev     public:
5161b86b14eSAlexander Kabaev       /**
5171b86b14eSAlexander Kabaev        *  @brief  Provides access to the data contained in the %vector.
5181b86b14eSAlexander Kabaev        *  @param n The index of the element for which data should be
5191b86b14eSAlexander Kabaev        *  accessed.
5201b86b14eSAlexander Kabaev        *  @return  Read/write reference to data.
5211b86b14eSAlexander Kabaev        *  @throw  std::out_of_range  If @a n is an invalid index.
5221b86b14eSAlexander Kabaev        *
523ffeaf689SAlexander Kabaev        *  This function provides for safer data access.  The parameter
524ffeaf689SAlexander Kabaev        *  is first checked that it is in the range of the vector.  The
525ffeaf689SAlexander Kabaev        *  function throws out_of_range if the check fails.
5261b86b14eSAlexander Kabaev        */
5271b86b14eSAlexander Kabaev       reference
at(size_type __n)528f8a1b7d9SAlexander Kabaev       at(size_type __n)
529f8a1b7d9SAlexander Kabaev       {
530f8a1b7d9SAlexander Kabaev 	_M_range_check(__n);
531f8a1b7d9SAlexander Kabaev 	return (*this)[__n];
532f8a1b7d9SAlexander Kabaev       }
5331b86b14eSAlexander Kabaev 
5341b86b14eSAlexander Kabaev       /**
5351b86b14eSAlexander Kabaev        *  @brief  Provides access to the data contained in the %vector.
5361b86b14eSAlexander Kabaev        *  @param n The index of the element for which data should be
5371b86b14eSAlexander Kabaev        *  accessed.
5381b86b14eSAlexander Kabaev        *  @return  Read-only (constant) reference to data.
5391b86b14eSAlexander Kabaev        *  @throw  std::out_of_range  If @a n is an invalid index.
5401b86b14eSAlexander Kabaev        *
5411b86b14eSAlexander Kabaev        *  This function provides for safer data access.  The parameter
5421b86b14eSAlexander Kabaev        *  is first checked that it is in the range of the vector.  The
5431b86b14eSAlexander Kabaev        *  function throws out_of_range if the check fails.
5441b86b14eSAlexander Kabaev        */
5451b86b14eSAlexander Kabaev       const_reference
at(size_type __n)546f8a1b7d9SAlexander Kabaev       at(size_type __n) const
547f8a1b7d9SAlexander Kabaev       {
548f8a1b7d9SAlexander Kabaev 	_M_range_check(__n);
549f8a1b7d9SAlexander Kabaev 	return (*this)[__n];
550f8a1b7d9SAlexander Kabaev       }
5511b86b14eSAlexander Kabaev 
5521b86b14eSAlexander Kabaev       /**
5531b86b14eSAlexander Kabaev        *  Returns a read/write reference to the data at the first
5541b86b14eSAlexander Kabaev        *  element of the %vector.
5551b86b14eSAlexander Kabaev        */
5561b86b14eSAlexander Kabaev       reference
front()557f8a1b7d9SAlexander Kabaev       front()
558f8a1b7d9SAlexander Kabaev       { return *begin(); }
5591b86b14eSAlexander Kabaev 
5601b86b14eSAlexander Kabaev       /**
5611b86b14eSAlexander Kabaev        *  Returns a read-only (constant) reference to the data at the first
5621b86b14eSAlexander Kabaev        *  element of the %vector.
5631b86b14eSAlexander Kabaev        */
5641b86b14eSAlexander Kabaev       const_reference
front()565f8a1b7d9SAlexander Kabaev       front() const
566f8a1b7d9SAlexander Kabaev       { return *begin(); }
5671b86b14eSAlexander Kabaev 
5681b86b14eSAlexander Kabaev       /**
569ffeaf689SAlexander Kabaev        *  Returns a read/write reference to the data at the last
570ffeaf689SAlexander Kabaev        *  element of the %vector.
5711b86b14eSAlexander Kabaev        */
5721b86b14eSAlexander Kabaev       reference
back()573f8a1b7d9SAlexander Kabaev       back()
574f8a1b7d9SAlexander Kabaev       { return *(end() - 1); }
5751b86b14eSAlexander Kabaev 
5761b86b14eSAlexander Kabaev       /**
577ffeaf689SAlexander Kabaev        *  Returns a read-only (constant) reference to the data at the
578ffeaf689SAlexander Kabaev        *  last element of the %vector.
5791b86b14eSAlexander Kabaev        */
5801b86b14eSAlexander Kabaev       const_reference
back()581f8a1b7d9SAlexander Kabaev       back() const
582f8a1b7d9SAlexander Kabaev       { return *(end() - 1); }
583f8a1b7d9SAlexander Kabaev 
584f8a1b7d9SAlexander Kabaev       // _GLIBCXX_RESOLVE_LIB_DEFECTS
585f8a1b7d9SAlexander Kabaev       // DR 464. Suggestion for new member functions in standard containers.
586f8a1b7d9SAlexander Kabaev       // data access
587f8a1b7d9SAlexander Kabaev       /**
588f8a1b7d9SAlexander Kabaev        *   Returns a pointer such that [data(), data() + size()) is a valid
589f8a1b7d9SAlexander Kabaev        *   range.  For a non-empty %vector, data() == &front().
590f8a1b7d9SAlexander Kabaev        */
591f8a1b7d9SAlexander Kabaev       pointer
data()592f8a1b7d9SAlexander Kabaev       data()
593f8a1b7d9SAlexander Kabaev       { return pointer(this->_M_impl._M_start); }
594f8a1b7d9SAlexander Kabaev 
595f8a1b7d9SAlexander Kabaev       const_pointer
data()596f8a1b7d9SAlexander Kabaev       data() const
597f8a1b7d9SAlexander Kabaev       { return const_pointer(this->_M_impl._M_start); }
5981b86b14eSAlexander Kabaev 
5991b86b14eSAlexander Kabaev       // [23.2.4.3] modifiers
6001b86b14eSAlexander Kabaev       /**
6011b86b14eSAlexander Kabaev        *  @brief  Add data to the end of the %vector.
6021b86b14eSAlexander Kabaev        *  @param  x  Data to be added.
6031b86b14eSAlexander Kabaev        *
6041b86b14eSAlexander Kabaev        *  This is a typical stack operation.  The function creates an
6051b86b14eSAlexander Kabaev        *  element at the end of the %vector and assigns the given data
6061b86b14eSAlexander Kabaev        *  to it.  Due to the nature of a %vector this operation can be
6071b86b14eSAlexander Kabaev        *  done in constant time if the %vector has preallocated space
6081b86b14eSAlexander Kabaev        *  available.
6091b86b14eSAlexander Kabaev        */
6101b86b14eSAlexander Kabaev       void
push_back(const value_type & __x)6111b86b14eSAlexander Kabaev       push_back(const value_type& __x)
6121b86b14eSAlexander Kabaev       {
613ffeaf689SAlexander Kabaev 	if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
6141b86b14eSAlexander Kabaev 	  {
615f8a1b7d9SAlexander Kabaev 	    this->_M_impl.construct(this->_M_impl._M_finish, __x);
616ffeaf689SAlexander Kabaev 	    ++this->_M_impl._M_finish;
6171b86b14eSAlexander Kabaev 	  }
6181b86b14eSAlexander Kabaev 	else
6191b86b14eSAlexander Kabaev 	  _M_insert_aux(end(), __x);
6201b86b14eSAlexander Kabaev       }
6211b86b14eSAlexander Kabaev 
6221b86b14eSAlexander Kabaev       /**
6231b86b14eSAlexander Kabaev        *  @brief  Removes last element.
6241b86b14eSAlexander Kabaev        *
6251b86b14eSAlexander Kabaev        *  This is a typical stack operation. It shrinks the %vector by one.
6261b86b14eSAlexander Kabaev        *
627ffeaf689SAlexander Kabaev        *  Note that no data is returned, and if the last element's
628ffeaf689SAlexander Kabaev        *  data is needed, it should be retrieved before pop_back() is
629ffeaf689SAlexander Kabaev        *  called.
6301b86b14eSAlexander Kabaev        */
6311b86b14eSAlexander Kabaev       void
pop_back()6321b86b14eSAlexander Kabaev       pop_back()
6331b86b14eSAlexander Kabaev       {
634ffeaf689SAlexander Kabaev 	--this->_M_impl._M_finish;
635f8a1b7d9SAlexander Kabaev 	this->_M_impl.destroy(this->_M_impl._M_finish);
6361b86b14eSAlexander Kabaev       }
6371b86b14eSAlexander Kabaev 
6381b86b14eSAlexander Kabaev       /**
6391b86b14eSAlexander Kabaev        *  @brief  Inserts given value into %vector before specified iterator.
6401b86b14eSAlexander Kabaev        *  @param  position  An iterator into the %vector.
6411b86b14eSAlexander Kabaev        *  @param  x  Data to be inserted.
6421b86b14eSAlexander Kabaev        *  @return  An iterator that points to the inserted data.
6431b86b14eSAlexander Kabaev        *
6441b86b14eSAlexander Kabaev        *  This function will insert a copy of the given value before
6451b86b14eSAlexander Kabaev        *  the specified location.  Note that this kind of operation
6461b86b14eSAlexander Kabaev        *  could be expensive for a %vector and if it is frequently
6471b86b14eSAlexander Kabaev        *  used the user should consider using std::list.
6481b86b14eSAlexander Kabaev        */
6491b86b14eSAlexander Kabaev       iterator
6501b86b14eSAlexander Kabaev       insert(iterator __position, const value_type& __x);
6511b86b14eSAlexander Kabaev 
6521b86b14eSAlexander Kabaev       /**
6531b86b14eSAlexander Kabaev        *  @brief  Inserts a number of copies of given data into the %vector.
6541b86b14eSAlexander Kabaev        *  @param  position  An iterator into the %vector.
6551b86b14eSAlexander Kabaev        *  @param  n  Number of elements to be inserted.
6561b86b14eSAlexander Kabaev        *  @param  x  Data to be inserted.
6571b86b14eSAlexander Kabaev        *
6581b86b14eSAlexander Kabaev        *  This function will insert a specified number of copies of
6591b86b14eSAlexander Kabaev        *  the given data before the location specified by @a position.
6601b86b14eSAlexander Kabaev        *
6611b86b14eSAlexander Kabaev        *  Note that this kind of operation could be expensive for a
6621b86b14eSAlexander Kabaev        *  %vector and if it is frequently used the user should
6631b86b14eSAlexander Kabaev        *  consider using std::list.
6641b86b14eSAlexander Kabaev        */
6651b86b14eSAlexander Kabaev       void
insert(iterator __position,size_type __n,const value_type & __x)666ffeaf689SAlexander Kabaev       insert(iterator __position, size_type __n, const value_type& __x)
667ffeaf689SAlexander Kabaev       { _M_fill_insert(__position, __n, __x); }
6681b86b14eSAlexander Kabaev 
6691b86b14eSAlexander Kabaev       /**
6701b86b14eSAlexander Kabaev        *  @brief  Inserts a range into the %vector.
671ffeaf689SAlexander Kabaev        *  @param  position  An iterator into the %vector.
6721b86b14eSAlexander Kabaev        *  @param  first  An input iterator.
6731b86b14eSAlexander Kabaev        *  @param  last   An input iterator.
6741b86b14eSAlexander Kabaev        *
6751b86b14eSAlexander Kabaev        *  This function will insert copies of the data in the range
6761b86b14eSAlexander Kabaev        *  [first,last) into the %vector before the location specified
6771b86b14eSAlexander Kabaev        *  by @a pos.
6781b86b14eSAlexander Kabaev        *
6791b86b14eSAlexander Kabaev        *  Note that this kind of operation could be expensive for a
6801b86b14eSAlexander Kabaev        *  %vector and if it is frequently used the user should
6811b86b14eSAlexander Kabaev        *  consider using std::list.
6821b86b14eSAlexander Kabaev        */
6831b86b14eSAlexander Kabaev       template<typename _InputIterator>
6841b86b14eSAlexander Kabaev         void
insert(iterator __position,_InputIterator __first,_InputIterator __last)685ffeaf689SAlexander Kabaev         insert(iterator __position, _InputIterator __first,
686ffeaf689SAlexander Kabaev 	       _InputIterator __last)
6871b86b14eSAlexander Kabaev         {
6881b86b14eSAlexander Kabaev 	  // Check whether it's an integral type.  If so, it's not an iterator.
689f8a1b7d9SAlexander Kabaev 	  typedef typename std::__is_integer<_InputIterator>::__type _Integral;
690ffeaf689SAlexander Kabaev 	  _M_insert_dispatch(__position, __first, __last, _Integral());
6911b86b14eSAlexander Kabaev 	}
6921b86b14eSAlexander Kabaev 
6931b86b14eSAlexander Kabaev       /**
6941b86b14eSAlexander Kabaev        *  @brief  Remove element at given position.
6951b86b14eSAlexander Kabaev        *  @param  position  Iterator pointing to element to be erased.
6961b86b14eSAlexander Kabaev        *  @return  An iterator pointing to the next element (or end()).
6971b86b14eSAlexander Kabaev        *
6981b86b14eSAlexander Kabaev        *  This function will erase the element at the given position and thus
6991b86b14eSAlexander Kabaev        *  shorten the %vector by one.
7001b86b14eSAlexander Kabaev        *
7011b86b14eSAlexander Kabaev        *  Note This operation could be expensive and if it is
7021b86b14eSAlexander Kabaev        *  frequently used the user should consider using std::list.
7031b86b14eSAlexander Kabaev        *  The user is also cautioned that this function only erases
7041b86b14eSAlexander Kabaev        *  the element, and that if the element is itself a pointer,
7051b86b14eSAlexander Kabaev        *  the pointed-to memory is not touched in any way.  Managing
7061b86b14eSAlexander Kabaev        *  the pointer is the user's responsibilty.
7071b86b14eSAlexander Kabaev        */
7081b86b14eSAlexander Kabaev       iterator
7091b86b14eSAlexander Kabaev       erase(iterator __position);
7101b86b14eSAlexander Kabaev 
7111b86b14eSAlexander Kabaev       /**
7121b86b14eSAlexander Kabaev        *  @brief  Remove a range of elements.
7131b86b14eSAlexander Kabaev        *  @param  first  Iterator pointing to the first element to be erased.
7141b86b14eSAlexander Kabaev        *  @param  last  Iterator pointing to one past the last element to be
7151b86b14eSAlexander Kabaev        *                erased.
7161b86b14eSAlexander Kabaev        *  @return  An iterator pointing to the element pointed to by @a last
7171b86b14eSAlexander Kabaev        *           prior to erasing (or end()).
7181b86b14eSAlexander Kabaev        *
7191b86b14eSAlexander Kabaev        *  This function will erase the elements in the range [first,last) and
7201b86b14eSAlexander Kabaev        *  shorten the %vector accordingly.
7211b86b14eSAlexander Kabaev        *
7221b86b14eSAlexander Kabaev        *  Note This operation could be expensive and if it is
7231b86b14eSAlexander Kabaev        *  frequently used the user should consider using std::list.
7241b86b14eSAlexander Kabaev        *  The user is also cautioned that this function only erases
7251b86b14eSAlexander Kabaev        *  the elements, and that if the elements themselves are
7261b86b14eSAlexander Kabaev        *  pointers, the pointed-to memory is not touched in any way.
7271b86b14eSAlexander Kabaev        *  Managing the pointer is the user's responsibilty.
7281b86b14eSAlexander Kabaev        */
7291b86b14eSAlexander Kabaev       iterator
7301b86b14eSAlexander Kabaev       erase(iterator __first, iterator __last);
7311b86b14eSAlexander Kabaev 
7321b86b14eSAlexander Kabaev       /**
7331b86b14eSAlexander Kabaev        *  @brief  Swaps data with another %vector.
7341b86b14eSAlexander Kabaev        *  @param  x  A %vector of the same element and allocator types.
7351b86b14eSAlexander Kabaev        *
7361b86b14eSAlexander Kabaev        *  This exchanges the elements between two vectors in constant time.
7371b86b14eSAlexander Kabaev        *  (Three pointers, so it should be quite fast.)
7381b86b14eSAlexander Kabaev        *  Note that the global std::swap() function is specialized such that
7391b86b14eSAlexander Kabaev        *  std::swap(v1,v2) will feed to this function.
7401b86b14eSAlexander Kabaev        */
7411b86b14eSAlexander Kabaev       void
swap(vector & __x)7421b86b14eSAlexander Kabaev       swap(vector& __x)
7431b86b14eSAlexander Kabaev       {
744ffeaf689SAlexander Kabaev 	std::swap(this->_M_impl._M_start, __x._M_impl._M_start);
745ffeaf689SAlexander Kabaev 	std::swap(this->_M_impl._M_finish, __x._M_impl._M_finish);
746f8a1b7d9SAlexander Kabaev 	std::swap(this->_M_impl._M_end_of_storage,
747f8a1b7d9SAlexander Kabaev 		  __x._M_impl._M_end_of_storage);
748f8a1b7d9SAlexander Kabaev 
749f8a1b7d9SAlexander Kabaev 	// _GLIBCXX_RESOLVE_LIB_DEFECTS
750f8a1b7d9SAlexander Kabaev 	// 431. Swapping containers with unequal allocators.
751f8a1b7d9SAlexander Kabaev 	std::__alloc_swap<_Tp_alloc_type>::_S_do_it(_M_get_Tp_allocator(),
752f8a1b7d9SAlexander Kabaev 						    __x._M_get_Tp_allocator());
7531b86b14eSAlexander Kabaev       }
7541b86b14eSAlexander Kabaev 
7551b86b14eSAlexander Kabaev       /**
7561b86b14eSAlexander Kabaev        *  Erases all the elements.  Note that this function only erases the
75700db7afdSDavid E. O'Brien        *  elements, and that if the elements themselves are pointers, the
75800db7afdSDavid E. O'Brien        *  pointed-to memory is not touched in any way.  Managing the pointer is
75900db7afdSDavid E. O'Brien        *  the user's responsibilty.
76000db7afdSDavid E. O'Brien        */
7611b86b14eSAlexander Kabaev       void
clear()762f8a1b7d9SAlexander Kabaev       clear()
763f8a1b7d9SAlexander Kabaev       { _M_erase_at_end(this->_M_impl._M_start); }
76400db7afdSDavid E. O'Brien 
76500db7afdSDavid E. O'Brien     protected:
7661b86b14eSAlexander Kabaev       /**
7671b86b14eSAlexander Kabaev        *  @if maint
7681b86b14eSAlexander Kabaev        *  Memory expansion handler.  Uses the member allocation function to
7691b86b14eSAlexander Kabaev        *  obtain @a n bytes of memory, and then copies [first,last) into it.
7701b86b14eSAlexander Kabaev        *  @endif
7711b86b14eSAlexander Kabaev        */
7721b86b14eSAlexander Kabaev       template<typename _ForwardIterator>
7731b86b14eSAlexander Kabaev         pointer
_M_allocate_and_copy(size_type __n,_ForwardIterator __first,_ForwardIterator __last)7741b86b14eSAlexander Kabaev         _M_allocate_and_copy(size_type __n,
7751b86b14eSAlexander Kabaev 			     _ForwardIterator __first, _ForwardIterator __last)
77600db7afdSDavid E. O'Brien         {
777ffeaf689SAlexander Kabaev 	  pointer __result = this->_M_allocate(__n);
7781b86b14eSAlexander Kabaev 	  try
7791b86b14eSAlexander Kabaev 	    {
780f8a1b7d9SAlexander Kabaev 	      std::__uninitialized_copy_a(__first, __last, __result,
781f8a1b7d9SAlexander Kabaev 					  _M_get_Tp_allocator());
78200db7afdSDavid E. O'Brien 	      return __result;
78300db7afdSDavid E. O'Brien 	    }
78400db7afdSDavid E. O'Brien 	  catch(...)
78500db7afdSDavid E. O'Brien 	    {
78600db7afdSDavid E. O'Brien 	      _M_deallocate(__result, __n);
78700db7afdSDavid E. O'Brien 	      __throw_exception_again;
78800db7afdSDavid E. O'Brien 	    }
78900db7afdSDavid E. O'Brien 	}
79000db7afdSDavid E. O'Brien 
7911b86b14eSAlexander Kabaev 
7921b86b14eSAlexander Kabaev       // Internal constructor functions follow.
7931b86b14eSAlexander Kabaev 
7941b86b14eSAlexander Kabaev       // Called by the range constructor to implement [23.1.1]/9
7951b86b14eSAlexander Kabaev       template<typename _Integer>
7961b86b14eSAlexander Kabaev         void
_M_initialize_dispatch(_Integer __n,_Integer __value,__true_type)7971b86b14eSAlexander Kabaev         _M_initialize_dispatch(_Integer __n, _Integer __value, __true_type)
7981b86b14eSAlexander Kabaev         {
799ffeaf689SAlexander Kabaev 	  this->_M_impl._M_start = _M_allocate(__n);
800ffeaf689SAlexander Kabaev 	  this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
801f8a1b7d9SAlexander Kabaev 	  std::__uninitialized_fill_n_a(this->_M_impl._M_start, __n, __value,
802f8a1b7d9SAlexander Kabaev 					_M_get_Tp_allocator());
803f8a1b7d9SAlexander Kabaev 	  this->_M_impl._M_finish = this->_M_impl._M_end_of_storage;
8041b86b14eSAlexander Kabaev 	}
8051b86b14eSAlexander Kabaev 
8061b86b14eSAlexander Kabaev       // Called by the range constructor to implement [23.1.1]/9
807ffeaf689SAlexander Kabaev       template<typename _InputIterator>
8081b86b14eSAlexander Kabaev         void
_M_initialize_dispatch(_InputIterator __first,_InputIterator __last,__false_type)809ffeaf689SAlexander Kabaev         _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
8101b86b14eSAlexander Kabaev 			       __false_type)
8111b86b14eSAlexander Kabaev         {
812f8a1b7d9SAlexander Kabaev 	  typedef typename std::iterator_traits<_InputIterator>::
813f8a1b7d9SAlexander Kabaev 	    iterator_category _IterCategory;
8141b86b14eSAlexander Kabaev 	  _M_range_initialize(__first, __last, _IterCategory());
8151b86b14eSAlexander Kabaev 	}
8161b86b14eSAlexander Kabaev 
8171b86b14eSAlexander Kabaev       // Called by the second initialize_dispatch above
8181b86b14eSAlexander Kabaev       template<typename _InputIterator>
8191b86b14eSAlexander Kabaev         void
_M_range_initialize(_InputIterator __first,_InputIterator __last,std::input_iterator_tag)8201b86b14eSAlexander Kabaev         _M_range_initialize(_InputIterator __first,
821f8a1b7d9SAlexander Kabaev 			    _InputIterator __last, std::input_iterator_tag)
82200db7afdSDavid E. O'Brien         {
82300db7afdSDavid E. O'Brien 	  for (; __first != __last; ++__first)
82400db7afdSDavid E. O'Brien 	    push_back(*__first);
82500db7afdSDavid E. O'Brien 	}
82600db7afdSDavid E. O'Brien 
8271b86b14eSAlexander Kabaev       // Called by the second initialize_dispatch above
8281b86b14eSAlexander Kabaev       template<typename _ForwardIterator>
8291b86b14eSAlexander Kabaev         void
_M_range_initialize(_ForwardIterator __first,_ForwardIterator __last,std::forward_iterator_tag)8301b86b14eSAlexander Kabaev         _M_range_initialize(_ForwardIterator __first,
831f8a1b7d9SAlexander Kabaev 			    _ForwardIterator __last, std::forward_iterator_tag)
83200db7afdSDavid E. O'Brien         {
833f8a1b7d9SAlexander Kabaev 	  const size_type __n = std::distance(__first, __last);
834ffeaf689SAlexander Kabaev 	  this->_M_impl._M_start = this->_M_allocate(__n);
835ffeaf689SAlexander Kabaev 	  this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
836f8a1b7d9SAlexander Kabaev 	  this->_M_impl._M_finish =
837f8a1b7d9SAlexander Kabaev 	    std::__uninitialized_copy_a(__first, __last,
838f8a1b7d9SAlexander Kabaev 					this->_M_impl._M_start,
839f8a1b7d9SAlexander Kabaev 					_M_get_Tp_allocator());
84000db7afdSDavid E. O'Brien 	}
84100db7afdSDavid E. O'Brien 
8421b86b14eSAlexander Kabaev 
8431b86b14eSAlexander Kabaev       // Internal assign functions follow.  The *_aux functions do the actual
8441b86b14eSAlexander Kabaev       // assignment work for the range versions.
8451b86b14eSAlexander Kabaev 
8461b86b14eSAlexander Kabaev       // Called by the range assign to implement [23.1.1]/9
8471b86b14eSAlexander Kabaev       template<typename _Integer>
8481b86b14eSAlexander Kabaev         void
_M_assign_dispatch(_Integer __n,_Integer __val,__true_type)8491b86b14eSAlexander Kabaev         _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)
8501b86b14eSAlexander Kabaev         {
8511b86b14eSAlexander Kabaev 	  _M_fill_assign(static_cast<size_type>(__n),
8521b86b14eSAlexander Kabaev 			 static_cast<value_type>(__val));
8531b86b14eSAlexander Kabaev 	}
8541b86b14eSAlexander Kabaev 
8551b86b14eSAlexander Kabaev       // Called by the range assign to implement [23.1.1]/9
856ffeaf689SAlexander Kabaev       template<typename _InputIterator>
8571b86b14eSAlexander Kabaev         void
_M_assign_dispatch(_InputIterator __first,_InputIterator __last,__false_type)858ffeaf689SAlexander Kabaev         _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
859ffeaf689SAlexander Kabaev 			   __false_type)
8601b86b14eSAlexander Kabaev         {
861f8a1b7d9SAlexander Kabaev 	  typedef typename std::iterator_traits<_InputIterator>::
862f8a1b7d9SAlexander Kabaev 	    iterator_category _IterCategory;
8631b86b14eSAlexander Kabaev 	  _M_assign_aux(__first, __last, _IterCategory());
8641b86b14eSAlexander Kabaev 	}
8651b86b14eSAlexander Kabaev 
8661b86b14eSAlexander Kabaev       // Called by the second assign_dispatch above
8671b86b14eSAlexander Kabaev       template<typename _InputIterator>
8681b86b14eSAlexander Kabaev         void
8691b86b14eSAlexander Kabaev         _M_assign_aux(_InputIterator __first, _InputIterator __last,
870f8a1b7d9SAlexander Kabaev 		      std::input_iterator_tag);
87100db7afdSDavid E. O'Brien 
8721b86b14eSAlexander Kabaev       // Called by the second assign_dispatch above
8731b86b14eSAlexander Kabaev       template<typename _ForwardIterator>
8741b86b14eSAlexander Kabaev         void
8751b86b14eSAlexander Kabaev         _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
876f8a1b7d9SAlexander Kabaev 		      std::forward_iterator_tag);
8771b86b14eSAlexander Kabaev 
8781b86b14eSAlexander Kabaev       // Called by assign(n,t), and the range assign when it turns out
8791b86b14eSAlexander Kabaev       // to be the same thing.
8801b86b14eSAlexander Kabaev       void
8811b86b14eSAlexander Kabaev       _M_fill_assign(size_type __n, const value_type& __val);
8821b86b14eSAlexander Kabaev 
8831b86b14eSAlexander Kabaev 
8841b86b14eSAlexander Kabaev       // Internal insert functions follow.
8851b86b14eSAlexander Kabaev 
8861b86b14eSAlexander Kabaev       // Called by the range insert to implement [23.1.1]/9
8871b86b14eSAlexander Kabaev       template<typename _Integer>
8881b86b14eSAlexander Kabaev         void
_M_insert_dispatch(iterator __pos,_Integer __n,_Integer __val,__true_type)8891b86b14eSAlexander Kabaev         _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __val,
8901b86b14eSAlexander Kabaev 			   __true_type)
8911b86b14eSAlexander Kabaev         {
8921b86b14eSAlexander Kabaev 	  _M_fill_insert(__pos, static_cast<size_type>(__n),
8931b86b14eSAlexander Kabaev 			 static_cast<value_type>(__val));
8941b86b14eSAlexander Kabaev 	}
8951b86b14eSAlexander Kabaev 
8961b86b14eSAlexander Kabaev       // Called by the range insert to implement [23.1.1]/9
8971b86b14eSAlexander Kabaev       template<typename _InputIterator>
8981b86b14eSAlexander Kabaev         void
_M_insert_dispatch(iterator __pos,_InputIterator __first,_InputIterator __last,__false_type)8991b86b14eSAlexander Kabaev         _M_insert_dispatch(iterator __pos, _InputIterator __first,
9001b86b14eSAlexander Kabaev 			   _InputIterator __last, __false_type)
9011b86b14eSAlexander Kabaev         {
902f8a1b7d9SAlexander Kabaev 	  typedef typename std::iterator_traits<_InputIterator>::
903f8a1b7d9SAlexander Kabaev 	    iterator_category _IterCategory;
9041b86b14eSAlexander Kabaev 	  _M_range_insert(__pos, __first, __last, _IterCategory());
9051b86b14eSAlexander Kabaev 	}
9061b86b14eSAlexander Kabaev 
9071b86b14eSAlexander Kabaev       // Called by the second insert_dispatch above
9081b86b14eSAlexander Kabaev       template<typename _InputIterator>
9091b86b14eSAlexander Kabaev         void
9101b86b14eSAlexander Kabaev         _M_range_insert(iterator __pos, _InputIterator __first,
911f8a1b7d9SAlexander Kabaev 			_InputIterator __last, std::input_iterator_tag);
9121b86b14eSAlexander Kabaev 
9131b86b14eSAlexander Kabaev       // Called by the second insert_dispatch above
9141b86b14eSAlexander Kabaev       template<typename _ForwardIterator>
9151b86b14eSAlexander Kabaev         void
9161b86b14eSAlexander Kabaev         _M_range_insert(iterator __pos, _ForwardIterator __first,
917f8a1b7d9SAlexander Kabaev 			_ForwardIterator __last, std::forward_iterator_tag);
9181b86b14eSAlexander Kabaev 
9191b86b14eSAlexander Kabaev       // Called by insert(p,n,x), and the range insert when it turns out to be
9201b86b14eSAlexander Kabaev       // the same thing.
9211b86b14eSAlexander Kabaev       void
9221b86b14eSAlexander Kabaev       _M_fill_insert(iterator __pos, size_type __n, const value_type& __x);
9231b86b14eSAlexander Kabaev 
9241b86b14eSAlexander Kabaev       // Called by insert(p,x)
9251b86b14eSAlexander Kabaev       void
9261b86b14eSAlexander Kabaev       _M_insert_aux(iterator __position, const value_type& __x);
927f8a1b7d9SAlexander Kabaev 
928f8a1b7d9SAlexander Kabaev       // Internal erase functions follow.
929f8a1b7d9SAlexander Kabaev 
930f8a1b7d9SAlexander Kabaev       // Called by erase(q1,q2), clear(), resize(), _M_fill_assign,
931f8a1b7d9SAlexander Kabaev       // _M_assign_aux.
932f8a1b7d9SAlexander Kabaev       void
_M_erase_at_end(pointer __pos)933f8a1b7d9SAlexander Kabaev       _M_erase_at_end(pointer __pos)
934f8a1b7d9SAlexander Kabaev       {
935f8a1b7d9SAlexander Kabaev 	std::_Destroy(__pos, this->_M_impl._M_finish, _M_get_Tp_allocator());
936f8a1b7d9SAlexander Kabaev 	this->_M_impl._M_finish = __pos;
937f8a1b7d9SAlexander Kabaev       }
93800db7afdSDavid E. O'Brien     };
93900db7afdSDavid E. O'Brien 
9401b86b14eSAlexander Kabaev 
9411b86b14eSAlexander Kabaev   /**
9421b86b14eSAlexander Kabaev    *  @brief  Vector equality comparison.
9431b86b14eSAlexander Kabaev    *  @param  x  A %vector.
9441b86b14eSAlexander Kabaev    *  @param  y  A %vector of the same type as @a x.
9451b86b14eSAlexander Kabaev    *  @return  True iff the size and elements of the vectors are equal.
9461b86b14eSAlexander Kabaev    *
9471b86b14eSAlexander Kabaev    *  This is an equivalence relation.  It is linear in the size of the
9481b86b14eSAlexander Kabaev    *  vectors.  Vectors are considered equivalent if their sizes are equal,
9491b86b14eSAlexander Kabaev    *  and if corresponding elements compare equal.
9501b86b14eSAlexander Kabaev   */
9511b86b14eSAlexander Kabaev   template<typename _Tp, typename _Alloc>
95200db7afdSDavid E. O'Brien     inline bool
95300db7afdSDavid E. O'Brien     operator==(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
954f8a1b7d9SAlexander Kabaev     { return (__x.size() == __y.size()
955f8a1b7d9SAlexander Kabaev 	      && std::equal(__x.begin(), __x.end(), __y.begin())); }
95600db7afdSDavid E. O'Brien 
9571b86b14eSAlexander Kabaev   /**
9581b86b14eSAlexander Kabaev    *  @brief  Vector ordering relation.
9591b86b14eSAlexander Kabaev    *  @param  x  A %vector.
9601b86b14eSAlexander Kabaev    *  @param  y  A %vector of the same type as @a x.
961ffeaf689SAlexander Kabaev    *  @return  True iff @a x is lexicographically less than @a y.
9621b86b14eSAlexander Kabaev    *
9631b86b14eSAlexander Kabaev    *  This is a total ordering relation.  It is linear in the size of the
9641b86b14eSAlexander Kabaev    *  vectors.  The elements must be comparable with @c <.
9651b86b14eSAlexander Kabaev    *
966ffeaf689SAlexander Kabaev    *  See std::lexicographical_compare() for how the determination is made.
9671b86b14eSAlexander Kabaev   */
9681b86b14eSAlexander Kabaev   template<typename _Tp, typename _Alloc>
96900db7afdSDavid E. O'Brien     inline bool
97000db7afdSDavid E. O'Brien     operator<(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
971f8a1b7d9SAlexander Kabaev     { return std::lexicographical_compare(__x.begin(), __x.end(),
972f8a1b7d9SAlexander Kabaev 					  __y.begin(), __y.end()); }
97300db7afdSDavid E. O'Brien 
9741b86b14eSAlexander Kabaev   /// Based on operator==
9751b86b14eSAlexander Kabaev   template<typename _Tp, typename _Alloc>
97600db7afdSDavid E. O'Brien     inline bool
9771b86b14eSAlexander Kabaev     operator!=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
9781b86b14eSAlexander Kabaev     { return !(__x == __y); }
97900db7afdSDavid E. O'Brien 
9801b86b14eSAlexander Kabaev   /// Based on operator<
9811b86b14eSAlexander Kabaev   template<typename _Tp, typename _Alloc>
98200db7afdSDavid E. O'Brien     inline bool
9831b86b14eSAlexander Kabaev     operator>(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
9841b86b14eSAlexander Kabaev     { return __y < __x; }
98500db7afdSDavid E. O'Brien 
9861b86b14eSAlexander Kabaev   /// Based on operator<
9871b86b14eSAlexander Kabaev   template<typename _Tp, typename _Alloc>
98800db7afdSDavid E. O'Brien     inline bool
9891b86b14eSAlexander Kabaev     operator<=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
9901b86b14eSAlexander Kabaev     { return !(__y < __x); }
99100db7afdSDavid E. O'Brien 
9921b86b14eSAlexander Kabaev   /// Based on operator<
9931b86b14eSAlexander Kabaev   template<typename _Tp, typename _Alloc>
99400db7afdSDavid E. O'Brien     inline bool
9951b86b14eSAlexander Kabaev     operator>=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
9961b86b14eSAlexander Kabaev     { return !(__x < __y); }
99700db7afdSDavid E. O'Brien 
9981b86b14eSAlexander Kabaev   /// See std::vector::swap().
9991b86b14eSAlexander Kabaev   template<typename _Tp, typename _Alloc>
10001b86b14eSAlexander Kabaev     inline void
swap(vector<_Tp,_Alloc> & __x,vector<_Tp,_Alloc> & __y)10011b86b14eSAlexander Kabaev     swap(vector<_Tp, _Alloc>& __x, vector<_Tp, _Alloc>& __y)
10021b86b14eSAlexander Kabaev     { __x.swap(__y); }
1003f8a1b7d9SAlexander Kabaev 
1004f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NESTED_NAMESPACE
100500db7afdSDavid E. O'Brien 
1006ffeaf689SAlexander Kabaev #endif /* _VECTOR_H */
1007