_vector.h revision e46c9386c4f79aa40185f79a19fc5b2a7ef528b3
19720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/*
29720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
39720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1994
49720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Hewlett-Packard Company
59720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
69720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1996,1997
79720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Silicon Graphics Computer Systems, Inc.
89720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
99720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1997
109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Moscow Center for SPARC Technology
119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1999
139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Boris Fomitchev
149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This material is provided "as is", with absolutely no warranty expressed
169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * or implied. Any use is at your own risk.
179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to use or copy this software for any purpose is hereby granted
199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * without fee, provided the above notices are retained on all copies.
209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to modify the code and to distribute modified code is granted,
219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * provided the above notices are retained, and a notice that the code was
229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * modified is included with the above copyright notice.
239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/* NOTE: This is an internal header file, included by other STL headers.
279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *   You should not attempt to use it directly.
289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_VECTOR_H
319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_INTERNAL_VECTOR_H
329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_ALGOBASE_H
349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_algobase.h>
359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_ALLOC_H
389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_alloc.h>
399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_ITERATOR_H
429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_iterator.h>
439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_UNINITIALIZED_H
469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_uninitialized.h>
479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE
509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// The vector base class serves one purpose, its constructor and
529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// destructor allocate (but don't initialize) storage.  This makes
539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// exception safety easier.
549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc>
589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass _Vector_base {
599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Vector_base<_Tp, _Alloc> _Self;
619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
62e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  typedef _Alloc allocator_type;
639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Tp* pointer;
649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _STLP_alloc_proxy<pointer, _Tp, allocator_type> _AllocProxy;
659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Vector_base(const _Alloc& __a)
679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _M_start(0), _M_finish(0), _M_end_of_storage(__a, 0) {}
689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Vector_base(size_t __n, const _Alloc& __a)
709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _M_start(0), _M_finish(0), _M_end_of_storage(__a, 0) {
719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_start = _M_end_of_storage.allocate(__n, __n);
729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_finish = _M_start;
739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_end_of_storage._M_data = _M_start + __n;
749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_MPWFIX_TRY _STLP_MPWFIX_CATCH
759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_MOVE_SEMANTIC)
789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Vector_base(__move_source<_Self> src)
799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _M_start(src.get()._M_start), _M_finish(src.get()._M_finish),
809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_end_of_storage(__move_source<_AllocProxy>(src.get()._M_end_of_storage)) {
819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    //Set the source as empty:
829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    src.get()._M_finish = src.get()._M_end_of_storage._M_data = src.get()._M_start = 0;
839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
84e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ~_Vector_base() {
879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (_M_start != _STLP_DEFAULT_CONSTRUCTED(pointer))
889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_end_of_storage.deallocate(_M_start, _M_end_of_storage._M_data - _M_start);
899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected:
929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _STLP_FUNCTION_THROWS _M_throw_length_error() const;
939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _STLP_FUNCTION_THROWS _M_throw_out_of_range() const;
949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  pointer _M_start;
969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  pointer _M_finish;
979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _AllocProxy _M_end_of_storage;
989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_PTR_SPECIALIZATIONS)
1019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define vector _STLP_PTR_IMPL_NAME(vector)
1029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#elif defined (_STLP_DEBUG)
1039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define vector _STLP_NON_DBG_NAME(vector)
1049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
1059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
1069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
1079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
108e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class _Tp, _STLP_DFL_TMPL_PARAM(_Alloc, allocator<_Tp>) >
1099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass vector : protected _STLP_PRIV _Vector_base<_Tp, _Alloc>
1109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (vector)
1119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block             , public __stlport_class<vector<_Tp, _Alloc> >
1129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
1139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{
1149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate:
1159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _STLP_PRIV _Vector_base<_Tp, _Alloc> _Base;
1169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef vector<_Tp, _Alloc> _Self;
1179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
1189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
1199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename _Base::allocator_type allocator_type;
1209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef _Tp value_type;
1229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef value_type* pointer;
1239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef const value_type* const_pointer;
1249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef value_type* iterator;
1259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef const value_type* const_iterator;
1269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef value_type& reference;
1289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef const value_type& const_reference;
1299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef size_t size_type;
1309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef ptrdiff_t difference_type;
1319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef random_access_iterator_tag _Iterator_category;
1329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_DECLARE_RANDOM_ACCESS_REVERSE_ITERATORS;
1349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  allocator_type get_allocator() const
1369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { return _STLP_CONVERT_ALLOCATOR((const allocator_type&)this->_M_end_of_storage, _Tp); }
1379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate:
139e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_NO_MOVE_SEMANTIC)
1409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef __false_type _Movable;
1419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
1429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // handles insertions on overflow
1449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert_overflow_aux(pointer __pos, const _Tp& __x, const __false_type& /*_Movable*/,
1459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                              size_type __fill_len, bool __atend);
1469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert_overflow_aux(pointer __pos, const _Tp& __x, const __true_type& /*_Movable*/,
1479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                              size_type __fill_len, bool __atend) {
1489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    //We need to take care of self referencing here:
1499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (_M_is_inside(__x)) {
1509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      value_type __x_copy = __x;
1519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_insert_overflow_aux(__pos, __x_copy, __false_type(), __fill_len, __atend);
1529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      return;
1539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
1549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_insert_overflow_aux(__pos, __x, __false_type(), __fill_len, __atend);
1559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert_overflow(pointer __pos, const _Tp& __x, const __false_type& /*_TrivialCopy*/,
158e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                          size_type __fill_len, bool __atend = false) {
159e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_MOVE_SEMANTIC)
160e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    typedef typename __move_traits<_Tp>::implemented _Movable;
161e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
162e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _M_insert_overflow_aux(__pos, __x, _Movable(), __fill_len, __atend);
163e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
1649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert_overflow(pointer __pos, const _Tp& __x, const __true_type& /*_TrivialCopy*/,
1659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          size_type __fill_len, bool __atend = false);
1669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_range_check(size_type __n) const {
1679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__n >= size_type(this->_M_finish - this->_M_start))
1689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_throw_out_of_range();
1699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
171e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  size_type _M_compute_next_size(size_type __n) {
172e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    const size_type __size = size();
173e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (__n > max_size() - __size)
174e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      this->_M_throw_length_error();
175e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    size_type __len = __size + (max)(__n, __size);
176e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (__len > max_size() || __len < __size)
177e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      __len = max_size(); // overflow
178e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return __len;
179e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
180e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
1819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
1829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator begin()             { return this->_M_start; }
1839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_iterator begin() const { return this->_M_start; }
1849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator end()               { return this->_M_finish; }
1859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_iterator end() const   { return this->_M_finish; }
1869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  reverse_iterator rbegin()              { return reverse_iterator(end()); }
1889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_reverse_iterator rbegin() const  { return const_reverse_iterator(end()); }
1899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  reverse_iterator rend()                { return reverse_iterator(begin()); }
1909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_reverse_iterator rend() const    { return const_reverse_iterator(begin()); }
1919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type size() const        { return size_type(this->_M_finish - this->_M_start); }
1939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type max_size() const {
1949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    size_type __vector_max_size = size_type(-1) / sizeof(_Tp);
1959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typename allocator_type::size_type __alloc_max_size = this->_M_end_of_storage.max_size();
1969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return (__alloc_max_size < __vector_max_size)?__alloc_max_size:__vector_max_size;
1979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type capacity() const    { return size_type(this->_M_end_of_storage._M_data - this->_M_start); }
2009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool empty() const            { return this->_M_start == this->_M_finish; }
2019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  reference operator[](size_type __n) { return *(begin() + __n); }
2039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_reference operator[](size_type __n) const { return *(begin() + __n); }
2049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  reference front()             { return *begin(); }
2069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_reference front() const { return *begin(); }
2079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  reference back()              { return *(end() - 1); }
2089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_reference back() const  { return *(end() - 1); }
2099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  reference at(size_type __n) { _M_range_check(__n); return (*this)[__n]; }
2119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const_reference at(size_type __n) const { _M_range_check(__n); return (*this)[__n]; }
2129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_DONT_SUP_DFLT_PARAM)
2149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  explicit vector(const allocator_type& __a = allocator_type())
2159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
2169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  vector()
2179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Vector_base<_Tp, _Alloc>(allocator_type()) {}
2189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  vector(const allocator_type& __a)
2199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
2209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Vector_base<_Tp, _Alloc>(__a) {}
2219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_DONT_SUP_DFLT_PARAM)
2239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate:
2249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //We always call _M_initialize with only 1 parameter. Default parameter
2259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //is used to allow explicit instanciation of vector with types with no
2269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //default constructor.
2279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_initialize(size_type __n, const _Tp& __val = _STLP_DEFAULT_CONSTRUCTED(_Tp))
2289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { this->_M_finish = _STLP_PRIV __uninitialized_init(this->_M_start, __n, __val); }
2299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
2309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  explicit vector(size_type __n)
2319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Vector_base<_Tp, _Alloc>(__n, allocator_type())
2329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _M_initialize(__n); }
2339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  vector(size_type __n, const _Tp& __val, const allocator_type& __a = allocator_type())
2349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
2359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  explicit vector(size_type __n)
2369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Vector_base<_Tp, _Alloc>(__n, allocator_type())
2379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { this->_M_finish = _STLP_PRIV __uninitialized_init(this->_M_start, __n, _STLP_DEFAULT_CONSTRUCTED(_Tp)); }
2389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  vector(size_type __n, const _Tp& __val)
2399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Vector_base<_Tp, _Alloc>(__n, allocator_type())
2409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { this->_M_finish = _STLP_PRIV __uninitialized_fill_n(this->_M_start, __n, __val); }
2419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  vector(size_type __n, const _Tp& __val, const allocator_type& __a)
2429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
2439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Vector_base<_Tp, _Alloc>(__n, __a)
2449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { this->_M_finish = _STLP_PRIV __uninitialized_fill_n(this->_M_start, __n, __val); }
2459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  vector(const _Self& __x)
247e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    : _STLP_PRIV _Vector_base<_Tp, _Alloc>(__x.size(), __x.get_allocator()) {
248e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    typedef typename __type_traits<_Tp>::has_trivial_copy_constructor _TrivialUCopy;
249e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    this->_M_finish = _STLP_PRIV __ucopy_ptrs(__x.begin(), __x.end(), this->_M_start, _TrivialUCopy());
250e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
2519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
252e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_MOVE_SEMANTIC)
2539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  vector(__move_source<_Self> src)
2549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Vector_base<_Tp, _Alloc>(__move_source<_Base>(src.get()))
2559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  {}
256e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
2579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES)
2599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate:
2609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Integer>
2619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_initialize_aux(_Integer __n, _Integer __val,
2629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                         const __true_type& /*_IsIntegral*/) {
263e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    size_type __real_n = __n;
2649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_start = this->_M_end_of_storage.allocate(__n, __real_n);
2659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_end_of_storage._M_data = this->_M_start + __real_n;
2669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_finish = _STLP_PRIV __uninitialized_fill_n(this->_M_start, __n, __val);
2679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
2709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_initialize_aux(_InputIterator __first, _InputIterator __last,
2719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                         const __false_type& /*_IsIntegral*/)
2729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _M_range_initialize(__first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIterator)); }
2739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
2759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Check whether it's an integral type.  If so, it's not an iterator.
2769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
2779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  vector(_InputIterator __first, _InputIterator __last,
2789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block               const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL )
2799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Vector_base<_Tp, _Alloc>(__a) {
2809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef typename _IsIntegral<_InputIterator>::_Ret _Integral;
2819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_initialize_aux(__first, __last, _Integral());
2829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if defined (_STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS)
2859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
2869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  vector(_InputIterator __first, _InputIterator __last)
2879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    : _STLP_PRIV _Vector_base<_Tp, _Alloc>(allocator_type()) {
2889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef typename _IsIntegral<_InputIterator>::_Ret _Integral;
2899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_initialize_aux(__first, __last, _Integral());
2909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif /* _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS */
2929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else /* _STLP_MEMBER_TEMPLATES */
2949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  vector(const _Tp* __first, const _Tp* __last,
2959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block         const allocator_type& __a = allocator_type())
296e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    : _STLP_PRIV _Vector_base<_Tp, _Alloc>(__last - __first, __a) {
297e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    typedef typename __type_traits<_Tp>::has_trivial_copy_constructor _TrivialUCopy;
298e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    this->_M_finish = _STLP_PRIV __ucopy_ptrs(__first, __last, this->_M_start, _TrivialUCopy());
299e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
3009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_MEMBER_TEMPLATES */
3019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //As the vector container is a back insert oriented container it
3039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  //seems rather logical to destroy elements in reverse order.
3049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ~vector() { _STLP_STD::_Destroy_Range(rbegin(), rend()); }
3059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Self& operator=(const _Self& __x);
3079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void reserve(size_type __n);
3099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // assign(), a generalized assignment member function.  Two
3119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // versions: one that takes a count, and one that takes a range.
3129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // The range version is a member template, so we dispatch on whether
3139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // or not the type is an integer.
3149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void assign(size_type __n, const _Tp& __val) { _M_fill_assign(__n, __val); }
3169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_fill_assign(size_type __n, const _Tp& __val);
3179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES)
3199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _ForwardIter>
3209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_assign_aux(_ForwardIter __first, _ForwardIter __last, const forward_iterator_tag &) {
3219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
3229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void assign(const_iterator __first, const_iterator __last) {
3239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef const_iterator _ForwardIter;
3249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
325e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    const size_type __len = _STLP_STD::distance(__first, __last);
3269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__len > capacity()) {
3279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      size_type __n = __len;
3289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __tmp = _M_allocate_and_copy(__n, __first, __last);
3299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_clear();
3309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_set(__tmp, __tmp + __len, __tmp + __n);
3319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
3329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else if (size() >= __len) {
3339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __new_finish = copy(__first, __last, this->_M_start);
3349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_STD::_Destroy_Range(__new_finish, this->_M_finish);
3359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_finish = __new_finish;
3369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
3379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
3389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _ForwardIter __mid = __first;
339e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _STLP_STD::advance(__mid, size());
340e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _STLP_STD::copy(__first, __mid, this->_M_start);
341e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      this->_M_finish = _STLP_STD::uninitialized_copy(__mid, __last, this->_M_finish);
3429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
3439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES)
3469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIter>
3479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_assign_aux(_InputIter __first, _InputIter __last,
3489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     const input_iterator_tag &) {
3499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __cur = begin();
3509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for ( ; __first != __last && __cur != end(); ++__cur, ++__first)
3519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      *__cur = *__first;
3529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__first == __last)
3539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      erase(__cur, end());
3549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
3559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      insert(end(), __first, __last);
3569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Integer>
3599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_assign_dispatch(_Integer __n, _Integer __val,
3609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          const __true_type& /*_IsIntegral*/)
3619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _M_fill_assign(__n, __val); }
3629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIter>
3649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_assign_dispatch(_InputIter __first, _InputIter __last,
3659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          const __false_type& /*_IsIntegral*/)
3669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _M_assign_aux(__first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIter)); }
3679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
3699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void assign(_InputIterator __first, _InputIterator __last) {
3709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef typename _IsIntegral<_InputIterator>::_Ret _Integral;
3719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_assign_dispatch(__first, __last, _Integral());
3729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
373e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
3749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
3769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void push_back(const _Tp& __x = _STLP_DEFAULT_CONSTRUCTED(_Tp)) {
3779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
3789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void push_back(const _Tp& __x) {
379e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
3809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (this->_M_finish != this->_M_end_of_storage._M_data) {
3819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _Copy_Construct(this->_M_finish, __x);
3829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ++this->_M_finish;
3839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
384e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    else {
385e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      typedef typename __type_traits<_Tp>::has_trivial_assignment_operator _TrivialCopy;
386e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _M_insert_overflow(this->_M_finish, __x, _TrivialCopy(), 1, true);
387e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
3889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined(_STLP_DONT_SUP_DFLT_PARAM) && !defined(_STLP_NO_ANACHRONISMS)
3919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator insert(iterator __pos, const _Tp& __x = _STLP_DEFAULT_CONSTRUCTED(_Tp));
3929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
3939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator insert(iterator __pos, const _Tp& __x);
394e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
3959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined(_STLP_DONT_SUP_DFLT_PARAM) && !defined(_STLP_NO_ANACHRONISMS)
3979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void push_back() { push_back(_STLP_DEFAULT_CONSTRUCTED(_Tp)); }
3989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator insert(iterator __pos) { return insert(__pos, _STLP_DEFAULT_CONSTRUCTED(_Tp)); }
399e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
4009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void swap(_Self& __x) {
4029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_STD::swap(this->_M_start, __x._M_start);
4039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_STD::swap(this->_M_finish, __x._M_finish);
4049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_end_of_storage.swap(__x._M_end_of_storage);
4059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
406e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
407e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void _M_swap_workaround(_Self& __x) { swap(__x); }
408e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
4099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate:
4119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_fill_insert_aux (iterator __pos, size_type __n, const _Tp& __x, const __true_type& /*_Movable*/);
4129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_fill_insert_aux (iterator __pos, size_type __n, const _Tp& __x, const __false_type& /*_Movable*/);
4139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_fill_insert (iterator __pos, size_type __n, const _Tp& __x);
4149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bool _M_is_inside(const value_type& __x) const {
4169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return (&__x >= this->_M_start && &__x < this->_M_finish);
4179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES)
4209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _ForwardIterator>
4219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_range_insert_realloc(iterator __pos,
4229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                               _ForwardIterator __first, _ForwardIterator __last,
4239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
4249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_range_insert_realloc(iterator __pos,
4259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                               const_iterator __first, const_iterator __last,
426e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
4279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                               size_type __n) {
428e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    typedef typename __type_traits<_Tp>::has_trivial_copy_constructor _TrivialUCopy;
429e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_MOVE_SEMANTIC)
430e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    typedef typename __move_traits<_Tp>::implemented _Movable;
431e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
432e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    size_type __len = _M_compute_next_size(__n);
4339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    pointer __new_start = this->_M_end_of_storage.allocate(__len, __len);
4349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    pointer __new_finish = __new_start;
4359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
4369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __new_finish = _STLP_PRIV __uninitialized_move(this->_M_start, __pos, __new_start, _TrivialUCopy(), _Movable());
4379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __new_finish = uninitialized_copy(__first, __last, __new_finish);
4389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __new_finish = _STLP_PRIV __uninitialized_move(__pos, this->_M_finish, __new_finish, _TrivialUCopy(), _Movable());
4399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
4409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_UNWIND((_STLP_STD::_Destroy_Range(__new_start,__new_finish),
4419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                  this->_M_end_of_storage.deallocate(__new_start,__len)))
4429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_clear_after_move();
4439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_set(__new_start, __new_finish, __new_start + __len);
4449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES)
4479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _ForwardIterator>
4489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_range_insert_aux(iterator __pos,
4499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           _ForwardIterator __first, _ForwardIterator __last,
4509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
4519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_range_insert_aux(iterator __pos,
4529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           const_iterator __first, const_iterator __last,
453e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
4549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           size_type __n, const __true_type& /*_Movable*/) {
4559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __src = this->_M_finish - 1;
4569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __dst = __src + __n;
4579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for (; __src >= __pos; --__dst, --__src) {
4589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_STD::_Move_Construct(__dst, *__src);
4599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_STD::_Destroy_Moved(__src);
4609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
4619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    uninitialized_copy(__first, __last, __pos);
4629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_finish += __n;
4639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES)
4669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _ForwardIterator>
4679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_range_insert_aux(iterator __pos,
4689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           _ForwardIterator __first, _ForwardIterator __last,
4699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
4709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_range_insert_aux(iterator __pos,
4719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           const_iterator __first, const_iterator __last,
472e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
4739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           size_type __n, const __false_type& /*_Movable*/) {
474e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    typedef typename __type_traits<_Tp>::has_trivial_copy_constructor _TrivialUCopy;
475e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    typedef typename __type_traits<_Tp>::has_trivial_assignment_operator _TrivialCopy;
4769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    const size_type __elems_after = this->_M_finish - __pos;
4779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    pointer __old_finish = this->_M_finish;
4789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__elems_after > __n) {
4799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_PRIV __ucopy_ptrs(this->_M_finish - __n, this->_M_finish, this->_M_finish, _TrivialUCopy());
4809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_finish += __n;
4819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_PRIV __copy_backward_ptrs(__pos, __old_finish - __n, __old_finish, _TrivialCopy());
4829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      copy(__first, __last, __pos);
4839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
4849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
4859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined ( _STLP_MEMBER_TEMPLATES )
4869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _ForwardIterator __mid = __first;
487e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _STLP_STD::advance(__mid, __elems_after);
4889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
4899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      const_pointer __mid = __first + __elems_after;
4909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
4919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      uninitialized_copy(__mid, __last, this->_M_finish);
4929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_finish += __n - __elems_after;
4939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_PRIV __ucopy_ptrs(__pos, __old_finish, this->_M_finish, _TrivialUCopy());
4949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_finish += __elems_after;
4959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      copy(__first, __mid, __pos);
4969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    } /* elems_after */
4979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES)
5019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _Integer>
5029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __val,
5039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          const __true_type&)
5049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _M_fill_insert(__pos, (size_type) __n, (_Tp) __val); }
5059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
5079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_insert_dispatch(iterator __pos,
5089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          _InputIterator __first, _InputIterator __last,
5099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                          const __false_type&)
5109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _M_range_insert(__pos, __first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIterator)); }
5119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
5139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // Check whether it's an integral type.  If so, it's not an iterator.
5149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
5159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void insert(iterator __pos, _InputIterator __first, _InputIterator __last) {
5169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    typedef typename _IsIntegral<_InputIterator>::_Ret _Integral;
5179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_insert_dispatch(__pos, __first, __last, _Integral());
5189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate:
5219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
5229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_range_insert(iterator __pos,
5239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                       _InputIterator __first, _InputIterator __last,
5249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                       const input_iterator_tag &) {
5259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for ( ; __first != __last; ++__first) {
5269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __pos = insert(__pos, *__first);
5279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      ++__pos;
5289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
5299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _ForwardIterator>
5329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_range_insert(iterator __pos,
5339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                       _ForwardIterator __first, _ForwardIterator __last,
5349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                       const forward_iterator_tag &) {
535e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
5369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
5379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void insert(iterator __pos,
5389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block              const_iterator __first, const_iterator __last) {
539e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
540e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_MOVE_SEMANTIC)
541e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    typedef typename __move_traits<_Tp>::implemented _Movable;
542e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
5439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    /* This method do not check self referencing.
5449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block     * Standard forbids it, checked by the debug mode.
5459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block     */
5469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__first != __last) {
547e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      size_type __n = _STLP_STD::distance(__first, __last);
5489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (size_type(this->_M_end_of_storage._M_data - this->_M_finish) >= __n) {
5509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _M_range_insert_aux(__pos, __first, __last, __n, _Movable());
5519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
5529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else {
5539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _M_range_insert_realloc(__pos, __first, __last, __n);
5549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
5559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
5569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
5599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void insert (iterator __pos, size_type __n, const _Tp& __x)
5609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  { _M_fill_insert(__pos, __n, __x); }
5619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void pop_back() {
5639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    --this->_M_finish;
5649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_STD::_Destroy(this->_M_finish);
5659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate:
5689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator _M_erase(iterator __pos, const __true_type& /*_Movable*/) {
5699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_STD::_Destroy(__pos);
5709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __dst = __pos, __src = __dst + 1;
5719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __end = end();
5729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for (; __src != __end; ++__dst, ++__src) {
5739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_STD::_Move_Construct(__dst, *__src);
5749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_STD::_Destroy_Moved(__src);
5759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
5769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_finish = __dst;
5779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __pos;
5789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator _M_erase(iterator __pos, const __false_type& /*_Movable*/) {
580e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (__pos + 1 != end()) {
581e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      typedef typename __type_traits<_Tp>::has_trivial_assignment_operator _TrivialCopy;
5829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_PRIV __copy_ptrs(__pos + 1, this->_M_finish, __pos, _TrivialCopy());
583e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
5849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    --this->_M_finish;
5859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_STD::_Destroy(this->_M_finish);
5869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __pos;
5879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator _M_erase(iterator __first, iterator __last, const __true_type& /*_Movable*/) {
5899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __dst = __first, __src = __last;
5909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __end = end();
5919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for (; __dst != __last && __src != __end; ++__dst, ++__src) {
5929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_STD::_Destroy(__dst);
5939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_STD::_Move_Construct(__dst, *__src);
5949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
5959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__dst != __last) {
5969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      //There is more elements to erase than element to move:
5979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_STD::_Destroy_Range(__dst, __last);
5989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_STD::_Destroy_Moved_Range(__last, __end);
5999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
6009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
6019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      //There is more element to move than element to erase:
6029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      for (; __src != __end; ++__dst, ++__src) {
6039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_STD::_Destroy_Moved(__dst);
6049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_STD::_Move_Construct(__dst, *__src);
6059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
6069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_STD::_Destroy_Moved_Range(__dst, __end);
6079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
6089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_finish = __dst;
6099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __first;
6109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator _M_erase(iterator __first, iterator __last, const __false_type& /*_Movable*/) {
612e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    typedef typename __type_traits<_Tp>::has_trivial_assignment_operator _TrivialCopy;
6139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    pointer __i = _STLP_PRIV __copy_ptrs(__last, this->_M_finish, __first, _TrivialCopy());
6149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_STD::_Destroy_Range(__i, this->_M_finish);
6159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_finish = __i;
6169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return __first;
6179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
6209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator erase(iterator __pos) {
621e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_MOVE_SEMANTIC)
622e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    typedef typename __move_traits<_Tp>::implemented _Movable;
623e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
6249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return _M_erase(__pos, _Movable());
6259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator erase(iterator __first, iterator __last) {
627e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_MOVE_SEMANTIC)
628e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    typedef typename __move_traits<_Tp>::implemented _Movable;
629e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
6309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__first == __last)
6319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      return __first;
6329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    return _M_erase(__first, __last, _Movable());
6339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_DONT_SUP_DFLT_PARAM)
6369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void resize(size_type __new_size, const _Tp& __x = _STLP_DEFAULT_CONSTRUCTED(_Tp)) {
6379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
6389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void resize(size_type __new_size, const _Tp& __x) {
6399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*_STLP_DONT_SUP_DFLT_PARAM*/
6409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__new_size < size())
6419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      erase(begin() + __new_size, end());
6429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
6439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      insert(end(), __new_size - size(), __x);
6449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DONT_SUP_DFLT_PARAM)
6479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void resize(size_type __new_size) { resize(__new_size, _STLP_DEFAULT_CONSTRUCTED(_Tp)); }
6489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*_STLP_DONT_SUP_DFLT_PARAM*/
6499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void clear() {
6519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    erase(begin(), end());
6529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprivate:
6559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_clear() {
6569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_STD::_Destroy_Range(rbegin(), rend());
6579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_end_of_storage.deallocate(this->_M_start, this->_M_end_of_storage._M_data - this->_M_start);
6589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_clear_after_move() {
6619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_STD::_Destroy_Moved_Range(rbegin(), rend());
6629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_end_of_storage.deallocate(this->_M_start, this->_M_end_of_storage._M_data - this->_M_start);
6639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_set(pointer __s, pointer __f, pointer __e) {
6669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_start = __s;
6679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_finish = __f;
6689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_end_of_storage._M_data = __e;
6699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES)
6729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _ForwardIterator>
6739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  pointer _M_allocate_and_copy(size_type& __n,
6749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                               _ForwardIterator __first, _ForwardIterator __last)
6759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else /* _STLP_MEMBER_TEMPLATES */
6769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  pointer _M_allocate_and_copy(size_type& __n,
6779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                               const_pointer __first, const_pointer __last)
6789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_MEMBER_TEMPLATES */
6799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  {
6809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    pointer __result = this->_M_end_of_storage.allocate(__n, __n);
6819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
6829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      uninitialized_copy(__first, __last, __result);
6839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      return __result;
6849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
6859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_UNWIND(this->_M_end_of_storage.deallocate(__result, __n))
6869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_RET_AFTER_THROW(__result)
6879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES)
6919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _InputIterator>
6929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_range_initialize(_InputIterator __first, _InputIterator __last,
6939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           const input_iterator_tag &) {
6949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for ( ; __first != __last; ++__first)
6959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      push_back(*__first);
6969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  // This function is only called by the constructor.
6989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  template <class _ForwardIterator>
6999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  void _M_range_initialize(_ForwardIterator __first, _ForwardIterator __last,
7009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                           const forward_iterator_tag &) {
701e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    size_type __n = _STLP_STD::distance(__first, __last);
7029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_start = this->_M_end_of_storage.allocate(__n, __n);
7039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_end_of_storage._M_data = this->_M_start + __n;
7049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_finish = uninitialized_copy(__first, __last, this->_M_start);
7059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_MEMBER_TEMPLATES */
7079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
7089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (vector)
7109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  undef vector
7119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
7129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
7139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE
7159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_LINK_TIME_INSTANTIATION)
7179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_vector.c>
7189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
7199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_PTR_SPECIALIZATIONS)
7219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/pointers/_vector.h>
7229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
7239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//We define the bool specialization before the debug interfave
7259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//to benefit of the debug version of vector even for the bool
7269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block//specialization.
7279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_NO_BOOL) || !defined (_STLP_NO_EXTENSIONS)
7289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if !defined (_STLP_INTERNAL_BVECTOR_H)
7299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#    include <stl/_bvector.h>
7309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
7319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
7329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DEBUG)
7349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/debug/_vector.h>
7359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
7369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE
7389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_NO_BOOL) && !defined (_STLP_NO_EXTENSIONS)
7409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// This typedef is non-standard.  It is provided for backward compatibility.
7419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktypedef vector<bool, allocator<bool> > bit_vector;
7429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
7439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_TEMPLATE_HEADER template <class _Tp, class _Alloc>
7459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_TEMPLATE_CONTAINER vector<_Tp, _Alloc>
7469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include <stl/_relops_cont.h>
7479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef _STLP_TEMPLATE_CONTAINER
7489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef _STLP_TEMPLATE_HEADER
7499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
751e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  if !defined (_STLP_NO_MOVE_SEMANTIC)
7529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc>
7539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct __move_traits<vector<_Tp, _Alloc> > {
754e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  typedef __true_type implemented;
7559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename __move_traits<_Alloc>::complete complete;
7569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
757e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
7589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if !defined (_STLP_DEBUG)
7609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc>
7619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct _DefaultZeroValue<vector<_Tp, _Alloc> >
7629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ typedef typename __type_traits<_Alloc>::has_trivial_default_constructor _Ret; };
7639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
7649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
7669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE
7689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_VECTOR_H */
7709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Local Variables:
7729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// mode:C++
7739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// End:
774