stl_vector.h
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:27k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. /*
  2.  *
  3.  * Copyright (c) 1994
  4.  * Hewlett-Packard Company
  5.  *
  6.  * Permission to use, copy, modify, distribute and sell this software
  7.  * and its documentation for any purpose is hereby granted without fee,
  8.  * provided that the above copyright notice appear in all copies and
  9.  * that both that copyright notice and this permission notice appear
  10.  * in supporting documentation.  Hewlett-Packard Company makes no
  11.  * representations about the suitability of this software for any
  12.  * purpose.  It is provided "as is" without express or implied warranty.
  13.  *
  14.  *
  15.  * Copyright (c) 1996
  16.  * Silicon Graphics Computer Systems, Inc.
  17.  *
  18.  * Permission to use, copy, modify, distribute and sell this software
  19.  * and its documentation for any purpose is hereby granted without fee,
  20.  * provided that the above copyright notice appear in all copies and
  21.  * that both that copyright notice and this permission notice appear
  22.  * in supporting documentation.  Silicon Graphics makes no
  23.  * representations about the suitability of this software for any
  24.  * purpose.  It is provided "as is" without express or implied warranty.
  25.  */
  26. /* NOTE: This is an internal header file, included by other STL headers.
  27.  *   You should not attempt to use it directly.
  28.  */
  29. #ifndef __SGI_STL_INTERNAL_VECTOR_H
  30. #define __SGI_STL_INTERNAL_VECTOR_H
  31. __STL_BEGIN_NAMESPACE 
  32. #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
  33. #pragma set woff 1174
  34. #pragma set woff 1375
  35. #endif
  36. // The vector base class serves two purposes.  First, its constructor
  37. // and destructor allocate (but don't initialize) storage.  This makes
  38. // exception safety easier.  Second, the base class encapsulates all of
  39. // the differences between SGI-style allocators and standard-conforming
  40. // allocators.
  41. #ifdef __STL_USE_STD_ALLOCATORS
  42. // Base class for ordinary allocators.
  43. template <class _T, class _Allocator, bool _IsStatic>
  44. class _Vector_alloc_base {
  45. public:
  46.   typedef typename _Alloc_traits<_T, _Allocator>::allocator_type
  47.           allocator_type;
  48.   allocator_type get_allocator() const { return _M_data_allocator; }
  49.   _Vector_alloc_base(const allocator_type& __a)
  50.     : _M_data_allocator(__a), _M_start(0), _M_finish(0), _M_end_of_storage(0) 
  51.   {}
  52.   
  53. protected:
  54.   allocator_type _M_data_allocator;
  55.   _T* _M_start;
  56.   _T* _M_finish;
  57.   _T* _M_end_of_storage;
  58.   _T* _M_allocate(size_t __n)
  59.     { return _M_data_allocator.allocate(__n); }
  60.   void _M_deallocate(_T* __p, size_t __n)
  61.     { if (__p) _M_data_allocator.deallocate(__p, __n); }
  62. };
  63. // Specialization for allocators that have the property that we don't
  64. // actually have to store an allocator object.  
  65. template <class _T, class _Allocator>
  66. class _Vector_alloc_base<_T, _Allocator, true> {
  67. public:
  68.   typedef typename _Alloc_traits<_T, _Allocator>::allocator_type
  69.           allocator_type;
  70.   allocator_type get_allocator() const { return allocator_type(); }
  71.   _Vector_alloc_base(const allocator_type&)
  72.     : _M_start(0), _M_finish(0), _M_end_of_storage(0) 
  73.   {}
  74.   
  75. protected:
  76.   _T* _M_start;
  77.   _T* _M_finish;
  78.   _T* _M_end_of_storage;
  79.   typedef typename _Alloc_traits<_T, _Allocator>::_Alloc_type _Alloc_type;
  80.   _T* _M_allocate(size_t __n)
  81.     { return _Alloc_type::allocate(__n); }
  82.   void _M_deallocate(_T* __p, size_t __n)
  83.     { _Alloc_type::deallocate(__p, __n);}
  84. };
  85. template <class _T, class _Alloc>
  86. struct _Vector_base
  87.   : public _Vector_alloc_base<_T, _Alloc,
  88.                               _Alloc_traits<_T, _Alloc>::_S_instanceless>
  89. {
  90.   typedef _Vector_alloc_base<_T, _Alloc, 
  91.                              _Alloc_traits<_T, _Alloc>::_S_instanceless>
  92.           _Base;
  93.   typedef typename _Base::allocator_type allocator_type;
  94.   _Vector_base(const allocator_type& __a) : _Base(__a) {}
  95.   _Vector_base(size_t __n, const allocator_type& __a) : _Base(__a) {
  96.     _M_start = _M_allocate(__n);
  97.     _M_finish = _M_start;
  98.     _M_end_of_storage = _M_start + __n;
  99.   }
  100.   ~_Vector_base() { _M_deallocate(_M_start, _M_end_of_storage - _M_start); }
  101. };    
  102. #else /* __STL_USE_STD_ALLOCATORS */
  103. template <class _T, class _Alloc> 
  104. class _Vector_base {
  105. public:
  106.   typedef _Alloc allocator_type;
  107.   allocator_type get_allocator() const { return allocator_type(); }
  108.   _Vector_base(const _Alloc&)
  109.     : _M_start(0), _M_finish(0), _M_end_of_storage(0) {}
  110.   _Vector_base(size_t __n, const _Alloc&)
  111.     : _M_start(0), _M_finish(0), _M_end_of_storage(0) 
  112.   {
  113.     _M_start = _M_allocate(__n);
  114.     _M_finish = _M_start;
  115.     _M_end_of_storage = _M_start + __n;
  116.   }
  117.   ~_Vector_base() { _M_deallocate(_M_start, _M_end_of_storage - _M_start); }
  118. protected:
  119.   _T* _M_start;
  120.   _T* _M_finish;
  121.   _T* _M_end_of_storage;
  122.   typedef simple_alloc<_T, _Alloc> _M_data_allocator;
  123.   _T* _M_allocate(size_t __n)
  124.     { return _M_data_allocator::allocate(__n); }
  125.   void _M_deallocate(_T* __p, size_t __n) 
  126.     { _M_data_allocator::deallocate(__p, __n); }
  127. };
  128. #endif /* __STL_USE_STD_ALLOCATORS */
  129. template <class _T, class _Alloc = __STL_DEFAULT_ALLOCATOR(_T) >
  130. class vector : protected _Vector_base<_T, _Alloc> 
  131. {
  132. private:
  133.   typedef _Vector_base<_T, _Alloc> _Base;
  134. public:
  135.   typedef _T value_type;
  136.   typedef value_type* pointer;
  137.   typedef const value_type* const_pointer;
  138.   typedef value_type* iterator;
  139.   typedef const value_type* const_iterator;
  140.   typedef value_type& reference;
  141.   typedef const value_type& const_reference;
  142.   typedef size_t size_type;
  143.   typedef ptrdiff_t difference_type;
  144.   typedef typename _Base::allocator_type allocator_type;
  145.   allocator_type get_allocator() const { return _Base::get_allocator(); }
  146. #ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
  147.   typedef reverse_iterator<const_iterator> const_reverse_iterator;
  148.   typedef reverse_iterator<iterator> reverse_iterator;
  149. #else /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  150.   typedef reverse_iterator<const_iterator, value_type, const_reference, 
  151.                            difference_type>  const_reverse_iterator;
  152.   typedef reverse_iterator<iterator, value_type, reference, difference_type>
  153.           reverse_iterator;
  154. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  155. protected:
  156. #ifdef __STL_HAS_NAMESPACES
  157.   using _Base::_M_allocate;
  158.   using _Base::_M_deallocate;
  159.   using _Base::_M_start;
  160.   using _Base::_M_finish;
  161.   using _Base::_M_end_of_storage;
  162. #endif /* __STL_HAS_NAMESPACES */
  163. protected:
  164.   void _M_insert_aux(iterator __position, const _T& __x);
  165.   void _M_insert_aux(iterator __position);
  166. public:
  167.   iterator begin() { return _M_start; }
  168.   const_iterator begin() const { return _M_start; }
  169.   iterator end() { return _M_finish; }
  170.   const_iterator end() const { return _M_finish; }
  171.   reverse_iterator rbegin()
  172.     { return reverse_iterator(end()); }
  173.   const_reverse_iterator rbegin() const
  174.     { return const_reverse_iterator(end()); }
  175.   reverse_iterator rend()
  176.     { return reverse_iterator(begin()); }
  177.   const_reverse_iterator rend() const
  178.     { return const_reverse_iterator(begin()); }
  179.   size_type size() const
  180.     { return size_type(end() - begin()); }
  181.   size_type max_size() const
  182.     { return size_type(-1) / sizeof(_T); }
  183.   size_type capacity() const
  184.     { return size_type(_M_end_of_storage - begin()); }
  185.   bool empty() const
  186.     { return begin() == end(); }
  187.   reference operator[](size_type __n) { return *(begin() + __n); }
  188.   const_reference operator[](size_type __n) const { return *(begin() + __n); }
  189.   explicit vector(const allocator_type& __a = allocator_type())
  190.     : _Base(__a) {}
  191.   vector(size_type __n, const _T& __value,
  192.          const allocator_type& __a = allocator_type()) 
  193.     : _Base(__n, __a)
  194.     { _M_finish = uninitialized_fill_n(_M_start, __n, __value); }
  195.   explicit vector(size_type __n)
  196.     : _Base(__n, allocator_type())
  197.     { _M_finish = uninitialized_fill_n(_M_start, __n, _T()); }
  198.   vector(const vector<_T, _Alloc>& __x) 
  199.     : _Base(__x.size(), __x.get_allocator())
  200.     { _M_finish = uninitialized_copy(__x.begin(), __x.end(), _M_start); }
  201. #ifdef __STL_MEMBER_TEMPLATES
  202.   // Check whether it's an integral type.  If so, it's not an iterator.
  203.   template <class _InputIterator>
  204.   vector(_InputIterator __first, _InputIterator __last,
  205.          const allocator_type& __a = allocator_type()) : _Base(__a) {
  206.     typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
  207.     _M_initialize_aux(__first, __last, _Integral());
  208.   }
  209.   template <class _Integer>
  210.   void _M_initialize_aux(_Integer __n, _Integer __value, __true_type) {
  211.     _M_start = _M_allocate(__n);
  212.     _M_end_of_storage = _M_start + __n; 
  213.     _M_finish = uninitialized_fill_n(_M_start, __n, __value);
  214.   }
  215.   template <class _InputIterator>
  216.   void _M_initialize_aux(_InputIterator __first, _InputIterator __last,
  217.                          __false_type) {
  218.     _M_range_initialize(__first, __last, __ITERATOR_CATEGORY(__first));
  219.   }
  220. #else
  221.   vector(const _T* __first, const _T* __last,
  222.          const allocator_type& __a = allocator_type())
  223.     : _Base(__last - __first, __a) 
  224.     { _M_finish = uninitialized_copy(__first, __last, _M_start); }
  225. #endif /* __STL_MEMBER_TEMPLATES */
  226.   ~vector() { destroy(_M_start, _M_finish); }
  227.   vector<_T, _Alloc>& operator=(const vector<_T, _Alloc>& __x);
  228.   void reserve(size_type __n) {
  229.     if (capacity() < __n) {
  230.       const size_type __old_size = size();
  231.       iterator __tmp = _M_allocate_and_copy(__n, _M_start, _M_finish);
  232.       destroy(_M_start, _M_finish);
  233.       _M_deallocate(_M_start, _M_end_of_storage - _M_start);
  234.       _M_start = __tmp;
  235.       _M_finish = __tmp + __old_size;
  236.       _M_end_of_storage = _M_start + __n;
  237.     }
  238.   }
  239.   // assign(), a generalized assignment member function.  Two
  240.   // versions: one that takes a count, and one that takes a range.
  241.   // The range version is a member template, so we dispatch on whether
  242.   // or not the type is an integer.
  243.   void assign(size_type __n, const _T& __val);
  244. #ifdef __STL_MEMBER_TEMPLATES
  245.   
  246.   template <class _InputIterator>
  247.   void assign(_InputIterator __first, _InputIterator __last) {
  248.     typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
  249.     _M_assign_dispatch(__first, __last, _Integral());
  250.   }
  251.   template <class _Integer>
  252.   void _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)
  253.     { assign((size_type) __n, (_T) __val); }
  254.   template <class _InputIter>
  255.   void _M_assign_dispatch(_InputIter __first, _InputIter __last, __false_type)
  256.     { _M_assign_aux(__first, __last, __ITERATOR_CATEGORY(__first)); }
  257.   template <class _InputIterator>
  258.   void _M_assign_aux(_InputIterator __first, _InputIterator __last,
  259.                      input_iterator_tag);
  260.   template <class _ForwardIterator>
  261.   void _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
  262.                      forward_iterator_tag); 
  263. #endif /* __STL_MEMBER_TEMPLATES */
  264.   reference front() { return *begin(); }
  265.   const_reference front() const { return *begin(); }
  266.   reference back() { return *(end() - 1); }
  267.   const_reference back() const { return *(end() - 1); }
  268.   void push_back(const _T& __x) {
  269.     if (_M_finish != _M_end_of_storage) {
  270.       construct(_M_finish, __x);
  271.       ++_M_finish;
  272.     }
  273.     else
  274.       _M_insert_aux(end(), __x);
  275.   }
  276.   void push_back() {
  277.     if (_M_finish != _M_end_of_storage) {
  278.       construct(_M_finish);
  279.       ++_M_finish;
  280.     }
  281.     else
  282.       _M_insert_aux(end());
  283.   }
  284.   void swap(vector<_T, _Alloc>& __x) {
  285.     __STD::swap(_M_start, __x._M_start);
  286.     __STD::swap(_M_finish, __x._M_finish);
  287.     __STD::swap(_M_end_of_storage, __x._M_end_of_storage);
  288.   }
  289.   iterator insert(iterator __position, const _T& __x) {
  290.     size_type __n = __position - begin();
  291.     if (_M_finish != _M_end_of_storage && __position == end()) {
  292.       construct(_M_finish, __x);
  293.       ++_M_finish;
  294.     }
  295.     else
  296.       _M_insert_aux(__position, __x);
  297.     return begin() + __n;
  298.   }
  299.   iterator insert(iterator __position) {
  300.     size_type __n = __position - begin();
  301.     if (_M_finish != _M_end_of_storage && __position == end()) {
  302.       construct(_M_finish);
  303.       ++_M_finish;
  304.     }
  305.     else
  306.       _M_insert_aux(__position);
  307.     return begin() + __n;
  308.   }
  309. #ifdef __STL_MEMBER_TEMPLATES
  310.   // Check whether it's an integral type.  If so, it's not an iterator.
  311.   template <class _InputIterator>
  312.   void insert(iterator __pos, _InputIterator __first, _InputIterator __last) {
  313.     typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
  314.     _M_insert_dispatch(__pos, __first, __last, _Integral());
  315.   }
  316.   template <class _Integer>
  317.   void _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __val,
  318.                           __true_type) {
  319.     insert(__pos, (size_type) __n, (_T) __val);
  320.   }
  321.   template <class _InputIterator>
  322.   void _M_insert_dispatch(iterator __pos,
  323.                           _InputIterator __first, _InputIterator __last,
  324.                           __false_type) {
  325.     _M_range_insert(__pos, __first, __last, __ITERATOR_CATEGORY(__first));
  326.   }
  327. #else /* __STL_MEMBER_TEMPLATES */
  328.   void insert(iterator __position,
  329.               const_iterator __first, const_iterator __last);
  330. #endif /* __STL_MEMBER_TEMPLATES */
  331.   void insert (iterator __pos, size_type __n, const _T& __x);
  332.   void pop_back() {
  333.     --_M_finish;
  334.     destroy(_M_finish);
  335.   }
  336.   iterator erase(iterator __position) {
  337.     if (__position + 1 != end())
  338.       copy(__position + 1, _M_finish, __position);
  339.     --_M_finish;
  340.     destroy(_M_finish);
  341.     return __position;
  342.   }
  343.   iterator erase(iterator __first, iterator __last) {
  344.     iterator __i = copy(__last, _M_finish, __first);
  345.     destroy(__i, _M_finish);
  346.     _M_finish = _M_finish - (__last - __first);
  347.     return __first;
  348.   }
  349.   void resize(size_type __new_size, const _T& __x) {
  350.     if (__new_size < size()) 
  351.       erase(begin() + __new_size, end());
  352.     else
  353.       insert(end(), __new_size - size(), __x);
  354.   }
  355.   void resize(size_type __new_size) { resize(__new_size, _T()); }
  356.   void clear() { erase(begin(), end()); }
  357. protected:
  358. #ifdef __STL_MEMBER_TEMPLATES
  359.   template <class _ForwardIterator>
  360.   iterator _M_allocate_and_copy(size_type __n, _ForwardIterator __first, 
  361.                                                _ForwardIterator __last)
  362. {
  363.     iterator __result = _M_allocate(__n);
  364.     __STL_TRY {
  365.       uninitialized_copy(__first, __last, __result);
  366.       return __result;
  367.     }
  368.     __STL_UNWIND(_M_deallocate(__result, __n));
  369.   }
  370. #else /* __STL_MEMBER_TEMPLATES */
  371.   iterator _M_allocate_and_copy(size_type __n, const_iterator __first, 
  372.                                                const_iterator __last)
  373.   {
  374.     iterator __result = _M_allocate(__n);
  375.     __STL_TRY {
  376.       uninitialized_copy(__first, __last, __result);
  377.       return __result;
  378.     }
  379.     __STL_UNWIND(_M_deallocate(__result, __n));
  380.   }
  381. #endif /* __STL_MEMBER_TEMPLATES */
  382. #ifdef __STL_MEMBER_TEMPLATES
  383.   template <class _InputIterator>
  384.   void _M_range_initialize(_InputIterator __first,  
  385.                            _InputIterator __last, input_iterator_tag)
  386.   {
  387.     for ( ; __first != __last; ++__first)
  388.       push_back(*__first);
  389.   }
  390.   // This function is only called by the constructor. 
  391.   template <class _ForwardIterator>
  392.   void _M_range_initialize(_ForwardIterator __first,
  393.                            _ForwardIterator __last, forward_iterator_tag)
  394.   {
  395.     size_type __n = 0;
  396.     distance(__first, __last, __n);
  397.     _M_start = _M_allocate(__n);
  398.     _M_end_of_storage = _M_start + __n;
  399.     _M_finish = uninitialized_copy(__first, __last, _M_start);
  400.   }
  401.   template <class _InputIterator>
  402.   void _M_range_insert(iterator __pos,
  403.                        _InputIterator __first, _InputIterator __last,
  404.                        input_iterator_tag);
  405.   template <class _ForwardIterator>
  406.   void _M_range_insert(iterator __pos,
  407.                        _ForwardIterator __first, _ForwardIterator __last,
  408.                        forward_iterator_tag);
  409. #endif /* __STL_MEMBER_TEMPLATES */
  410. };
  411. template <class _T, class _Alloc>
  412. inline bool 
  413. operator==(const vector<_T, _Alloc>& __x, const vector<_T, _Alloc>& __y)
  414. {
  415.   return __x.size() == __y.size() &&
  416.          equal(__x.begin(), __x.end(), __y.begin());
  417. }
  418. template <class _T, class _Alloc>
  419. inline bool 
  420. operator<(const vector<_T, _Alloc>& __x, const vector<_T, _Alloc>& __y)
  421. {
  422.   return lexicographical_compare(__x.begin(), __x.end(), 
  423.                                  __y.begin(), __y.end());
  424. }
  425. #ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER
  426. template <class _T, class _Alloc>
  427. inline void swap(vector<_T, _Alloc>& __x, vector<_T, _Alloc>& __y)
  428. {
  429.   __x.swap(__y);
  430. }
  431. #endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */
  432. template <class _T, class _Alloc>
  433. vector<_T,_Alloc>& 
  434. vector<_T,_Alloc>::operator=(const vector<_T, _Alloc>& __x)
  435. {
  436.   if (&__x != this) {
  437.     const size_type __xlen = __x.size();
  438.     if (__xlen > capacity()) {
  439.       iterator __tmp = _M_allocate_and_copy(__xlen, __x.begin(), __x.end());
  440.       destroy(_M_start, _M_finish);
  441.       _M_deallocate(_M_start, _M_end_of_storage - _M_start);
  442.       _M_start = __tmp;
  443.       _M_end_of_storage = _M_start + __xlen;
  444.     }
  445.     else if (size() >= __xlen) {
  446.       iterator __i = copy(__x.begin(), __x.end(), begin());
  447.       destroy(__i, _M_finish);
  448.     }
  449.     else {
  450.       copy(__x.begin(), __x.begin() + size(), _M_start);
  451.       uninitialized_copy(__x.begin() + size(), __x.end(), _M_finish);
  452.     }
  453.     _M_finish = _M_start + __xlen;
  454.   }
  455.   return *this;
  456. }
  457. template <class _T, class _Alloc>
  458. void vector<_T, _Alloc>::assign(size_t __n, const value_type& __val) {
  459.   if (__n > capacity()) {
  460.     vector<_T, _Alloc> __tmp(__n, __val, get_allocator());
  461.     __tmp.swap(*this);
  462.   }
  463.   else if (__n > size()) {
  464.     fill(begin(), end(), __val);
  465.     _M_finish = uninitialized_fill_n(_M_finish, __n - size(), __val);
  466.   }
  467.   else
  468.     erase(fill_n(begin(), __n, __val), end());
  469. }
  470. #ifdef __STL_MEMBER_TEMPLATES
  471. template <class _T, class _Alloc> template <class _InputIter>
  472. void vector<_T, _Alloc>::_M_assign_aux(_InputIter __first, _InputIter __last,
  473.                                        input_iterator_tag) {
  474.   iterator __cur = begin();
  475.   for ( ; __first != __last && __cur != end(); ++__cur, ++__first)
  476.     *__cur = *__first;
  477.   if (__first == __last)
  478.     erase(__cur, end());
  479.   else
  480.     insert(end(), __first, __last);
  481. }
  482. template <class _T, class _Alloc> template <class _ForwardIter>
  483. void
  484. vector<_T, _Alloc>::_M_assign_aux(_ForwardIter __first, _ForwardIter __last,
  485.                                   forward_iterator_tag) {
  486.   size_type __len = 0;
  487.   distance(__first, __last, __len);
  488.   if (__len > capacity()) {
  489.     iterator __tmp = _M_allocate_and_copy(__len, __first, __last);
  490.     destroy(_M_start, _M_finish);
  491.     _M_deallocate(_M_start, _M_end_of_storage - _M_start);
  492.     _M_start = __tmp;
  493.     _M_end_of_storage = _M_finish = _M_start + __len;
  494.   }
  495.   else if (size() >= __len) {
  496.     iterator __new_finish = copy(__first, __last, _M_start);
  497.     destroy(__new_finish, _M_finish);
  498.     _M_finish = __new_finish;
  499.   }
  500.   else {
  501.     _ForwardIter __mid = __first;
  502.     advance(__mid, size());
  503.     copy(__first, __mid, _M_start);
  504.     _M_finish = uninitialized_copy(__mid, __last, _M_finish);
  505.   }
  506. }
  507. #endif /* __STL_MEMBER_TEMPLATES */
  508. template <class _T, class _Alloc>
  509. void 
  510. vector<_T, _Alloc>::_M_insert_aux(iterator __position, const _T& __x)
  511. {
  512.   if (_M_finish != _M_end_of_storage) {
  513.     construct(_M_finish, *(_M_finish - 1));
  514.     ++_M_finish;
  515.     _T __x_copy = __x;
  516.     copy_backward(__position, _M_finish - 2, _M_finish - 1);
  517.     *__position = __x_copy;
  518.   }
  519.   else {
  520.     const size_type __old_size = size();
  521.     const size_type __len = __old_size != 0 ? 2 * __old_size : 1;
  522.     iterator __new_start = _M_allocate(__len);
  523.     iterator __new_finish = __new_start;
  524.     __STL_TRY {
  525.       __new_finish = uninitialized_copy(_M_start, __position, __new_start);
  526.       construct(__new_finish, __x);
  527.       ++__new_finish;
  528.       __new_finish = uninitialized_copy(__position, _M_finish, __new_finish);
  529.     }
  530.     __STL_UNWIND((destroy(__new_start,__new_finish), 
  531.                   _M_deallocate(__new_start,__len)));
  532.     destroy(begin(), end());
  533.     _M_deallocate(_M_start, _M_end_of_storage - _M_start);
  534.     _M_start = __new_start;
  535.     _M_finish = __new_finish;
  536.     _M_end_of_storage = __new_start + __len;
  537.   }
  538. }
  539. template <class _T, class _Alloc>
  540. void 
  541. vector<_T, _Alloc>::_M_insert_aux(iterator __position)
  542. {
  543.   if (_M_finish != _M_end_of_storage) {
  544.     construct(_M_finish, *(_M_finish - 1));
  545.     ++_M_finish;
  546.     copy_backward(__position, _M_finish - 2, _M_finish - 1);
  547.     *__position = _T();
  548.   }
  549.   else {
  550.     const size_type __old_size = size();
  551.     const size_type __len = __old_size != 0 ? 2 * __old_size : 1;
  552.     iterator __new_start = _M_allocate(__len);
  553.     iterator __new_finish = __new_start;
  554.     __STL_TRY {
  555.       __new_finish = uninitialized_copy(_M_start, __position, __new_start);
  556.       construct(__new_finish);
  557.       ++__new_finish;
  558.       __new_finish = uninitialized_copy(__position, _M_finish, __new_finish);
  559.     }
  560.     __STL_UNWIND((destroy(__new_start,__new_finish), 
  561.                   _M_deallocate(__new_start,__len)));
  562.     destroy(begin(), end());
  563.     _M_deallocate(_M_start, _M_end_of_storage - _M_start);
  564.     _M_start = __new_start;
  565.     _M_finish = __new_finish;
  566.     _M_end_of_storage = __new_start + __len;
  567.   }
  568. }
  569. template <class _T, class _Alloc>
  570. void vector<_T, _Alloc>::insert(iterator __position, size_type __n, 
  571.                                 const _T& __x)
  572. {
  573.   if (__n != 0) {
  574.     if (size_type(_M_end_of_storage - _M_finish) >= __n) {
  575.       _T __x_copy = __x;
  576.       const size_type __elems_after = _M_finish - __position;
  577.       iterator __old_finish = _M_finish;
  578.       if (__elems_after > __n) {
  579.         uninitialized_copy(_M_finish - __n, _M_finish, _M_finish);
  580.         _M_finish += __n;
  581.         copy_backward(__position, __old_finish - __n, __old_finish);
  582.         fill(__position, __position + __n, __x_copy);
  583.       }
  584.       else {
  585.         uninitialized_fill_n(_M_finish, __n - __elems_after, __x_copy);
  586.         _M_finish += __n - __elems_after;
  587.         uninitialized_copy(__position, __old_finish, _M_finish);
  588.         _M_finish += __elems_after;
  589.         fill(__position, __old_finish, __x_copy);
  590.       }
  591.     }
  592.     else {
  593.       const size_type __old_size = size();        
  594.       const size_type __len = __old_size + max(__old_size, __n);
  595.       iterator __new_start = _M_allocate(__len);
  596.       iterator __new_finish = __new_start;
  597.       __STL_TRY {
  598.         __new_finish = uninitialized_copy(_M_start, __position, __new_start);
  599.         __new_finish = uninitialized_fill_n(__new_finish, __n, __x);
  600.         __new_finish
  601.           = uninitialized_copy(__position, _M_finish, __new_finish);
  602.       }
  603.       __STL_UNWIND((destroy(__new_start,__new_finish), 
  604.                     _M_deallocate(__new_start,__len)));
  605.       destroy(_M_start, _M_finish);
  606.       _M_deallocate(_M_start, _M_end_of_storage - _M_start);
  607.       _M_start = __new_start;
  608.       _M_finish = __new_finish;
  609.       _M_end_of_storage = __new_start + __len;
  610.     }
  611.   }
  612. }
  613. #ifdef __STL_MEMBER_TEMPLATES
  614. template <class _T, class _Alloc> template <class _InputIterator>
  615. void 
  616. vector<_T, _Alloc>::_M_range_insert(iterator __pos, 
  617.                                     _InputIterator __first, 
  618.                                     _InputIterator __last,
  619.                                     input_iterator_tag)
  620. {
  621.   for ( ; __first != __last; ++__first) {
  622.     __pos = insert(__pos, *__first);
  623.     ++__pos;
  624.   }
  625. }
  626. template <class _T, class _Alloc> template <class _ForwardIterator>
  627. void 
  628. vector<_T, _Alloc>::_M_range_insert(iterator __position,
  629.                                     _ForwardIterator __first,
  630.                                     _ForwardIterator __last,
  631.                                     forward_iterator_tag)
  632. {
  633.   if (__first != __last) {
  634.     size_type __n = 0;
  635.     distance(__first, __last, __n);
  636.     if (size_type(_M_end_of_storage - _M_finish) >= __n) {
  637.       const size_type __elems_after = _M_finish - __position;
  638.       iterator __old_finish = _M_finish;
  639.       if (__elems_after > __n) {
  640.         uninitialized_copy(_M_finish - __n, _M_finish, _M_finish);
  641.         _M_finish += __n;
  642.         copy_backward(__position, __old_finish - __n, __old_finish);
  643.         copy(__first, __last, __position);
  644.       }
  645.       else {
  646.         _ForwardIterator __mid = __first;
  647.         advance(__mid, __elems_after);
  648.         uninitialized_copy(__mid, __last, _M_finish);
  649.         _M_finish += __n - __elems_after;
  650.         uninitialized_copy(__position, __old_finish, _M_finish);
  651.         _M_finish += __elems_after;
  652.         copy(__first, __mid, __position);
  653.       }
  654.     }
  655.     else {
  656.       const size_type __old_size = size();
  657.       const size_type __len = __old_size + max(__old_size, __n);
  658.       iterator __new_start = _M_allocate(__len);
  659.       iterator __new_finish = __new_start;
  660.       __STL_TRY {
  661.         __new_finish = uninitialized_copy(_M_start, __position, __new_start);
  662.         __new_finish = uninitialized_copy(__first, __last, __new_finish);
  663.         __new_finish
  664.           = uninitialized_copy(__position, _M_finish, __new_finish);
  665.       }
  666.       __STL_UNWIND((destroy(__new_start,__new_finish), 
  667.                     _M_deallocate(__new_start,__len)));
  668.       destroy(_M_start, _M_finish);
  669.       _M_deallocate(_M_start, _M_end_of_storage - _M_start);
  670.       _M_start = __new_start;
  671.       _M_finish = __new_finish;
  672.       _M_end_of_storage = __new_start + __len;
  673.     }
  674.   }
  675. }
  676. #else /* __STL_MEMBER_TEMPLATES */
  677. template <class _T, class _Alloc>
  678. void 
  679. vector<_T, _Alloc>::insert(iterator __position, 
  680.                            const_iterator __first, 
  681.                            const_iterator __last)
  682. {
  683.   if (__first != __last) {
  684.     size_type __n = 0;
  685.     distance(__first, __last, __n);
  686.     if (size_type(_M_end_of_storage - _M_finish) >= __n) {
  687.       const size_type __elems_after = _M_finish - __position;
  688.       iterator __old_finish = _M_finish;
  689.       if (__elems_after > __n) {
  690.         uninitialized_copy(_M_finish - __n, _M_finish, _M_finish);
  691.         _M_finish += __n;
  692.         copy_backward(__position, __old_finish - __n, __old_finish);
  693.         copy(__first, __last, __position);
  694.       }
  695.       else {
  696.         uninitialized_copy(__first + __elems_after, __last, _M_finish);
  697.         _M_finish += __n - __elems_after;
  698.         uninitialized_copy(__position, __old_finish, _M_finish);
  699.         _M_finish += __elems_after;
  700.         copy(__first, __first + __elems_after, __position);
  701.       }
  702.     }
  703.     else {
  704.       const size_type __old_size = size();
  705.       const size_type __len = __old_size + max(__old_size, __n);
  706.       iterator __new_start = _M_allocate(__len);
  707.       iterator __new_finish = __new_start;
  708.       __STL_TRY {
  709.         __new_finish = uninitialized_copy(_M_start, __position, __new_start);
  710.         __new_finish = uninitialized_copy(__first, __last, __new_finish);
  711.         __new_finish
  712.           = uninitialized_copy(__position, _M_finish, __new_finish);
  713.       }
  714.       __STL_UNWIND((destroy(__new_start,__new_finish),
  715.                     _M_deallocate(__new_start,__len)));
  716.       destroy(_M_start, _M_finish);
  717.       _M_deallocate(_M_start, _M_end_of_storage - _M_start);
  718.       _M_start = __new_start;
  719.       _M_finish = __new_finish;
  720.       _M_end_of_storage = __new_start + __len;
  721.     }
  722.   }
  723. }
  724. #endif /* __STL_MEMBER_TEMPLATES */
  725. #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
  726. #pragma reset woff 1174
  727. #pragma reset woff 1375
  728. #endif
  729. __STL_END_NAMESPACE 
  730. #endif /* __SGI_STL_INTERNAL_VECTOR_H */
  731. // Local Variables:
  732. // mode:C++
  733. // End: