xref: /dflybsd-src/contrib/gcc-4.7/libstdc++-v3/include/profile/vector (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
1*e4b17023SJohn Marino// Profiling vector implementation -*- C++ -*-
2*e4b17023SJohn Marino
3*e4b17023SJohn Marino// Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
4*e4b17023SJohn Marino//
5*e4b17023SJohn Marino// This file is part of the GNU ISO C++ Library.  This library is free
6*e4b17023SJohn Marino// software; you can redistribute it and/or modify it under the
7*e4b17023SJohn Marino// terms of the GNU General Public License as published by the
8*e4b17023SJohn Marino// Free Software Foundation; either version 3, or (at your option)
9*e4b17023SJohn Marino// any later version.
10*e4b17023SJohn Marino//
11*e4b17023SJohn Marino// This library is distributed in the hope that it will be useful,
12*e4b17023SJohn Marino// but WITHOUT ANY WARRANTY; without even the implied warranty of
13*e4b17023SJohn Marino// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*e4b17023SJohn Marino// GNU General Public License for more details.
15*e4b17023SJohn Marino
16*e4b17023SJohn Marino// Under Section 7 of GPL version 3, you are granted additional
17*e4b17023SJohn Marino// permissions described in the GCC Runtime Library Exception, version
18*e4b17023SJohn Marino// 3.1, as published by the Free Software Foundation.
19*e4b17023SJohn Marino
20*e4b17023SJohn Marino// You should have received a copy of the GNU General Public License along
21*e4b17023SJohn Marino// with this library; see the file COPYING3.  If not see
22*e4b17023SJohn Marino// <http://www.gnu.org/licenses/>.
23*e4b17023SJohn Marino
24*e4b17023SJohn Marino/** @file profile/vector
25*e4b17023SJohn Marino *  This file is a GNU profile extension to the Standard C++ Library.
26*e4b17023SJohn Marino */
27*e4b17023SJohn Marino
28*e4b17023SJohn Marino#ifndef _GLIBCXX_PROFILE_VECTOR
29*e4b17023SJohn Marino#define _GLIBCXX_PROFILE_VECTOR 1
30*e4b17023SJohn Marino
31*e4b17023SJohn Marino#include <vector>
32*e4b17023SJohn Marino#include <utility>
33*e4b17023SJohn Marino#include <profile/base.h>
34*e4b17023SJohn Marino#include <profile/iterator_tracker.h>
35*e4b17023SJohn Marino
36*e4b17023SJohn Marinonamespace std _GLIBCXX_VISIBILITY(default)
37*e4b17023SJohn Marino{
38*e4b17023SJohn Marinonamespace __profile
39*e4b17023SJohn Marino{
40*e4b17023SJohn Marino  template<typename _Tp,
41*e4b17023SJohn Marino	   typename _Allocator = std::allocator<_Tp> >
42*e4b17023SJohn Marino    class vector
43*e4b17023SJohn Marino    : public _GLIBCXX_STD_C::vector<_Tp, _Allocator>
44*e4b17023SJohn Marino    {
45*e4b17023SJohn Marino      typedef _GLIBCXX_STD_C::vector<_Tp, _Allocator> _Base;
46*e4b17023SJohn Marino
47*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
48*e4b17023SJohn Marino      typedef __gnu_cxx::__alloc_traits<_Allocator>  _Alloc_traits;
49*e4b17023SJohn Marino#endif
50*e4b17023SJohn Marino
51*e4b17023SJohn Marino    public:
52*e4b17023SJohn Marino      typedef typename _Base::reference             reference;
53*e4b17023SJohn Marino      typedef typename _Base::const_reference       const_reference;
54*e4b17023SJohn Marino
55*e4b17023SJohn Marino      typedef __iterator_tracker<typename _Base::iterator, vector>
56*e4b17023SJohn Marino                                                    iterator;
57*e4b17023SJohn Marino      typedef __iterator_tracker<typename _Base::const_iterator, vector>
58*e4b17023SJohn Marino				                    const_iterator;
59*e4b17023SJohn Marino
60*e4b17023SJohn Marino      typedef typename _Base::size_type             size_type;
61*e4b17023SJohn Marino      typedef typename _Base::difference_type       difference_type;
62*e4b17023SJohn Marino
63*e4b17023SJohn Marino      typedef _Tp				    value_type;
64*e4b17023SJohn Marino      typedef _Allocator			    allocator_type;
65*e4b17023SJohn Marino      typedef typename _Base::pointer               pointer;
66*e4b17023SJohn Marino      typedef typename _Base::const_pointer         const_pointer;
67*e4b17023SJohn Marino      typedef std::reverse_iterator<iterator>       reverse_iterator;
68*e4b17023SJohn Marino      typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
69*e4b17023SJohn Marino
70*e4b17023SJohn Marino      _Base&
71*e4b17023SJohn Marino      _M_base() _GLIBCXX_NOEXCEPT { return *this; }
72*e4b17023SJohn Marino
73*e4b17023SJohn Marino      const _Base&
74*e4b17023SJohn Marino      _M_base() const _GLIBCXX_NOEXCEPT { return *this; }
75*e4b17023SJohn Marino
76*e4b17023SJohn Marino      // 23.2.4.1 construct/copy/destroy:
77*e4b17023SJohn Marino      explicit
78*e4b17023SJohn Marino      vector(const _Allocator& __a = _Allocator())
79*e4b17023SJohn Marino      : _Base(__a)
80*e4b17023SJohn Marino      {
81*e4b17023SJohn Marino        __profcxx_vector_construct(this, this->capacity());
82*e4b17023SJohn Marino        __profcxx_vector_construct2(this);
83*e4b17023SJohn Marino      }
84*e4b17023SJohn Marino
85*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
86*e4b17023SJohn Marino      explicit
87*e4b17023SJohn Marino      vector(size_type __n)
88*e4b17023SJohn Marino      : _Base(__n)
89*e4b17023SJohn Marino      {
90*e4b17023SJohn Marino        __profcxx_vector_construct(this, this->capacity());
91*e4b17023SJohn Marino        __profcxx_vector_construct2(this);
92*e4b17023SJohn Marino      }
93*e4b17023SJohn Marino
94*e4b17023SJohn Marino      vector(size_type __n, const _Tp& __value,
95*e4b17023SJohn Marino	     const _Allocator& __a = _Allocator())
96*e4b17023SJohn Marino      :  _Base(__n, __value, __a)
97*e4b17023SJohn Marino      {
98*e4b17023SJohn Marino        __profcxx_vector_construct(this, this->capacity());
99*e4b17023SJohn Marino        __profcxx_vector_construct2(this);
100*e4b17023SJohn Marino      }
101*e4b17023SJohn Marino#else
102*e4b17023SJohn Marino      explicit
103*e4b17023SJohn Marino      vector(size_type __n, const _Tp& __value = _Tp(),
104*e4b17023SJohn Marino	     const _Allocator& __a = _Allocator())
105*e4b17023SJohn Marino      : _Base(__n, __value, __a)
106*e4b17023SJohn Marino      {
107*e4b17023SJohn Marino        __profcxx_vector_construct(this, this->capacity());
108*e4b17023SJohn Marino        __profcxx_vector_construct2(this);
109*e4b17023SJohn Marino      }
110*e4b17023SJohn Marino#endif
111*e4b17023SJohn Marino
112*e4b17023SJohn Marino      template<class _InputIterator>
113*e4b17023SJohn Marino        vector(_InputIterator __first, _InputIterator __last,
114*e4b17023SJohn Marino	       const _Allocator& __a = _Allocator())
115*e4b17023SJohn Marino	: _Base(__first, __last, __a)
116*e4b17023SJohn Marino        {
117*e4b17023SJohn Marino	  __profcxx_vector_construct(this, this->capacity());
118*e4b17023SJohn Marino	  __profcxx_vector_construct2(this);
119*e4b17023SJohn Marino	}
120*e4b17023SJohn Marino
121*e4b17023SJohn Marino      vector(const vector& __x)
122*e4b17023SJohn Marino      : _Base(__x)
123*e4b17023SJohn Marino      {
124*e4b17023SJohn Marino        __profcxx_vector_construct(this, this->capacity());
125*e4b17023SJohn Marino        __profcxx_vector_construct2(this);
126*e4b17023SJohn Marino      }
127*e4b17023SJohn Marino
128*e4b17023SJohn Marino      /// Construction from a release-mode vector
129*e4b17023SJohn Marino      vector(const _Base& __x)
130*e4b17023SJohn Marino      : _Base(__x)
131*e4b17023SJohn Marino      {
132*e4b17023SJohn Marino        __profcxx_vector_construct(this, this->capacity());
133*e4b17023SJohn Marino        __profcxx_vector_construct2(this);
134*e4b17023SJohn Marino      }
135*e4b17023SJohn Marino
136*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
137*e4b17023SJohn Marino      vector(vector&& __x) noexcept
138*e4b17023SJohn Marino      : _Base(std::move(__x))
139*e4b17023SJohn Marino      {
140*e4b17023SJohn Marino        __profcxx_vector_construct(this, this->capacity());
141*e4b17023SJohn Marino        __profcxx_vector_construct2(this);
142*e4b17023SJohn Marino      }
143*e4b17023SJohn Marino
144*e4b17023SJohn Marino      vector(const _Base& __x, const _Allocator& __a)
145*e4b17023SJohn Marino      : _Base(__x)
146*e4b17023SJohn Marino      {
147*e4b17023SJohn Marino        __profcxx_vector_construct(this, this->capacity());
148*e4b17023SJohn Marino        __profcxx_vector_construct2(this);
149*e4b17023SJohn Marino      }
150*e4b17023SJohn Marino
151*e4b17023SJohn Marino      vector(vector&& __x, const _Allocator& __a) noexcept
152*e4b17023SJohn Marino      : _Base(std::move(__x), __a)
153*e4b17023SJohn Marino      {
154*e4b17023SJohn Marino        __profcxx_vector_construct(this, this->capacity());
155*e4b17023SJohn Marino        __profcxx_vector_construct2(this);
156*e4b17023SJohn Marino      }
157*e4b17023SJohn Marino
158*e4b17023SJohn Marino      vector(initializer_list<value_type> __l,
159*e4b17023SJohn Marino	     const allocator_type& __a = allocator_type())
160*e4b17023SJohn Marino      : _Base(__l, __a) { }
161*e4b17023SJohn Marino#endif
162*e4b17023SJohn Marino
163*e4b17023SJohn Marino      ~vector() _GLIBCXX_NOEXCEPT
164*e4b17023SJohn Marino      {
165*e4b17023SJohn Marino        __profcxx_vector_destruct(this, this->capacity(), this->size());
166*e4b17023SJohn Marino        __profcxx_vector_destruct2(this);
167*e4b17023SJohn Marino      }
168*e4b17023SJohn Marino
169*e4b17023SJohn Marino      vector&
170*e4b17023SJohn Marino      operator=(const vector& __x)
171*e4b17023SJohn Marino      {
172*e4b17023SJohn Marino        static_cast<_Base&>(*this) = __x;
173*e4b17023SJohn Marino        return *this;
174*e4b17023SJohn Marino      }
175*e4b17023SJohn Marino
176*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
177*e4b17023SJohn Marino      vector&
178*e4b17023SJohn Marino      operator=(vector&& __x) noexcept(_Alloc_traits::_S_nothrow_move())
179*e4b17023SJohn Marino      {
180*e4b17023SJohn Marino	__profcxx_vector_destruct(this, this->capacity(), this->size());
181*e4b17023SJohn Marino	__profcxx_vector_destruct2(this);
182*e4b17023SJohn Marino	static_cast<_Base&>(*this) = std::move(__x);
183*e4b17023SJohn Marino	return *this;
184*e4b17023SJohn Marino      }
185*e4b17023SJohn Marino
186*e4b17023SJohn Marino      vector&
187*e4b17023SJohn Marino      operator=(initializer_list<value_type> __l)
188*e4b17023SJohn Marino      {
189*e4b17023SJohn Marino	static_cast<_Base&>(*this) = __l;
190*e4b17023SJohn Marino	return *this;
191*e4b17023SJohn Marino      }
192*e4b17023SJohn Marino#endif
193*e4b17023SJohn Marino
194*e4b17023SJohn Marino      using _Base::assign;
195*e4b17023SJohn Marino      using _Base::get_allocator;
196*e4b17023SJohn Marino
197*e4b17023SJohn Marino
198*e4b17023SJohn Marino      // iterators:
199*e4b17023SJohn Marino      iterator
200*e4b17023SJohn Marino      begin() _GLIBCXX_NOEXCEPT
201*e4b17023SJohn Marino      { return iterator(_Base::begin(), this); }
202*e4b17023SJohn Marino
203*e4b17023SJohn Marino      const_iterator
204*e4b17023SJohn Marino      begin() const _GLIBCXX_NOEXCEPT
205*e4b17023SJohn Marino      { return const_iterator(_Base::begin(), this); }
206*e4b17023SJohn Marino
207*e4b17023SJohn Marino      iterator
208*e4b17023SJohn Marino      end() _GLIBCXX_NOEXCEPT
209*e4b17023SJohn Marino      { return iterator(_Base::end(), this); }
210*e4b17023SJohn Marino
211*e4b17023SJohn Marino      const_iterator
212*e4b17023SJohn Marino      end() const _GLIBCXX_NOEXCEPT
213*e4b17023SJohn Marino      { return const_iterator(_Base::end(), this); }
214*e4b17023SJohn Marino
215*e4b17023SJohn Marino      reverse_iterator
216*e4b17023SJohn Marino      rbegin() _GLIBCXX_NOEXCEPT
217*e4b17023SJohn Marino      { return reverse_iterator(end()); }
218*e4b17023SJohn Marino
219*e4b17023SJohn Marino      const_reverse_iterator
220*e4b17023SJohn Marino      rbegin() const _GLIBCXX_NOEXCEPT
221*e4b17023SJohn Marino      { return const_reverse_iterator(end()); }
222*e4b17023SJohn Marino
223*e4b17023SJohn Marino      reverse_iterator
224*e4b17023SJohn Marino      rend() _GLIBCXX_NOEXCEPT
225*e4b17023SJohn Marino      { return reverse_iterator(begin()); }
226*e4b17023SJohn Marino
227*e4b17023SJohn Marino      const_reverse_iterator
228*e4b17023SJohn Marino      rend() const _GLIBCXX_NOEXCEPT
229*e4b17023SJohn Marino      { return const_reverse_iterator(begin()); }
230*e4b17023SJohn Marino
231*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
232*e4b17023SJohn Marino      const_iterator
233*e4b17023SJohn Marino      cbegin() const noexcept
234*e4b17023SJohn Marino      { return const_iterator(_Base::begin(), this); }
235*e4b17023SJohn Marino
236*e4b17023SJohn Marino      const_iterator
237*e4b17023SJohn Marino      cend() const noexcept
238*e4b17023SJohn Marino      { return const_iterator(_Base::end(), this); }
239*e4b17023SJohn Marino
240*e4b17023SJohn Marino      const_reverse_iterator
241*e4b17023SJohn Marino      crbegin() const noexcept
242*e4b17023SJohn Marino      { return const_reverse_iterator(end()); }
243*e4b17023SJohn Marino
244*e4b17023SJohn Marino      const_reverse_iterator
245*e4b17023SJohn Marino      crend() const noexcept
246*e4b17023SJohn Marino      { return const_reverse_iterator(begin()); }
247*e4b17023SJohn Marino#endif
248*e4b17023SJohn Marino
249*e4b17023SJohn Marino      // 23.2.4.2 capacity:
250*e4b17023SJohn Marino      using _Base::size;
251*e4b17023SJohn Marino      using _Base::max_size;
252*e4b17023SJohn Marino
253*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
254*e4b17023SJohn Marino      void
255*e4b17023SJohn Marino      resize(size_type __sz)
256*e4b17023SJohn Marino      {
257*e4b17023SJohn Marino        __profcxx_vector_invalid_operator(this);
258*e4b17023SJohn Marino        _M_profile_resize(this, this->capacity(), __sz);
259*e4b17023SJohn Marino        _Base::resize(__sz);
260*e4b17023SJohn Marino      }
261*e4b17023SJohn Marino
262*e4b17023SJohn Marino      void
263*e4b17023SJohn Marino      resize(size_type __sz, const _Tp& __c)
264*e4b17023SJohn Marino      {
265*e4b17023SJohn Marino        __profcxx_vector_invalid_operator(this);
266*e4b17023SJohn Marino        _M_profile_resize(this, this->capacity(), __sz);
267*e4b17023SJohn Marino        _Base::resize(__sz, __c);
268*e4b17023SJohn Marino      }
269*e4b17023SJohn Marino#else
270*e4b17023SJohn Marino      void
271*e4b17023SJohn Marino      resize(size_type __sz, _Tp __c = _Tp())
272*e4b17023SJohn Marino      {
273*e4b17023SJohn Marino        __profcxx_vector_invalid_operator(this);
274*e4b17023SJohn Marino        _M_profile_resize(this, this->capacity(), __sz);
275*e4b17023SJohn Marino        _Base::resize(__sz, __c);
276*e4b17023SJohn Marino      }
277*e4b17023SJohn Marino#endif
278*e4b17023SJohn Marino
279*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
280*e4b17023SJohn Marino      using _Base::shrink_to_fit;
281*e4b17023SJohn Marino#endif
282*e4b17023SJohn Marino
283*e4b17023SJohn Marino      using _Base::empty;
284*e4b17023SJohn Marino
285*e4b17023SJohn Marino      // element access:
286*e4b17023SJohn Marino      reference
287*e4b17023SJohn Marino      operator[](size_type __n)
288*e4b17023SJohn Marino      {
289*e4b17023SJohn Marino        __profcxx_vector_invalid_operator(this);
290*e4b17023SJohn Marino        return _M_base()[__n];
291*e4b17023SJohn Marino      }
292*e4b17023SJohn Marino      const_reference
293*e4b17023SJohn Marino      operator[](size_type __n) const
294*e4b17023SJohn Marino      {
295*e4b17023SJohn Marino        __profcxx_vector_invalid_operator(this);
296*e4b17023SJohn Marino        return _M_base()[__n];
297*e4b17023SJohn Marino      }
298*e4b17023SJohn Marino
299*e4b17023SJohn Marino      using _Base::at;
300*e4b17023SJohn Marino
301*e4b17023SJohn Marino      reference
302*e4b17023SJohn Marino      front()
303*e4b17023SJohn Marino      {
304*e4b17023SJohn Marino        return _Base::front();
305*e4b17023SJohn Marino      }
306*e4b17023SJohn Marino
307*e4b17023SJohn Marino      const_reference
308*e4b17023SJohn Marino      front() const
309*e4b17023SJohn Marino      {
310*e4b17023SJohn Marino	return _Base::front();
311*e4b17023SJohn Marino      }
312*e4b17023SJohn Marino
313*e4b17023SJohn Marino      reference
314*e4b17023SJohn Marino      back()
315*e4b17023SJohn Marino      {
316*e4b17023SJohn Marino	return _Base::back();
317*e4b17023SJohn Marino      }
318*e4b17023SJohn Marino
319*e4b17023SJohn Marino      const_reference
320*e4b17023SJohn Marino      back() const
321*e4b17023SJohn Marino      {
322*e4b17023SJohn Marino	return _Base::back();
323*e4b17023SJohn Marino      }
324*e4b17023SJohn Marino
325*e4b17023SJohn Marino      // _GLIBCXX_RESOLVE_LIB_DEFECTS
326*e4b17023SJohn Marino      // DR 464. Suggestion for new member functions in standard containers.
327*e4b17023SJohn Marino      using _Base::data;
328*e4b17023SJohn Marino
329*e4b17023SJohn Marino      // 23.2.4.3 modifiers:
330*e4b17023SJohn Marino      void
331*e4b17023SJohn Marino      push_back(const _Tp& __x)
332*e4b17023SJohn Marino      {
333*e4b17023SJohn Marino        size_type __old_size = this->capacity();
334*e4b17023SJohn Marino	_Base::push_back(__x);
335*e4b17023SJohn Marino        _M_profile_resize(this, __old_size, this->capacity());
336*e4b17023SJohn Marino      }
337*e4b17023SJohn Marino
338*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
339*e4b17023SJohn Marino      void
340*e4b17023SJohn Marino      push_back(_Tp&& __x)
341*e4b17023SJohn Marino      {
342*e4b17023SJohn Marino        size_type __old_size = this->capacity();
343*e4b17023SJohn Marino        _Base::push_back(std::move(__x));
344*e4b17023SJohn Marino        _M_profile_resize(this, __old_size, this->capacity());
345*e4b17023SJohn Marino      }
346*e4b17023SJohn Marino
347*e4b17023SJohn Marino#endif
348*e4b17023SJohn Marino
349*e4b17023SJohn Marino      iterator
350*e4b17023SJohn Marino      insert(iterator __position, const _Tp& __x)
351*e4b17023SJohn Marino      {
352*e4b17023SJohn Marino        __profcxx_vector_insert(this, __position.base() - _Base::begin(),
353*e4b17023SJohn Marino                                this->size());
354*e4b17023SJohn Marino        size_type __old_size = this->capacity();
355*e4b17023SJohn Marino	typename _Base::iterator __res = _Base::insert(__position.base(), __x);
356*e4b17023SJohn Marino        _M_profile_resize(this, __old_size, this->capacity());
357*e4b17023SJohn Marino	return iterator(__res, this);
358*e4b17023SJohn Marino      }
359*e4b17023SJohn Marino
360*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
361*e4b17023SJohn Marino      iterator
362*e4b17023SJohn Marino      insert(iterator __position, _Tp&& __x)
363*e4b17023SJohn Marino      {
364*e4b17023SJohn Marino        __profcxx_vector_insert(this, __position.base() - _Base::begin(),
365*e4b17023SJohn Marino                                this->size());
366*e4b17023SJohn Marino        size_type __old_size = this->capacity();
367*e4b17023SJohn Marino	typename _Base::iterator __res = _Base::insert(__position.base(), __x);
368*e4b17023SJohn Marino        _M_profile_resize(this, __old_size, this->capacity());
369*e4b17023SJohn Marino	return iterator(__res, this);
370*e4b17023SJohn Marino      }
371*e4b17023SJohn Marino
372*e4b17023SJohn Marino      void
373*e4b17023SJohn Marino      insert(iterator __position, initializer_list<value_type> __l)
374*e4b17023SJohn Marino      { this->insert(__position, __l.begin(), __l.end()); }
375*e4b17023SJohn Marino#endif
376*e4b17023SJohn Marino
377*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
378*e4b17023SJohn Marino      void
379*e4b17023SJohn Marino      swap(vector&& __x)
380*e4b17023SJohn Marino      {
381*e4b17023SJohn Marino        _Base::swap(__x);
382*e4b17023SJohn Marino      }
383*e4b17023SJohn Marino#endif
384*e4b17023SJohn Marino
385*e4b17023SJohn Marino      void
386*e4b17023SJohn Marino      swap(vector& __x)
387*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
388*e4b17023SJohn Marino			noexcept(_Alloc_traits::_S_nothrow_swap())
389*e4b17023SJohn Marino#endif
390*e4b17023SJohn Marino      {
391*e4b17023SJohn Marino        _Base::swap(__x);
392*e4b17023SJohn Marino      }
393*e4b17023SJohn Marino
394*e4b17023SJohn Marino      void
395*e4b17023SJohn Marino      insert(iterator __position, size_type __n, const _Tp& __x)
396*e4b17023SJohn Marino      {
397*e4b17023SJohn Marino        __profcxx_vector_insert(this, __position.base() - _Base::begin(),
398*e4b17023SJohn Marino                                this->size());
399*e4b17023SJohn Marino        size_type __old_size = this->capacity();
400*e4b17023SJohn Marino        _Base::insert(__position, __n, __x);
401*e4b17023SJohn Marino        _M_profile_resize(this, __old_size, this->capacity());
402*e4b17023SJohn Marino      }
403*e4b17023SJohn Marino
404*e4b17023SJohn Marino      template<class _InputIterator>
405*e4b17023SJohn Marino      void
406*e4b17023SJohn Marino      insert(iterator __position,
407*e4b17023SJohn Marino             _InputIterator __first, _InputIterator __last)
408*e4b17023SJohn Marino      {
409*e4b17023SJohn Marino        __profcxx_vector_insert(this, __position.base()-_Base::begin(),
410*e4b17023SJohn Marino                                this->size());
411*e4b17023SJohn Marino        size_type __old_size = this->capacity();
412*e4b17023SJohn Marino        _Base::insert(__position, __first, __last);
413*e4b17023SJohn Marino        _M_profile_resize(this, __old_size, this->capacity());
414*e4b17023SJohn Marino      }
415*e4b17023SJohn Marino
416*e4b17023SJohn Marino
417*e4b17023SJohn Marino      iterator
418*e4b17023SJohn Marino      erase(iterator __position)
419*e4b17023SJohn Marino      {
420*e4b17023SJohn Marino	typename _Base::iterator __res = _Base::erase(__position.base());
421*e4b17023SJohn Marino	return iterator(__res, this);
422*e4b17023SJohn Marino      }
423*e4b17023SJohn Marino
424*e4b17023SJohn Marino      iterator
425*e4b17023SJohn Marino      erase(iterator __first, iterator __last)
426*e4b17023SJohn Marino      {
427*e4b17023SJohn Marino	// _GLIBCXX_RESOLVE_LIB_DEFECTS
428*e4b17023SJohn Marino	// 151. can't currently clear() empty container
429*e4b17023SJohn Marino	typename _Base::iterator __res = _Base::erase(__first.base(),
430*e4b17023SJohn Marino                                                      __last.base());
431*e4b17023SJohn Marino	return iterator(__res, this);
432*e4b17023SJohn Marino      }
433*e4b17023SJohn Marino
434*e4b17023SJohn Marino      void
435*e4b17023SJohn Marino      clear() _GLIBCXX_NOEXCEPT
436*e4b17023SJohn Marino      {
437*e4b17023SJohn Marino        __profcxx_vector_destruct(this, this->capacity(), this->size());
438*e4b17023SJohn Marino        __profcxx_vector_destruct2(this);
439*e4b17023SJohn Marino        _Base::clear();
440*e4b17023SJohn Marino      }
441*e4b17023SJohn Marino
442*e4b17023SJohn Marino      inline void _M_profile_find() const
443*e4b17023SJohn Marino      {
444*e4b17023SJohn Marino        __profcxx_vector_find(this, size());
445*e4b17023SJohn Marino      }
446*e4b17023SJohn Marino
447*e4b17023SJohn Marino      inline void _M_profile_iterate(int __rewind = 0) const
448*e4b17023SJohn Marino      {
449*e4b17023SJohn Marino        __profcxx_vector_iterate(this);
450*e4b17023SJohn Marino      }
451*e4b17023SJohn Marino
452*e4b17023SJohn Marino    private:
453*e4b17023SJohn Marino      void _M_profile_resize(void* obj, size_type __old_size,
454*e4b17023SJohn Marino                             size_type __new_size)
455*e4b17023SJohn Marino      {
456*e4b17023SJohn Marino        if (__old_size < __new_size) {
457*e4b17023SJohn Marino          __profcxx_vector_resize(this, this->size(), __new_size);
458*e4b17023SJohn Marino          __profcxx_vector_resize2(this, this->size(), __new_size);
459*e4b17023SJohn Marino        }
460*e4b17023SJohn Marino      }
461*e4b17023SJohn Marino    };
462*e4b17023SJohn Marino
463*e4b17023SJohn Marino  template<typename _Tp, typename _Alloc>
464*e4b17023SJohn Marino    inline bool
465*e4b17023SJohn Marino    operator==(const vector<_Tp, _Alloc>& __lhs,
466*e4b17023SJohn Marino           const vector<_Tp, _Alloc>& __rhs)
467*e4b17023SJohn Marino    { return __lhs._M_base() == __rhs._M_base(); }
468*e4b17023SJohn Marino
469*e4b17023SJohn Marino  template<typename _Tp, typename _Alloc>
470*e4b17023SJohn Marino    inline bool
471*e4b17023SJohn Marino    operator!=(const vector<_Tp, _Alloc>& __lhs,
472*e4b17023SJohn Marino           const vector<_Tp, _Alloc>& __rhs)
473*e4b17023SJohn Marino    { return __lhs._M_base() != __rhs._M_base(); }
474*e4b17023SJohn Marino
475*e4b17023SJohn Marino  template<typename _Tp, typename _Alloc>
476*e4b17023SJohn Marino    inline bool
477*e4b17023SJohn Marino    operator<(const vector<_Tp, _Alloc>& __lhs,
478*e4b17023SJohn Marino          const vector<_Tp, _Alloc>& __rhs)
479*e4b17023SJohn Marino    { return __lhs._M_base() < __rhs._M_base(); }
480*e4b17023SJohn Marino
481*e4b17023SJohn Marino  template<typename _Tp, typename _Alloc>
482*e4b17023SJohn Marino    inline bool
483*e4b17023SJohn Marino    operator<=(const vector<_Tp, _Alloc>& __lhs,
484*e4b17023SJohn Marino           const vector<_Tp, _Alloc>& __rhs)
485*e4b17023SJohn Marino    { return __lhs._M_base() <= __rhs._M_base(); }
486*e4b17023SJohn Marino
487*e4b17023SJohn Marino  template<typename _Tp, typename _Alloc>
488*e4b17023SJohn Marino    inline bool
489*e4b17023SJohn Marino    operator>=(const vector<_Tp, _Alloc>& __lhs,
490*e4b17023SJohn Marino           const vector<_Tp, _Alloc>& __rhs)
491*e4b17023SJohn Marino    { return __lhs._M_base() >= __rhs._M_base(); }
492*e4b17023SJohn Marino
493*e4b17023SJohn Marino  template<typename _Tp, typename _Alloc>
494*e4b17023SJohn Marino    inline bool
495*e4b17023SJohn Marino    operator>(const vector<_Tp, _Alloc>& __lhs,
496*e4b17023SJohn Marino          const vector<_Tp, _Alloc>& __rhs)
497*e4b17023SJohn Marino    { return __lhs._M_base() > __rhs._M_base(); }
498*e4b17023SJohn Marino
499*e4b17023SJohn Marino  template<typename _Tp, typename _Alloc>
500*e4b17023SJohn Marino    inline void
501*e4b17023SJohn Marino    swap(vector<_Tp, _Alloc>& __lhs, vector<_Tp, _Alloc>& __rhs)
502*e4b17023SJohn Marino    { __lhs.swap(__rhs); }
503*e4b17023SJohn Marino
504*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
505*e4b17023SJohn Marino  template<typename _Tp, typename _Alloc>
506*e4b17023SJohn Marino    inline void
507*e4b17023SJohn Marino    swap(vector<_Tp, _Alloc>&& __lhs, vector<_Tp, _Alloc>& __rhs)
508*e4b17023SJohn Marino    { __lhs.swap(__rhs); }
509*e4b17023SJohn Marino
510*e4b17023SJohn Marino  template<typename _Tp, typename _Alloc>
511*e4b17023SJohn Marino    inline void
512*e4b17023SJohn Marino    swap(vector<_Tp, _Alloc>& __lhs, vector<_Tp, _Alloc>&& __rhs)
513*e4b17023SJohn Marino    { __lhs.swap(__rhs); }
514*e4b17023SJohn Marino#endif
515*e4b17023SJohn Marino
516*e4b17023SJohn Marino} // namespace __profile
517*e4b17023SJohn Marino
518*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__
519*e4b17023SJohn Marino  // DR 1182.
520*e4b17023SJohn Marino  /// std::hash specialization for vector<bool>.
521*e4b17023SJohn Marino  template<typename _Alloc>
522*e4b17023SJohn Marino    struct hash<__profile::vector<bool, _Alloc>>
523*e4b17023SJohn Marino    : public __hash_base<size_t, __profile::vector<bool, _Alloc>>
524*e4b17023SJohn Marino    {
525*e4b17023SJohn Marino      size_t
526*e4b17023SJohn Marino      operator()(const __profile::vector<bool, _Alloc>& __b) const noexcept
527*e4b17023SJohn Marino      { return std::hash<_GLIBCXX_STD_C::vector<bool, _Alloc>>()
528*e4b17023SJohn Marino	  (__b._M_base()); }
529*e4b17023SJohn Marino    };
530*e4b17023SJohn Marino#endif
531*e4b17023SJohn Marino
532*e4b17023SJohn Marino} // namespace std
533*e4b17023SJohn Marino
534*e4b17023SJohn Marino#endif
535