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