00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053 
00054 
00055 
00061 #ifndef _DEQUE_TCC
00062 #define _DEQUE_TCC 1
00063 
00064 namespace _GLIBCXX_STD
00065 {
00066   template <typename _Tp, typename _Alloc>
00067     deque<_Tp,_Alloc>&
00068     deque<_Tp,_Alloc>::
00069     operator=(const deque& __x)
00070     {
00071       const size_type __len = size();
00072       if (&__x != this)
00073     {
00074       if (__len >= __x.size())
00075         erase(std::copy(__x.begin(), __x.end(), this->_M_impl._M_start),
00076           this->_M_impl._M_finish);
00077       else
00078         {
00079           const_iterator __mid = __x.begin() + difference_type(__len);
00080           std::copy(__x.begin(), __mid, this->_M_impl._M_start);
00081           insert(this->_M_impl._M_finish, __mid, __x.end());
00082         }
00083     }
00084       return *this;
00085     }
00086 
00087   template <typename _Tp, typename _Alloc>
00088     typename deque<_Tp,_Alloc>::iterator
00089     deque<_Tp,_Alloc>::
00090     insert(iterator position, const value_type& __x)
00091     {
00092       if (position._M_cur == this->_M_impl._M_start._M_cur)
00093     {
00094       push_front(__x);
00095       return this->_M_impl._M_start;
00096     }
00097       else if (position._M_cur == this->_M_impl._M_finish._M_cur)
00098     {
00099       push_back(__x);
00100       iterator __tmp = this->_M_impl._M_finish;
00101       --__tmp;
00102       return __tmp;
00103     }
00104       else
00105         return _M_insert_aux(position, __x);
00106     }
00107 
00108   template <typename _Tp, typename _Alloc>
00109     typename deque<_Tp,_Alloc>::iterator
00110     deque<_Tp,_Alloc>::
00111     erase(iterator __position)
00112     {
00113       iterator __next = __position;
00114       ++__next;
00115       size_type __index = __position - this->_M_impl._M_start;
00116       if (__index < (size() >> 1))
00117     {
00118       std::copy_backward(this->_M_impl._M_start, __position, __next);
00119       pop_front();
00120     }
00121       else
00122     {
00123       std::copy(__next, this->_M_impl._M_finish, __position);
00124       pop_back();
00125     }
00126       return this->_M_impl._M_start + __index;
00127     }
00128 
00129   template <typename _Tp, typename _Alloc>
00130     typename deque<_Tp,_Alloc>::iterator
00131     deque<_Tp,_Alloc>::
00132     erase(iterator __first, iterator __last)
00133     {
00134       if (__first == this->_M_impl._M_start && __last == this->_M_impl._M_finish)
00135     {
00136       clear();
00137       return this->_M_impl._M_finish;
00138     }
00139       else
00140     {
00141       const difference_type __n = __last - __first;
00142       const difference_type __elems_before = __first - this->_M_impl._M_start;
00143       if (static_cast<size_type>(__elems_before) < (size() - __n) / 2)
00144         {
00145           std::copy_backward(this->_M_impl._M_start, __first, __last);
00146           iterator __new_start = this->_M_impl._M_start + __n;
00147           std::_Destroy(this->_M_impl._M_start, __new_start);
00148           _M_destroy_nodes(this->_M_impl._M_start._M_node, __new_start._M_node);
00149           this->_M_impl._M_start = __new_start;
00150         }
00151       else
00152         {
00153           std::copy(__last, this->_M_impl._M_finish, __first);
00154           iterator __new_finish = this->_M_impl._M_finish - __n;
00155           std::_Destroy(__new_finish, this->_M_impl._M_finish);
00156           _M_destroy_nodes(__new_finish._M_node + 1,
00157                    this->_M_impl._M_finish._M_node + 1);
00158           this->_M_impl._M_finish = __new_finish;
00159         }
00160       return this->_M_impl._M_start + __elems_before;
00161     }
00162     }
00163 
00164   template <typename _Tp, typename _Alloc>
00165     void
00166     deque<_Tp,_Alloc>::
00167     clear()
00168     {
00169       for (_Map_pointer __node = this->_M_impl._M_start._M_node + 1;
00170            __node < this->_M_impl._M_finish._M_node;
00171            ++__node)
00172     {
00173       std::_Destroy(*__node, *__node + _S_buffer_size());
00174       _M_deallocate_node(*__node);
00175     }
00176 
00177       if (this->_M_impl._M_start._M_node != this->_M_impl._M_finish._M_node)
00178     {
00179       std::_Destroy(this->_M_impl._M_start._M_cur, this->_M_impl._M_start._M_last);
00180       std::_Destroy(this->_M_impl._M_finish._M_first, this->_M_impl._M_finish._M_cur);
00181       _M_deallocate_node(this->_M_impl._M_finish._M_first);
00182     }
00183       else
00184         std::_Destroy(this->_M_impl._M_start._M_cur, this->_M_impl._M_finish._M_cur);
00185 
00186       this->_M_impl._M_finish = this->_M_impl._M_start;
00187     }
00188 
00189   template <typename _Tp, class _Alloc>
00190     template <typename _InputIterator>
00191       void
00192       deque<_Tp,_Alloc>
00193       ::_M_assign_aux(_InputIterator __first, _InputIterator __last,
00194               input_iterator_tag)
00195       {
00196         iterator __cur = begin();
00197         for ( ; __first != __last && __cur != end(); ++__cur, ++__first)
00198           *__cur = *__first;
00199         if (__first == __last)
00200           erase(__cur, end());
00201         else
00202           insert(end(), __first, __last);
00203       }
00204 
00205   template <typename _Tp, typename _Alloc>
00206     void
00207     deque<_Tp,_Alloc>::
00208     _M_fill_insert(iterator __pos, size_type __n, const value_type& __x)
00209     {
00210       if (__pos._M_cur == this->_M_impl._M_start._M_cur)
00211     {
00212       iterator __new_start = _M_reserve_elements_at_front(__n);
00213       try
00214         {
00215           std::uninitialized_fill(__new_start, this->_M_impl._M_start, __x);
00216           this->_M_impl._M_start = __new_start;
00217         }
00218       catch(...)
00219         {
00220           _M_destroy_nodes(__new_start._M_node, this->_M_impl._M_start._M_node);
00221           __throw_exception_again;
00222         }
00223     }
00224       else if (__pos._M_cur == this->_M_impl._M_finish._M_cur)
00225     {
00226       iterator __new_finish = _M_reserve_elements_at_back(__n);
00227       try
00228         {
00229           std::uninitialized_fill(this->_M_impl._M_finish, __new_finish, __x);
00230           this->_M_impl._M_finish = __new_finish;
00231         }
00232       catch(...)
00233         {
00234           _M_destroy_nodes(this->_M_impl._M_finish._M_node + 1,
00235                    __new_finish._M_node + 1);
00236           __throw_exception_again;
00237         }
00238     }
00239       else
00240         _M_insert_aux(__pos, __n, __x);
00241     }
00242 
00243   template <typename _Tp, typename _Alloc>
00244     void
00245     deque<_Tp,_Alloc>::
00246     _M_fill_initialize(const value_type& __value)
00247     {
00248       _Map_pointer __cur;
00249       try
00250         {
00251           for (__cur = this->_M_impl._M_start._M_node;
00252            __cur < this->_M_impl._M_finish._M_node;
00253            ++__cur)
00254             std::uninitialized_fill(*__cur, *__cur + _S_buffer_size(), __value);
00255           std::uninitialized_fill(this->_M_impl._M_finish._M_first,
00256                   this->_M_impl._M_finish._M_cur,
00257                   __value);
00258         }
00259       catch(...)
00260         {
00261           std::_Destroy(this->_M_impl._M_start, iterator(*__cur, __cur));
00262           __throw_exception_again;
00263         }
00264     }
00265 
00266   template <typename _Tp, typename _Alloc>
00267     template <typename _InputIterator>
00268       void
00269       deque<_Tp,_Alloc>::
00270       _M_range_initialize(_InputIterator __first, _InputIterator __last,
00271                           input_iterator_tag)
00272       {
00273         this->_M_initialize_map(0);
00274         try
00275           {
00276             for ( ; __first != __last; ++__first)
00277               push_back(*__first);
00278           }
00279         catch(...)
00280           {
00281             clear();
00282             __throw_exception_again;
00283           }
00284       }
00285 
00286   template <typename _Tp, typename _Alloc>
00287     template <typename _ForwardIterator>
00288       void
00289       deque<_Tp,_Alloc>::
00290       _M_range_initialize(_ForwardIterator __first, _ForwardIterator __last,
00291                           forward_iterator_tag)
00292       {
00293         const size_type __n = std::distance(__first, __last);
00294         this->_M_initialize_map(__n);
00295 
00296         _Map_pointer __cur_node;
00297         try
00298           {
00299             for (__cur_node = this->_M_impl._M_start._M_node;
00300                  __cur_node < this->_M_impl._M_finish._M_node;
00301                  ++__cur_node)
00302             {
00303               _ForwardIterator __mid = __first;
00304               std::advance(__mid, _S_buffer_size());
00305               std::uninitialized_copy(__first, __mid, *__cur_node);
00306               __first = __mid;
00307             }
00308             std::uninitialized_copy(__first, __last, this->_M_impl._M_finish._M_first);
00309           }
00310         catch(...)
00311           {
00312             std::_Destroy(this->_M_impl._M_start, iterator(*__cur_node, __cur_node));
00313             __throw_exception_again;
00314           }
00315       }
00316 
00317   
00318   template <typename _Tp, typename _Alloc>
00319     void
00320     deque<_Tp,_Alloc>::
00321     _M_push_back_aux(const value_type& __t)
00322     {
00323       value_type __t_copy = __t;
00324       _M_reserve_map_at_back();
00325       *(this->_M_impl._M_finish._M_node + 1) = this->_M_allocate_node();
00326       try
00327         {
00328           std::_Construct(this->_M_impl._M_finish._M_cur, __t_copy);
00329           this->_M_impl._M_finish._M_set_node(this->_M_impl._M_finish._M_node + 1);
00330           this->_M_impl._M_finish._M_cur = this->_M_impl._M_finish._M_first;
00331         }
00332       catch(...)
00333         {
00334           _M_deallocate_node(*(this->_M_impl._M_finish._M_node + 1));
00335           __throw_exception_again;
00336         }
00337     }
00338 
00339   
00340   template <typename _Tp, typename _Alloc>
00341     void
00342     deque<_Tp,_Alloc>::
00343     _M_push_front_aux(const value_type& __t)
00344     {
00345       value_type __t_copy = __t;
00346       _M_reserve_map_at_front();
00347       *(this->_M_impl._M_start._M_node - 1) = this->_M_allocate_node();
00348       try
00349         {
00350           this->_M_impl._M_start._M_set_node(this->_M_impl._M_start._M_node - 1);
00351           this->_M_impl._M_start._M_cur = this->_M_impl._M_start._M_last - 1;
00352           std::_Construct(this->_M_impl._M_start._M_cur, __t_copy);
00353         }
00354       catch(...)
00355         {
00356           ++this->_M_impl._M_start;
00357           _M_deallocate_node(*(this->_M_impl._M_start._M_node - 1));
00358           __throw_exception_again;
00359         }
00360     }
00361 
00362   
00363   template <typename _Tp, typename _Alloc>
00364     void deque<_Tp,_Alloc>::
00365     _M_pop_back_aux()
00366     {
00367       _M_deallocate_node(this->_M_impl._M_finish._M_first);
00368       this->_M_impl._M_finish._M_set_node(this->_M_impl._M_finish._M_node - 1);
00369       this->_M_impl._M_finish._M_cur = this->_M_impl._M_finish._M_last - 1;
00370       std::_Destroy(this->_M_impl._M_finish._M_cur);
00371     }
00372 
00373   
00374   
00375   
00376   
00377   template <typename _Tp, typename _Alloc>
00378     void deque<_Tp,_Alloc>::
00379     _M_pop_front_aux()
00380     {
00381       std::_Destroy(this->_M_impl._M_start._M_cur);
00382       _M_deallocate_node(this->_M_impl._M_start._M_first);
00383       this->_M_impl._M_start._M_set_node(this->_M_impl._M_start._M_node + 1);
00384       this->_M_impl._M_start._M_cur = this->_M_impl._M_start._M_first;
00385     }
00386 
00387   template <typename _Tp, typename _Alloc>
00388     template <typename _InputIterator>
00389       void
00390       deque<_Tp,_Alloc>::
00391       _M_range_insert_aux(iterator __pos,
00392                           _InputIterator __first, _InputIterator __last,
00393                           input_iterator_tag)
00394       { std::copy(__first, __last, std::inserter(*this, __pos)); }
00395 
00396   template <typename _Tp, typename _Alloc>
00397     template <typename _ForwardIterator>
00398       void
00399       deque<_Tp,_Alloc>::
00400       _M_range_insert_aux(iterator __pos,
00401                           _ForwardIterator __first, _ForwardIterator __last,
00402                           forward_iterator_tag)
00403       {
00404         size_type __n = std::distance(__first, __last);
00405         if (__pos._M_cur == this->_M_impl._M_start._M_cur)
00406       {
00407         iterator __new_start = _M_reserve_elements_at_front(__n);
00408         try
00409           {
00410         std::uninitialized_copy(__first, __last, __new_start);
00411         this->_M_impl._M_start = __new_start;
00412           }
00413         catch(...)
00414           {
00415         _M_destroy_nodes(__new_start._M_node, this->_M_impl._M_start._M_node);
00416         __throw_exception_again;
00417           }
00418       }
00419         else if (__pos._M_cur == this->_M_impl._M_finish._M_cur)
00420       {
00421         iterator __new_finish = _M_reserve_elements_at_back(__n);
00422         try
00423           {
00424         std::uninitialized_copy(__first, __last, this->_M_impl._M_finish);
00425         this->_M_impl._M_finish = __new_finish;
00426           }
00427         catch(...)
00428           {
00429         _M_destroy_nodes(this->_M_impl._M_finish._M_node + 1,
00430                  __new_finish._M_node + 1);
00431         __throw_exception_again;
00432           }
00433       }
00434         else
00435           _M_insert_aux(__pos, __first, __last, __n);
00436       }
00437 
00438   template <typename _Tp, typename _Alloc>
00439     typename deque<_Tp, _Alloc>::iterator
00440     deque<_Tp,_Alloc>::
00441     _M_insert_aux(iterator __pos, const value_type& __x)
00442     {
00443       difference_type __index = __pos - this->_M_impl._M_start;
00444       value_type __x_copy = __x; 
00445       if (static_cast<size_type>(__index) < size() / 2)
00446     {
00447       push_front(front());
00448       iterator __front1 = this->_M_impl._M_start;
00449       ++__front1;
00450       iterator __front2 = __front1;
00451       ++__front2;
00452       __pos = this->_M_impl._M_start + __index;
00453       iterator __pos1 = __pos;
00454       ++__pos1;
00455       std::copy(__front2, __pos1, __front1);
00456     }
00457       else
00458     {
00459       push_back(back());
00460       iterator __back1 = this->_M_impl._M_finish;
00461       --__back1;
00462       iterator __back2 = __back1;
00463       --__back2;
00464       __pos = this->_M_impl._M_start + __index;
00465       std::copy_backward(__pos, __back2, __back1);
00466     }
00467       *__pos = __x_copy;
00468       return __pos;
00469     }
00470 
00471   template <typename _Tp, typename _Alloc>
00472     void
00473     deque<_Tp,_Alloc>::
00474     _M_insert_aux(iterator __pos, size_type __n, const value_type& __x)
00475     {
00476       const difference_type __elems_before = __pos - this->_M_impl._M_start;
00477       size_type __length = this->size();
00478       value_type __x_copy = __x;
00479       if (__elems_before < difference_type(__length / 2))
00480     {
00481       iterator __new_start = _M_reserve_elements_at_front(__n);
00482       iterator __old_start = this->_M_impl._M_start;
00483       __pos = this->_M_impl._M_start + __elems_before;
00484       try
00485         {
00486           if (__elems_before >= difference_type(__n))
00487         {
00488           iterator __start_n = this->_M_impl._M_start + difference_type(__n);
00489           std::uninitialized_copy(this->_M_impl._M_start, __start_n,
00490                       __new_start);
00491           this->_M_impl._M_start = __new_start;
00492           std::copy(__start_n, __pos, __old_start);
00493           fill(__pos - difference_type(__n), __pos, __x_copy);
00494         }
00495           else
00496         {
00497           std::__uninitialized_copy_fill(this->_M_impl._M_start, __pos,
00498                          __new_start,
00499                          this->_M_impl._M_start, __x_copy);
00500           this->_M_impl._M_start = __new_start;
00501           std::fill(__old_start, __pos, __x_copy);
00502         }
00503         }
00504       catch(...)
00505         {
00506           _M_destroy_nodes(__new_start._M_node, this->_M_impl._M_start._M_node);
00507           __throw_exception_again;
00508         }
00509     }
00510       else
00511     {
00512       iterator __new_finish = _M_reserve_elements_at_back(__n);
00513       iterator __old_finish = this->_M_impl._M_finish;
00514       const difference_type __elems_after =
00515         difference_type(__length) - __elems_before;
00516       __pos = this->_M_impl._M_finish - __elems_after;
00517       try
00518         {
00519           if (__elems_after > difference_type(__n))
00520         {
00521           iterator __finish_n = this->_M_impl._M_finish - difference_type(__n);
00522           std::uninitialized_copy(__finish_n, this->_M_impl._M_finish,
00523                       this->_M_impl._M_finish);
00524           this->_M_impl._M_finish = __new_finish;
00525           std::copy_backward(__pos, __finish_n, __old_finish);
00526           std::fill(__pos, __pos + difference_type(__n), __x_copy);
00527         }
00528           else
00529         {
00530           std::__uninitialized_fill_copy(this->_M_impl._M_finish,
00531                          __pos + difference_type(__n),
00532                          __x_copy, __pos,
00533                          this->_M_impl._M_finish);
00534           this->_M_impl._M_finish = __new_finish;
00535           std::fill(__pos, __old_finish, __x_copy);
00536         }
00537         }
00538       catch(...)
00539         {
00540           _M_destroy_nodes(this->_M_impl._M_finish._M_node + 1,
00541                    __new_finish._M_node + 1);
00542           __throw_exception_again;
00543         }
00544     }
00545     }
00546 
00547   template <typename _Tp, typename _Alloc>
00548     template <typename _ForwardIterator>
00549       void
00550       deque<_Tp,_Alloc>::
00551       _M_insert_aux(iterator __pos,
00552                     _ForwardIterator __first, _ForwardIterator __last,
00553                     size_type __n)
00554       {
00555         const difference_type __elemsbefore = __pos - this->_M_impl._M_start;
00556         size_type __length = size();
00557         if (static_cast<size_type>(__elemsbefore) < __length / 2)
00558       {
00559         iterator __new_start = _M_reserve_elements_at_front(__n);
00560         iterator __old_start = this->_M_impl._M_start;
00561         __pos = this->_M_impl._M_start + __elemsbefore;
00562         try
00563           {
00564         if (__elemsbefore >= difference_type(__n))
00565           {
00566             iterator __start_n = this->_M_impl._M_start + difference_type(__n);
00567             std::uninitialized_copy(this->_M_impl._M_start, __start_n,
00568                         __new_start);
00569             this->_M_impl._M_start = __new_start;
00570             std::copy(__start_n, __pos, __old_start);
00571             std::copy(__first, __last, __pos - difference_type(__n));
00572           }
00573         else
00574           {
00575             _ForwardIterator __mid = __first;
00576             std::advance(__mid, difference_type(__n) - __elemsbefore);
00577             std::__uninitialized_copy_copy(this->_M_impl._M_start, __pos,
00578                            __first, __mid, __new_start);
00579             this->_M_impl._M_start = __new_start;
00580             std::copy(__mid, __last, __old_start);
00581           }
00582           }
00583         catch(...)
00584           {
00585         _M_destroy_nodes(__new_start._M_node, this->_M_impl._M_start._M_node);
00586         __throw_exception_again;
00587           }
00588       }
00589         else
00590         {
00591           iterator __new_finish = _M_reserve_elements_at_back(__n);
00592           iterator __old_finish = this->_M_impl._M_finish;
00593           const difference_type __elemsafter =
00594             difference_type(__length) - __elemsbefore;
00595           __pos = this->_M_impl._M_finish - __elemsafter;
00596           try
00597             {
00598               if (__elemsafter > difference_type(__n))
00599         {
00600           iterator __finish_n = this->_M_impl._M_finish - difference_type(__n);
00601           std::uninitialized_copy(__finish_n,
00602                       this->_M_impl._M_finish,
00603                       this->_M_impl._M_finish);
00604           this->_M_impl._M_finish = __new_finish;
00605           std::copy_backward(__pos, __finish_n, __old_finish);
00606           std::copy(__first, __last, __pos);
00607         }
00608               else
00609         {
00610           _ForwardIterator __mid = __first;
00611           std::advance(__mid, __elemsafter);
00612           std::__uninitialized_copy_copy(__mid, __last, __pos,
00613                          this->_M_impl._M_finish,
00614                          this->_M_impl._M_finish);
00615           this->_M_impl._M_finish = __new_finish;
00616           std::copy(__first, __mid, __pos);
00617         }
00618             }
00619           catch(...)
00620             {
00621               _M_destroy_nodes(this->_M_impl._M_finish._M_node + 1,
00622                    __new_finish._M_node + 1);
00623               __throw_exception_again;
00624             }
00625         }
00626       }
00627 
00628   template <typename _Tp, typename _Alloc>
00629     void
00630     deque<_Tp,_Alloc>::
00631     _M_new_elements_at_front(size_type __new_elems)
00632     {
00633       size_type __new_nodes
00634     = (__new_elems + _S_buffer_size() - 1) / _S_buffer_size();
00635       _M_reserve_map_at_front(__new_nodes);
00636       size_type __i;
00637       try
00638         {
00639           for (__i = 1; __i <= __new_nodes; ++__i)
00640             *(this->_M_impl._M_start._M_node - __i) = this->_M_allocate_node();
00641         }
00642       catch(...)
00643         {
00644           for (size_type __j = 1; __j < __i; ++__j)
00645             _M_deallocate_node(*(this->_M_impl._M_start._M_node - __j));
00646           __throw_exception_again;
00647         }
00648     }
00649 
00650   template <typename _Tp, typename _Alloc>
00651     void
00652     deque<_Tp,_Alloc>::
00653     _M_new_elements_at_back(size_type __new_elems)
00654     {
00655       size_type __new_nodes
00656           = (__new_elems + _S_buffer_size() - 1) / _S_buffer_size();
00657       _M_reserve_map_at_back(__new_nodes);
00658       size_type __i;
00659       try
00660         {
00661           for (__i = 1; __i <= __new_nodes; ++__i)
00662             *(this->_M_impl._M_finish._M_node + __i) = this->_M_allocate_node();
00663         }
00664       catch(...)
00665         {
00666           for (size_type __j = 1; __j < __i; ++__j)
00667             _M_deallocate_node(*(this->_M_impl._M_finish._M_node + __j));
00668           __throw_exception_again;
00669         }
00670     }
00671 
00672   template <typename _Tp, typename _Alloc>
00673     void
00674     deque<_Tp,_Alloc>::
00675     _M_reallocate_map(size_type __nodes_to_add, bool __add_at_front)
00676     {
00677       size_type __old_num_nodes
00678     = this->_M_impl._M_finish._M_node - this->_M_impl._M_start._M_node + 1;
00679       size_type __new_num_nodes = __old_num_nodes + __nodes_to_add;
00680 
00681       _Map_pointer __new_nstart;
00682       if (this->_M_impl._M_map_size > 2 * __new_num_nodes)
00683     {
00684       __new_nstart = this->_M_impl._M_map + (this->_M_impl._M_map_size
00685                      - __new_num_nodes) / 2
00686                      + (__add_at_front ? __nodes_to_add : 0);
00687       if (__new_nstart < this->_M_impl._M_start._M_node)
00688         std::copy(this->_M_impl._M_start._M_node,
00689             this->_M_impl._M_finish._M_node + 1,
00690             __new_nstart);
00691       else
00692         std::copy_backward(this->_M_impl._M_start._M_node,
00693                    this->_M_impl._M_finish._M_node + 1,
00694                    __new_nstart + __old_num_nodes);
00695     }
00696       else
00697     {
00698       size_type __new_map_size = this->_M_impl._M_map_size
00699                                  + std::max(this->_M_impl._M_map_size,
00700                         __nodes_to_add) + 2;
00701 
00702       _Map_pointer __new_map = this->_M_allocate_map(__new_map_size);
00703       __new_nstart = __new_map + (__new_map_size - __new_num_nodes) / 2
00704                      + (__add_at_front ? __nodes_to_add : 0);
00705       std::copy(this->_M_impl._M_start._M_node,
00706             this->_M_impl._M_finish._M_node + 1,
00707             __new_nstart);
00708       _M_deallocate_map(this->_M_impl._M_map, this->_M_impl._M_map_size);
00709 
00710       this->_M_impl._M_map = __new_map;
00711       this->_M_impl._M_map_size = __new_map_size;
00712     }
00713 
00714       this->_M_impl._M_start._M_set_node(__new_nstart);
00715       this->_M_impl._M_finish._M_set_node(__new_nstart + __old_num_nodes - 1);
00716     }
00717 } 
00718 
00719 #endif