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