111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1994
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Hewlett-Packard Company
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1996,1997
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Silicon Graphics Computer Systems, Inc.
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1997
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Moscow Center for SPARC Technology
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1999
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Boris Fomitchev
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This material is provided "as is", with absolutely no warranty expressed
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * or implied. Any use is at your own risk.
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Permission to use or copy this software for any purpose is hereby granted
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * without fee, provided the above notices are retained on all copies.
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Permission to modify the code and to distribute modified code is granted,
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * provided the above notices are retained, and a notice that the code was
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * modified is included with the above copyright notice.
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _STLP_VECTOR_C
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _STLP_VECTOR_C
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined (_STLP_INTERNAL_VECTOR_H)
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  include <stl/_vector.h>
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <stl/_range_errors.h>
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_BEGIN_NAMESPACE
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_MOVE_TO_PRIV_NAMESPACE
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc>
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid _Vector_base<_Tp,_Alloc>::_M_throw_length_error() const
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ __stl_throw_length_error("vector"); }
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc>
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid _Vector_base<_Tp, _Alloc>::_M_throw_out_of_range() const
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ __stl_throw_out_of_range("vector"); }
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_USE_PTR_SPECIALIZATIONS)
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  define vector _STLP_PTR_IMPL_NAME(vector)
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#elif defined (_STLP_DEBUG)
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  define vector _STLP_NON_DBG_NAME(vector)
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_MOVE_TO_STD_NAMESPACE
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_NESTED_TYPE_PARAM_BUG)
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  define __iterator__  _Tp*
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  define __iterator__  _STLP_TYPENAME_ON_RETURN_TYPE vector<_Tp, _Alloc>::iterator
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc>
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid vector<_Tp, _Alloc>::reserve(size_type __n) {
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  if (capacity() < __n) {
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (max_size() < __n) {
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      this->_M_throw_length_error();
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    const size_type __old_size = size();
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    pointer __tmp;
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (this->_M_start) {
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __tmp = _M_allocate_and_copy(__n, this->_M_start, this->_M_finish);
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_clear();
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    } else {
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __tmp = this->_M_end_of_storage.allocate(__n, __n);
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_set(__tmp, __tmp + __old_size, __tmp + __n);
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc>
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__attribute__((noinline)) void vector<_Tp, _Alloc>::_M_insert_overflow_aux(pointer __pos, const _Tp& __x, const __false_type& /*DO NOT USE!!*/,
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                                 size_type __fill_len, bool __atend ) {
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef typename __type_traits<_Tp>::has_trivial_copy_constructor _TrivialUCopy;
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined (_STLP_NO_MOVE_SEMANTIC)
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef typename __move_traits<_Tp>::implemented _Movable;
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  size_type __len = _M_compute_next_size(__fill_len);
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  pointer __new_start = this->_M_end_of_storage.allocate(__len, __len);
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  pointer __new_finish = __new_start;
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _STLP_TRY {
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __new_finish = _STLP_PRIV __uninitialized_move(this->_M_start, __pos, __new_start, _TrivialUCopy(), _Movable());
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    // handle insertion
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (__fill_len == 1) {
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Copy_Construct(__new_finish, __x);
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ++__new_finish;
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    } else
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __new_finish = _STLP_PRIV __uninitialized_fill_n(__new_finish, __fill_len, __x);
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (!__atend)
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __new_finish = _STLP_PRIV __uninitialized_move(__pos, this->_M_finish, __new_finish, _TrivialUCopy(), _Movable()); // copy remainder
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _STLP_UNWIND((_STLP_STD::_Destroy_Range(__new_start,__new_finish),
10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert               this->_M_end_of_storage.deallocate(__new_start,__len)))
10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _M_clear_after_move();
10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _M_set(__new_start, __new_finish, __new_start + __len);
10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc>
10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid vector<_Tp, _Alloc>::_M_insert_overflow(pointer __pos, const _Tp& __x, const __true_type& /*_TrivialCopy*/,
10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                             size_type __fill_len, bool __atend ) {
11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  size_type __len = _M_compute_next_size(__fill_len);
11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  pointer __new_start = this->_M_end_of_storage.allocate(__len, __len);
11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  pointer __new_finish = __STATIC_CAST(pointer, _STLP_PRIV __copy_trivial(this->_M_start, __pos, __new_start));
11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // handle insertion
11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  __new_finish = _STLP_PRIV __fill_n(__new_finish, __fill_len, __x);
11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  if (!__atend)
11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __new_finish = __STATIC_CAST(pointer, _STLP_PRIV __copy_trivial(__pos, this->_M_finish, __new_finish)); // copy remainder
11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _M_clear();
11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _M_set(__new_start, __new_finish, __new_start + __len);
11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc>
12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid vector<_Tp, _Alloc>::_M_fill_insert_aux(iterator __pos, size_type __n,
12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                             const _Tp& __x, const __true_type& /*_Movable*/) {
12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  if (_M_is_inside(__x)) {
12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _Tp __x_copy = __x;
12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_fill_insert_aux(__pos, __n, __x_copy, __true_type());
12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return;
12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  iterator __src = this->_M_finish - 1;
13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  iterator __dst = __src + __n;
13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  for (; __src >= __pos; --__dst, --__src) {
13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_STD::_Move_Construct(__dst, *__src);
13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_STD::_Destroy_Moved(__src);
13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _STLP_PRIV __uninitialized_fill_n(__pos, __n, __x);
13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  this->_M_finish += __n;
13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc>
14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid vector<_Tp, _Alloc>::_M_fill_insert_aux (iterator __pos, size_type __n,
14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                              const _Tp& __x, const __false_type& /*_Movable*/) {
14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef typename __type_traits<_Tp>::has_trivial_copy_constructor _TrivialUCopy;
14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef typename __type_traits<_Tp>::has_trivial_assignment_operator _TrivialCopy;
14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  //Here self referencing needs to be checked even for non movable types.
14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  if (_M_is_inside(__x)) {
14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _Tp __x_copy = __x;
14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_fill_insert_aux(__pos, __n, __x_copy, __false_type());
14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return;
14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  const size_type __elems_after = this->_M_finish - __pos;
15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  pointer __old_finish = this->_M_finish;
15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  if (__elems_after > __n) {
15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_PRIV __ucopy_ptrs(this->_M_finish - __n, this->_M_finish, this->_M_finish, _TrivialUCopy());
15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_finish += __n;
15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_PRIV __copy_backward_ptrs(__pos, __old_finish - __n, __old_finish, _TrivialCopy());
15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_STD::fill(__pos, __pos + __n, __x);
15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  } else {
15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_finish = _STLP_PRIV __uninitialized_fill_n(this->_M_finish, __n - __elems_after, __x);
15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_PRIV __ucopy_ptrs(__pos, __old_finish, this->_M_finish, _TrivialUCopy());
16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_finish += __elems_after;
16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_STD::fill(__pos, __old_finish, __x);
16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
16511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc>
16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid vector<_Tp, _Alloc>::_M_fill_insert(iterator __pos,
16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                         size_type __n, const _Tp& __x) {
16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined (_STLP_NO_MOVE_SEMANTIC)
16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef typename __move_traits<_Tp>::implemented _Movable;
17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  if (__n != 0) {
17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (size_type(this->_M_end_of_storage._M_data - this->_M_finish) >= __n) {
17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_fill_insert_aux(__pos, __n, __x, _Movable());
17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    } else {
17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename __type_traits<_Tp>::has_trivial_assignment_operator _TrivialCopy;
17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_insert_overflow(__pos, __x, _TrivialCopy(), __n);
17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
18111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc>
18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvector<_Tp, _Alloc>& vector<_Tp, _Alloc>::operator = (const vector<_Tp, _Alloc>& __x) {
18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef typename __type_traits<_Tp>::has_trivial_assignment_operator _TrivialCopy;
18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef typename __type_traits<_Tp>::has_trivial_copy_constructor _TrivialUCopy;
18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  if (&__x != this) {
18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    const size_type __xlen = __x.size();
18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (__xlen > capacity()) {
18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      size_type __len = __xlen;
18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      pointer __tmp = _M_allocate_and_copy(__len, __CONST_CAST(const_pointer, __x._M_start) + 0,
19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                                  __CONST_CAST(const_pointer, __x._M_finish) + 0);
19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_clear();
19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      this->_M_start = __tmp;
19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      this->_M_end_of_storage._M_data = this->_M_start + __len;
19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    } else if (size() >= __xlen) {
19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      pointer __i = _STLP_PRIV __copy_ptrs(__CONST_CAST(const_pointer, __x._M_start) + 0,
19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                           __CONST_CAST(const_pointer, __x._M_finish) + 0, this->_M_start, _TrivialCopy());
19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _STLP_STD::_Destroy_Range(__i, this->_M_finish);
19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    } else {
19911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _STLP_PRIV __copy_ptrs(__CONST_CAST(const_pointer, __x._M_start),
20011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                             __CONST_CAST(const_pointer, __x._M_start) + size(), this->_M_start, _TrivialCopy());
20111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _STLP_PRIV __ucopy_ptrs(__CONST_CAST(const_pointer, __x._M_start) + size(),
20211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                              __CONST_CAST(const_pointer, __x._M_finish) + 0, this->_M_finish, _TrivialUCopy());
20311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
20411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_finish = this->_M_start + __xlen;
20511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
20611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  return *this;
20711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
20811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
20911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc>
21011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid vector<_Tp, _Alloc>::_M_fill_assign(size_t __n, const _Tp& __val) {
21111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  if (__n > capacity()) {
21211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    vector<_Tp, _Alloc> __tmp(__n, __val, get_allocator());
21311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __tmp.swap(*this);
21411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  } else if (__n > size()) {
21511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    fill(begin(), end(), __val);
21611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_finish = _STLP_PRIV __uninitialized_fill_n(this->_M_finish, __n - size(), __val);
21711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  } else
21811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    erase(_STLP_PRIV __fill_n(begin(), __n, __val), end());
21911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
22011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
22111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc>
22211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__iterator__
22311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvector<_Tp, _Alloc>::insert(iterator __pos, const _Tp& __x) {
22411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  size_type __n = __pos - begin();
22511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _M_fill_insert(__pos, 1, __x);
22611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  return begin() + __n;
22711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
22811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
22911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#undef __iterator__
23011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
23111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (vector)
23211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  undef vector
23311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_MOVE_TO_STD_NAMESPACE
23411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
23511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
23611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_END_NAMESPACE
23711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
23811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /*  _STLP_VECTOR_C */
23911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
24011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Local Variables:
24111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// mode:C++
24211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// End:
243