ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

_deque.c
Go to the documentation of this file.
00001 /*
00002  *
00003  *
00004  * Copyright (c) 1994
00005  * Hewlett-Packard Company
00006  *
00007  * Copyright (c) 1996,1997
00008  * Silicon Graphics Computer Systems, Inc.
00009  *
00010  * Copyright (c) 1997
00011  * Moscow Center for SPARC Technology
00012  *
00013  * Copyright (c) 1999
00014  * Boris Fomitchev
00015  *
00016  * This material is provided "as is", with absolutely no warranty expressed
00017  * or implied. Any use is at your own risk.
00018  *
00019  * Permission to use or copy this software for any purpose is hereby granted
00020  * without fee, provided the above notices are retained on all copies.
00021  * Permission to modify the code and to distribute modified code is granted,
00022  * provided the above notices are retained, and a notice that the code was
00023  * modified is included with the above copyright notice.
00024  *
00025  */
00026 #ifndef _STLP_DEQUE_C
00027 #define _STLP_DEQUE_C
00028 
00029 #ifndef _STLP_INTERNAL_DEQUE_H
00030 #  include <stl/_deque.h>
00031 #endif
00032 
00033 _STLP_BEGIN_NAMESPACE
00034 
00035 _STLP_MOVE_TO_PRIV_NAMESPACE
00036 
00037 // Non-inline member functions from _Deque_base.
00038 
00039 template <class _Tp, class _Alloc >
00040 _Deque_base<_Tp,_Alloc >::~_Deque_base() {
00041   if (_M_map._M_data) {
00042     _M_destroy_nodes(_M_start._M_node, this->_M_finish._M_node + 1);
00043     _M_map.deallocate(_M_map._M_data, _M_map_size._M_data);
00044   }
00045 }
00046 
00047 template <class _Tp, class _Alloc >
00048 void _Deque_base<_Tp,_Alloc>::_M_initialize_map(size_t __num_elements) {
00049   size_t __num_nodes = __num_elements / this->buffer_size() + 1 ;
00050 
00051   _M_map_size._M_data = (max)((size_t) _S_initial_map_size, __num_nodes + 2);
00052   _M_map._M_data = _M_map.allocate(_M_map_size._M_data);
00053 
00054   _Tp** __nstart = _M_map._M_data + (_M_map_size._M_data - __num_nodes) / 2;
00055   _Tp** __nfinish = __nstart + __num_nodes;
00056 
00057   _STLP_TRY {
00058     _M_create_nodes(__nstart, __nfinish);
00059   }
00060   _STLP_UNWIND((_M_map.deallocate(_M_map._M_data, _M_map_size._M_data),
00061                 _M_map._M_data = 0, _M_map_size._M_data = 0))
00062   _M_start._M_set_node(__nstart);
00063   this->_M_finish._M_set_node(__nfinish - 1);
00064   _M_start._M_cur = _M_start._M_first;
00065   this->_M_finish._M_cur = this->_M_finish._M_first + __num_elements % this->buffer_size();
00066 }
00067 
00068 template <class _Tp, class _Alloc >
00069 void _Deque_base<_Tp,_Alloc>::_M_create_nodes(_Tp** __nstart,
00070                                               _Tp** __nfinish) {
00071   _Tp** __cur = __nstart;
00072   _STLP_TRY {
00073     for (; __cur < __nfinish; ++__cur)
00074       *__cur = _M_map_size.allocate(this->buffer_size());
00075   }
00076   _STLP_UNWIND(_M_destroy_nodes(__nstart, __cur))
00077 }
00078 
00079 template <class _Tp, class _Alloc >
00080 void _Deque_base<_Tp,_Alloc>::_M_destroy_nodes(_Tp** __nstart,
00081                                                _Tp** __nfinish) {
00082   for (_Tp** __n = __nstart; __n < __nfinish; ++__n)
00083     _M_map_size.deallocate(*__n, this->buffer_size());
00084 }
00085 
00086 #if defined (_STLP_USE_PTR_SPECIALIZATIONS)
00087 #  define deque _STLP_PTR_IMPL_NAME(deque)
00088 #elif defined (_STLP_DEBUG)
00089 #  define deque _STLP_NON_DBG_NAME(deque)
00090 #else
00091 _STLP_MOVE_TO_STD_NAMESPACE
00092 #endif
00093 
00094 #if defined (_STLP_NESTED_TYPE_PARAM_BUG)
00095 // qualified references
00096 #  define __iterator__   _Deque_iterator<_Tp, _Nonconst_traits<_Tp> >
00097 #  define const_iterator _Deque_iterator<_Tp, _Const_traits<_Tp>  >
00098 #  define iterator       __iterator__
00099 #  define size_type      size_t
00100 #  define value_type     _Tp
00101 #else
00102 #  define __iterator__   _STLP_TYPENAME_ON_RETURN_TYPE deque<_Tp, _Alloc>::iterator
00103 #endif
00104 
00105 template <class _Tp, class _Alloc >
00106 deque<_Tp, _Alloc >&
00107 deque<_Tp, _Alloc >::operator= (const deque<_Tp, _Alloc >& __x) {
00108   const size_type __len = size();
00109   if (&__x != this) {
00110     if (__len >= __x.size())
00111       erase(_STLP_STD::copy(__x.begin(), __x.end(), this->_M_start), this->_M_finish);
00112     else {
00113       const_iterator __mid = __x.begin() + difference_type(__len);
00114       _STLP_STD::copy(__x.begin(), __mid, this->_M_start);
00115       insert(this->_M_finish, __mid, __x.end());
00116     }
00117   }
00118   return *this;
00119 }
00120 
00121 template <class _Tp, class _Alloc >
00122 void deque<_Tp, _Alloc >::_M_fill_insert(iterator __pos,
00123                                          size_type __n, const value_type& __x) {
00124 #if !defined (_STLP_NO_MOVE_SEMANTIC)
00125   typedef typename __move_traits<_Tp>::implemented _Movable;
00126 #endif
00127   if (__pos._M_cur == this->_M_start._M_cur) {
00128     iterator __new_start = _M_reserve_elements_at_front(__n);
00129     _STLP_TRY {
00130       uninitialized_fill(__new_start, this->_M_start, __x);
00131     }
00132     _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
00133     this->_M_start = __new_start;
00134   }
00135   else if (__pos._M_cur == this->_M_finish._M_cur) {
00136     iterator __new_finish = _M_reserve_elements_at_back(__n);
00137     _STLP_TRY {
00138       uninitialized_fill(this->_M_finish, __new_finish, __x);
00139     }
00140     _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node+1, __new_finish._M_node+1))
00141     this->_M_finish = __new_finish;
00142   }
00143   else
00144     _M_fill_insert_aux(__pos, __n, __x, _Movable());
00145 }
00146 
00147 #if !defined (_STLP_MEMBER_TEMPLATES)
00148 
00149 template <class _Tp, class _Alloc >
00150 void deque<_Tp, _Alloc>::insert(iterator __pos,
00151                                 const value_type* __first, const value_type* __last) {
00152 #if !defined (_STLP_NO_MOVE_SEMANTIC)
00153   typedef typename __move_traits<_Tp>::implemented _Movable;
00154 #endif
00155   size_type __n = __last - __first;
00156   if (__pos._M_cur == this->_M_start._M_cur) {
00157     iterator __new_start = _M_reserve_elements_at_front(__n);
00158     _STLP_TRY {
00159       _STLP_PRIV __ucopy(__first, __last, __new_start);
00160     }
00161     _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
00162     this->_M_start = __new_start;
00163   }
00164   else if (__pos._M_cur == this->_M_finish._M_cur) {
00165     iterator __new_finish = _M_reserve_elements_at_back(__n);
00166     _STLP_TRY {
00167       _STLP_PRIV __ucopy(__first, __last, this->_M_finish);
00168     }
00169     _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1,
00170                                         __new_finish._M_node + 1))
00171     this->_M_finish = __new_finish;
00172   }
00173   else
00174     _M_insert_range_aux(__pos, __first, __last, __n, _Movable());
00175 }
00176 
00177 template <class _Tp, class _Alloc >
00178 void deque<_Tp,_Alloc>::insert(iterator __pos,
00179                                const_iterator __first, const_iterator __last) {
00180 #if !defined (_STLP_NO_MOVE_SEMANTIC)
00181   typedef typename __move_traits<_Tp>::implemented _Movable;
00182 #endif
00183   size_type __n = __last - __first;
00184   if (__pos._M_cur == this->_M_start._M_cur) {
00185     iterator __new_start = _M_reserve_elements_at_front(__n);
00186     _STLP_TRY {
00187       _STLP_PRIV __ucopy(__first, __last, __new_start);
00188     }
00189     _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
00190     this->_M_start = __new_start;
00191   }
00192   else if (__pos._M_cur == this->_M_finish._M_cur) {
00193     iterator __new_finish = _M_reserve_elements_at_back(__n);
00194     _STLP_TRY {
00195       _STLP_PRIV __ucopy(__first, __last, this->_M_finish);
00196     }
00197     _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1,
00198                                         __new_finish._M_node + 1))
00199     this->_M_finish = __new_finish;
00200   }
00201   else
00202     _M_insert_range_aux(__pos, __first, __last, __n, _Movable());
00203 }
00204 
00205 #endif /* _STLP_MEMBER_TEMPLATES */
00206 
00207 template <class _Tp, class _Alloc >
00208 __iterator__ deque<_Tp,_Alloc>::_M_erase(iterator __pos,
00209                                          const __true_type& /*_Movable*/) {
00210   difference_type __index = __pos - this->_M_start;
00211   if (size_type(__index) < this->size() >> 1) {
00212     //We move the start of the deque one position to the right
00213     //starting from the rightmost element to move.
00214     iterator __src = __pos, __dst = __pos;
00215     _STLP_STD::_Destroy(&(*__dst));
00216     if (__src != this->_M_start) {
00217       for (--__src; __dst != this->_M_start; --__src, --__dst) {
00218         _STLP_STD::_Move_Construct(&(*__dst), *__src);
00219         _STLP_STD::_Destroy_Moved(&(*__src));
00220       }
00221     }
00222     _M_pop_front_aux();
00223   }
00224   else {
00225     iterator __src = __pos, __dst = __pos;
00226     _STLP_STD::_Destroy(&(*__dst));
00227     for (++__src; __src != this->_M_finish; ++__src, ++__dst) {
00228       _STLP_STD::_Move_Construct(&(*__dst), *__src);
00229       _STLP_STD::_Destroy_Moved(&(*__src));
00230     }
00231     //Duplication of the pop_back code without the destroy which has already been done:
00232     if (this->_M_finish._M_cur != this->_M_finish._M_first) {
00233       --this->_M_finish._M_cur;
00234     }
00235     else {
00236       _M_pop_back_aux();
00237     }
00238   }
00239   return this->_M_start + __index;
00240 }
00241 
00242 template <class _Tp, class _Alloc >
00243 __iterator__ deque<_Tp,_Alloc>::_M_erase(iterator __pos,
00244                                          const __false_type& /*_Movable*/) {
00245   iterator __next = __pos;
00246   ++__next;
00247   difference_type __index = __pos - this->_M_start;
00248   if (size_type(__index) < this->size() >> 1) {
00249     copy_backward(this->_M_start, __pos, __next);
00250     pop_front();
00251   }
00252   else {
00253     _STLP_STD::copy(__next, this->_M_finish, __pos);
00254     pop_back();
00255   }
00256   return this->_M_start + __index;
00257 }
00258 
00259 template <class _Tp, class _Alloc >
00260 __iterator__ deque<_Tp,_Alloc>::_M_erase(iterator __first, iterator __last,
00261                                          const __true_type& /*_Movable*/) {
00262   difference_type __n = __last - __first;
00263   difference_type __elems_before = __first - this->_M_start;
00264   if (__elems_before <= difference_type(this->size() - __n) / 2) {
00265     iterator __src = __first, __dst = __last;
00266     if (__src != this->_M_start) {
00267       for (--__src, --__dst; (__src >= this->_M_start) && (__dst >= __first); --__src, --__dst) {
00268         _STLP_STD::_Destroy(&(*__dst));
00269         _STLP_STD::_Move_Construct(&(*__dst), *__src);
00270       }
00271       if (__dst >= __first) {
00272         //There are more elements to erase than elements to move
00273         _STLP_STD::_Destroy_Range(__first, ++__dst);
00274         _STLP_STD::_Destroy_Moved_Range(this->_M_start, __first);
00275       }
00276       else {
00277         //There are more elements to move than elements to erase
00278         for (; __src >= this->_M_start; --__src, --__dst) {
00279           _STLP_STD::_Destroy_Moved(&(*__dst));
00280           _STLP_STD::_Move_Construct(&(*__dst), *__src);
00281         }
00282         _STLP_STD::_Destroy_Moved_Range(this->_M_start, ++__dst);
00283       }
00284     }
00285     else {
00286       _STLP_STD::_Destroy_Range(this->_M_start, __last);
00287     }
00288     iterator __new_start = this->_M_start + __n;
00289     this->_M_destroy_nodes(this->_M_start._M_node, __new_start._M_node);
00290     this->_M_start = __new_start;
00291   }
00292   else {
00293     if (__last != this->_M_finish) {
00294       iterator __src = __last, __dst = __first;
00295       for (; (__src != this->_M_finish) && (__dst != __last); ++__src, ++__dst) {
00296         _STLP_STD::_Destroy(&(*__dst));
00297         _STLP_STD::_Move_Construct(&(*__dst), *__src);
00298       }
00299       if (__dst != __last) {
00300         //There are more elements to erase than elements to move
00301         _STLP_STD::_Destroy_Range(__dst, __last);
00302         _STLP_STD::_Destroy_Moved_Range(__last, this->_M_finish);
00303       }
00304       else {
00305         //There are more elements to move than elements to erase
00306         for (; __src != this->_M_finish; ++__src, ++__dst) {
00307           _STLP_STD::_Destroy_Moved(&(*__dst));
00308           _STLP_STD::_Move_Construct(&(*__dst), *__src);
00309         }
00310         _STLP_STD::_Destroy_Moved_Range(__dst, this->_M_finish);
00311       }
00312     }
00313     else {
00314       _STLP_STD::_Destroy_Range(__first, this->_M_finish);
00315     }
00316     iterator __new_finish = this->_M_finish - __n;
00317     this->_M_destroy_nodes(__new_finish._M_node + 1, this->_M_finish._M_node + 1);
00318     this->_M_finish = __new_finish;
00319   }
00320   return this->_M_start + __elems_before;
00321 }
00322 
00323 template <class _Tp, class _Alloc >
00324 __iterator__ deque<_Tp,_Alloc>::_M_erase(iterator __first, iterator __last,
00325                                          const __false_type& /*_Movable*/) {
00326   difference_type __n = __last - __first;
00327   difference_type __elems_before = __first - this->_M_start;
00328   if (__elems_before <= difference_type(this->size() - __n) / 2) {
00329     copy_backward(this->_M_start, __first, __last);
00330     iterator __new_start = this->_M_start + __n;
00331     _STLP_STD::_Destroy_Range(this->_M_start, __new_start);
00332     this->_M_destroy_nodes(this->_M_start._M_node, __new_start._M_node);
00333     this->_M_start = __new_start;
00334   }
00335   else {
00336     _STLP_STD::copy(__last, this->_M_finish, __first);
00337     iterator __new_finish = this->_M_finish - __n;
00338     _STLP_STD::_Destroy_Range(__new_finish, this->_M_finish);
00339     this->_M_destroy_nodes(__new_finish._M_node + 1, this->_M_finish._M_node + 1);
00340     this->_M_finish = __new_finish;
00341   }
00342   return this->_M_start + __elems_before;
00343 }
00344 
00345 template <class _Tp, class _Alloc >
00346 void deque<_Tp,_Alloc>::clear() {
00347   for (_Map_pointer __node = this->_M_start._M_node + 1;
00348        __node < this->_M_finish._M_node;
00349        ++__node) {
00350     _STLP_STD::_Destroy_Range(*__node, *__node + this->buffer_size());
00351     this->_M_map_size.deallocate(*__node, this->buffer_size());
00352   }
00353 
00354   if (this->_M_start._M_node != this->_M_finish._M_node) {
00355     _STLP_STD::_Destroy_Range(this->_M_start._M_cur, this->_M_start._M_last);
00356     _STLP_STD::_Destroy_Range(this->_M_finish._M_first, this->_M_finish._M_cur);
00357     this->_M_map_size.deallocate(this->_M_finish._M_first, this->buffer_size());
00358   }
00359   else
00360     _STLP_STD::_Destroy_Range(this->_M_start._M_cur, this->_M_finish._M_cur);
00361 
00362   this->_M_finish = this->_M_start;
00363 }
00364 
00365 // Precondition: this->_M_start and this->_M_finish have already been initialized,
00366 // but none of the deque's elements have yet been constructed.
00367 template <class _Tp, class _Alloc >
00368 void deque<_Tp,_Alloc>::_M_fill_initialize(const value_type& __val,
00369                                            const __false_type& /*_TrivialInit*/) {
00370   _Map_pointer __cur = this->_M_start._M_node;
00371   _STLP_TRY {
00372     for (; __cur < this->_M_finish._M_node; ++__cur)
00373       uninitialized_fill(*__cur, *__cur + this->buffer_size(), __val);
00374     uninitialized_fill(this->_M_finish._M_first, this->_M_finish._M_cur, __val);
00375   }
00376   _STLP_UNWIND(_STLP_STD::_Destroy_Range(this->_M_start, iterator(*__cur, __cur)))
00377 }
00378 
00379 
00380 // Called only if this->_M_finish._M_cur == this->_M_finish._M_last - 1.
00381 template <class _Tp, class _Alloc >
00382 void deque<_Tp,_Alloc>::_M_push_back_aux_v(const value_type& __t) {
00383   _M_reserve_map_at_back();
00384   *(this->_M_finish._M_node + 1) = this->_M_map_size.allocate(this->buffer_size());
00385   _STLP_TRY {
00386     _Copy_Construct(this->_M_finish._M_cur, __t);
00387     this->_M_finish._M_set_node(this->_M_finish._M_node + 1);
00388     this->_M_finish._M_cur = this->_M_finish._M_first;
00389   }
00390   _STLP_UNWIND(this->_M_map_size.deallocate(*(this->_M_finish._M_node + 1),
00391                                             this->buffer_size()))
00392 }
00393 
00394 #if defined(_STLP_DONT_SUP_DFLT_PARAM) && !defined(_STLP_NO_ANACHRONISMS)
00395 // Called only if this->_M_finish._M_cur == this->_M_finish._M_last - 1.
00396 template <class _Tp, class _Alloc >
00397 void deque<_Tp,_Alloc>::_M_push_back_aux() {
00398   _M_reserve_map_at_back();
00399   *(this->_M_finish._M_node + 1) = this->_M_map_size.allocate(this->buffer_size());
00400   _STLP_TRY {
00401     _STLP_STD::_Construct(this->_M_finish._M_cur);
00402     this->_M_finish._M_set_node(this->_M_finish._M_node + 1);
00403     this->_M_finish._M_cur = this->_M_finish._M_first;
00404   }
00405   _STLP_UNWIND(this->_M_map_size.deallocate(*(this->_M_finish._M_node + 1),
00406                                             this->buffer_size()))
00407 }
00408 #endif /*_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/
00409 
00410 // Called only if this->_M_start._M_cur == this->_M_start._M_first.
00411 template <class _Tp, class _Alloc >
00412 void deque<_Tp,_Alloc>::_M_push_front_aux_v(const value_type& __t) {
00413   _M_reserve_map_at_front();
00414   *(this->_M_start._M_node - 1) = this->_M_map_size.allocate(this->buffer_size());
00415   _STLP_TRY {
00416     this->_M_start._M_set_node(this->_M_start._M_node - 1);
00417     this->_M_start._M_cur = this->_M_start._M_last - 1;
00418     _Copy_Construct(this->_M_start._M_cur, __t);
00419   }
00420   _STLP_UNWIND((++this->_M_start,
00421                 this->_M_map_size.deallocate(*(this->_M_start._M_node - 1), this->buffer_size())))
00422 }
00423 
00424 
00425 #if defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
00426 // Called only if this->_M_start._M_cur == this->_M_start._M_first.
00427 template <class _Tp, class _Alloc >
00428 void deque<_Tp,_Alloc>::_M_push_front_aux() {
00429   _M_reserve_map_at_front();
00430   *(this->_M_start._M_node - 1) = this->_M_map_size.allocate(this->buffer_size());
00431   _STLP_TRY {
00432     this->_M_start._M_set_node(this->_M_start._M_node - 1);
00433     this->_M_start._M_cur = this->_M_start._M_last - 1;
00434     _STLP_STD::_Construct(this->_M_start._M_cur);
00435   }
00436   _STLP_UNWIND((++this->_M_start, this->_M_map_size.deallocate(*(this->_M_start._M_node - 1),
00437                                                                this->buffer_size())))
00438 }
00439 #endif /*_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/
00440 
00441 // Called only if this->_M_finish._M_cur == this->_M_finish._M_first.
00442 template <class _Tp, class _Alloc >
00443 void deque<_Tp,_Alloc>::_M_pop_back_aux() {
00444   this->_M_map_size.deallocate(this->_M_finish._M_first, this->buffer_size());
00445   this->_M_finish._M_set_node(this->_M_finish._M_node - 1);
00446   this->_M_finish._M_cur = this->_M_finish._M_last - 1;
00447 }
00448 
00449 // Note that if the deque has at least one element (a precondition for this member
00450 // function), and if this->_M_start._M_cur == this->_M_start._M_last, then the deque
00451 // must have at least two nodes.
00452 template <class _Tp, class _Alloc >
00453 void deque<_Tp,_Alloc>::_M_pop_front_aux() {
00454   if (this->_M_start._M_cur != this->_M_start._M_last - 1)
00455     ++this->_M_start._M_cur;
00456   else {
00457     this->_M_map_size.deallocate(this->_M_start._M_first, this->buffer_size());
00458     this->_M_start._M_set_node(this->_M_start._M_node + 1);
00459     this->_M_start._M_cur = this->_M_start._M_first;
00460   }
00461 }
00462 
00463 template <class _Tp, class _Alloc >
00464 __iterator__ deque<_Tp,_Alloc>::_M_fill_insert_aux(iterator __pos, size_type __n,
00465                                                    const value_type& __x,
00466                                                    const __true_type& /*_Movable*/) {
00467   const difference_type __elems_before = __pos - this->_M_start;
00468   size_type __length = this->size();
00469   value_type __x_copy = __x;
00470   if (__elems_before <= difference_type(__length / 2)) {
00471     iterator __new_start = _M_reserve_elements_at_front(__n);
00472     __pos = this->_M_start + __elems_before;
00473     _STLP_TRY {
00474       iterator __dst = __new_start;
00475       iterator __src = this->_M_start;
00476       for (; __src != __pos; ++__dst, ++__src) {
00477         _STLP_STD::_Move_Construct(&(*__dst), *__src);
00478         _STLP_STD::_Destroy_Moved(&(*__src));
00479       }
00480       this->_M_start = __new_start;
00481       uninitialized_fill(__dst, __src, __x_copy);
00482       __pos = __dst;
00483     }
00484     _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
00485   }
00486   else {
00487     iterator __new_finish = _M_reserve_elements_at_back(__n);
00488     const difference_type __elems_after = difference_type(__length) - __elems_before;
00489     __pos = this->_M_finish - __elems_after;
00490     _STLP_TRY {
00491       iterator __dst = __new_finish;
00492       iterator __src = this->_M_finish;
00493       for (--__src, --__dst; __src >= __pos; --__src, --__dst) {
00494         _STLP_STD::_Move_Construct(&(*__dst), *__src);
00495         _STLP_STD::_Destroy_Moved(&(*__src));
00496       }
00497       this->_M_finish = __new_finish;
00498       uninitialized_fill(__pos, __pos + __n, __x_copy);
00499     }
00500     _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1))
00501   }
00502   return __pos;
00503 }
00504 
00505 template <class _Tp, class _Alloc >
00506 __iterator__ deque<_Tp,_Alloc>::_M_fill_insert_aux(iterator __pos, size_type __n,
00507                                                    const value_type& __x,
00508                                                    const __false_type& /*_Movable*/) {
00509   const difference_type __elems_before = __pos - this->_M_start;
00510   size_type __length = this->size();
00511   value_type __x_copy = __x;
00512   if (__elems_before <= difference_type(__length / 2)) {
00513     iterator __new_start = _M_reserve_elements_at_front(__n);
00514     iterator __old_start = this->_M_start;
00515     __pos = this->_M_start + __elems_before;
00516     _STLP_TRY {
00517       if (__elems_before >= difference_type(__n)) {
00518         iterator __start_n = this->_M_start + difference_type(__n);
00519         _STLP_PRIV __ucopy(this->_M_start, __start_n, __new_start);
00520         this->_M_start = __new_start;
00521         _STLP_STD::copy(__start_n, __pos, __old_start);
00522         _STLP_STD::fill(__pos - difference_type(__n), __pos, __x_copy);
00523         __pos -= difference_type(__n);
00524       }
00525       else {
00526         _STLP_PRIV __uninitialized_copy_fill(this->_M_start, __pos, __new_start,
00527                                              this->_M_start, __x_copy);
00528         this->_M_start = __new_start;
00529         fill(__old_start, __pos, __x_copy);
00530       }
00531     }
00532     _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
00533   }
00534   else {
00535     iterator __new_finish = _M_reserve_elements_at_back(__n);
00536     iterator __old_finish = this->_M_finish;
00537     const difference_type __elems_after =
00538       difference_type(__length) - __elems_before;
00539     __pos = this->_M_finish - __elems_after;
00540     _STLP_TRY {
00541       if (__elems_after > difference_type(__n)) {
00542         iterator __finish_n = this->_M_finish - difference_type(__n);
00543         _STLP_PRIV __ucopy(__finish_n, this->_M_finish, this->_M_finish);
00544         this->_M_finish = __new_finish;
00545         copy_backward(__pos, __finish_n, __old_finish);
00546         fill(__pos, __pos + difference_type(__n), __x_copy);
00547       }
00548       else {
00549         _STLP_PRIV __uninitialized_fill_copy(this->_M_finish, __pos + difference_type(__n),
00550                                              __x_copy, __pos, this->_M_finish);
00551         this->_M_finish = __new_finish;
00552         fill(__pos, __old_finish, __x_copy);
00553       }
00554     }
00555     _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1))
00556   }
00557   return __pos;
00558 }
00559 
00560 #if !defined (_STLP_MEMBER_TEMPLATES)
00561 template <class _Tp, class _Alloc >
00562 void deque<_Tp,_Alloc>::_M_insert_range_aux(iterator __pos,
00563                                             const value_type* __first, const value_type* __last,
00564                                             size_type __n, const __true_type& /*_Movable*/) {
00565   const difference_type __elems_before = __pos - this->_M_start;
00566   size_type __length = size();
00567   if (__elems_before <= difference_type(__length / 2)) {
00568     iterator __new_start = _M_reserve_elements_at_front(__n);
00569     __pos = this->_M_start + __elems_before;
00570     _STLP_TRY {
00571       iterator __dst = __new_start;
00572       iterator __src = this->_M_start;
00573       for (; __src != __pos; ++__dst, ++__src) {
00574         _STLP_STD::_Move_Construct(&(*__dst), *__src);
00575         _STLP_STD::_Destroy_Moved(&(*__src));
00576       }
00577       this->_M_start = __new_start;
00578       _STLP_PRIV __ucopy(__first, __last, __dst);
00579     }
00580     _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
00581   }
00582   else {
00583     iterator __new_finish = _M_reserve_elements_at_back(__n);
00584     const difference_type __elems_after = difference_type(__length) - __elems_before;
00585     __pos = this->_M_finish - __elems_after;
00586     _STLP_TRY {
00587       iterator __dst = __new_finish;
00588       iterator __src = this->_M_finish;
00589       for (--__src, --__dst; __src >= __pos; --__src, --__dst) {
00590         _STLP_STD::_Move_Construct(&(*__dst), *__src);
00591         _STLP_STD::_Destroy_Moved(&(*__src));
00592       }
00593       this->_M_finish = __new_finish;
00594       _STLP_PRIV __ucopy(__first, __last, __pos);
00595     }
00596     _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1))
00597   }
00598 }
00599 
00600 template <class _Tp, class _Alloc >
00601 void deque<_Tp,_Alloc>::_M_insert_range_aux(iterator __pos,
00602                                             const value_type* __first, const value_type* __last,
00603                                             size_type __n, const __false_type& /*_Movable*/) {
00604   const difference_type __elems_before = __pos - this->_M_start;
00605   size_type __length = size();
00606   if (__elems_before <= difference_type(__length / 2)) {
00607     iterator __new_start = _M_reserve_elements_at_front(__n);
00608     iterator __old_start = this->_M_start;
00609     __pos = this->_M_start + __elems_before;
00610     _STLP_TRY {
00611       if (__elems_before >= difference_type(__n)) {
00612         iterator __start_n = this->_M_start + difference_type(__n);
00613         _STLP_PRIV __ucopy(this->_M_start, __start_n, __new_start);
00614         this->_M_start = __new_start;
00615         _STLP_STD::copy(__start_n, __pos, __old_start);
00616         _STLP_STD::copy(__first, __last, __pos - difference_type(__n));
00617       }
00618       else {
00619         const value_type* __mid = __first + (difference_type(__n) - __elems_before);
00620         _STLP_PRIV __uninitialized_copy_copy(this->_M_start, __pos, __first, __mid, __new_start);
00621         this->_M_start = __new_start;
00622         _STLP_STD::copy(__mid, __last, __old_start);
00623       }
00624     }
00625     _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
00626   }
00627   else {
00628     iterator __new_finish = _M_reserve_elements_at_back(__n);
00629     iterator __old_finish = this->_M_finish;
00630     const difference_type __elems_after =
00631       difference_type(__length) - __elems_before;
00632     __pos = this->_M_finish - __elems_after;
00633     _STLP_TRY {
00634 
00635       if (__elems_after > difference_type(__n)) {
00636         iterator __finish_n = this->_M_finish - difference_type(__n);
00637         _STLP_PRIV __ucopy(__finish_n, this->_M_finish, this->_M_finish);
00638         this->_M_finish = __new_finish;
00639         _STLP_STD::copy_backward(__pos, __finish_n, __old_finish);
00640         _STLP_STD::copy(__first, __last, __pos);
00641       }
00642       else {
00643         const value_type* __mid = __first + __elems_after;
00644         _STLP_PRIV __uninitialized_copy_copy(__mid, __last, __pos, this->_M_finish, this->_M_finish);
00645         this->_M_finish = __new_finish;
00646         _STLP_STD::copy(__first, __mid, __pos);
00647       }
00648     }
00649     _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1))
00650   }
00651 }
00652 
00653 template <class _Tp, class _Alloc >
00654 void deque<_Tp,_Alloc>::_M_insert_range_aux(iterator __pos,
00655                                             const_iterator __first, const_iterator __last,
00656                                             size_type __n, const __true_type& /*_Movable*/) {
00657   const difference_type __elems_before = __pos - this->_M_start;
00658   size_type __length = size();
00659   if (__elems_before <= difference_type(__length / 2)) {
00660     iterator __new_start = _M_reserve_elements_at_front(__n);
00661     __pos = this->_M_start + __elems_before;
00662     _STLP_TRY {
00663       iterator __dst = __new_start;
00664       iterator __src = this->_M_start;
00665       for (; __src != __pos; ++__dst, ++__src) {
00666         _STLP_STD::_Move_Construct(&(*__dst), *__src);
00667         _STLP_STD::_Destroy_Moved(&(*__src));
00668       }
00669       this->_M_start = __new_start;
00670       _STLP_PRIV __ucopy(__first, __last, __dst);
00671     }
00672     _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
00673   }
00674   else {
00675     iterator __new_finish = _M_reserve_elements_at_back(__n);
00676     const difference_type __elems_after = difference_type(__length) - __elems_before;
00677     __pos = this->_M_finish - __elems_after;
00678     _STLP_TRY {
00679       iterator __dst = __new_finish;
00680       iterator __src = this->_M_finish;
00681       for (--__src, --__dst; __src >= __pos; --__src, --__dst) {
00682         _STLP_STD::_Move_Construct(&(*__dst), *__src);
00683         _STLP_STD::_Destroy_Moved(&(*__src));
00684       }
00685       this->_M_finish = __new_finish;
00686       _STLP_PRIV __ucopy(__first, __last, __pos);
00687     }
00688     _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1))
00689   }
00690 }
00691 
00692 template <class _Tp, class _Alloc >
00693 void deque<_Tp,_Alloc>::_M_insert_range_aux(iterator __pos,
00694                                             const_iterator __first, const_iterator __last,
00695                                             size_type __n, const __false_type& /*_Movable*/) {
00696   const difference_type __elems_before = __pos - this->_M_start;
00697   size_type __length = size();
00698   if (__elems_before < difference_type(__length / 2)) {
00699     iterator __new_start = _M_reserve_elements_at_front(__n);
00700     iterator __old_start = this->_M_start;
00701     __pos = this->_M_start + __elems_before;
00702     _STLP_TRY {
00703       if (__elems_before >= difference_type(__n)) {
00704         iterator __start_n = this->_M_start + __n;
00705         _STLP_PRIV __ucopy(this->_M_start, __start_n, __new_start);
00706         this->_M_start = __new_start;
00707         _STLP_STD::copy(__start_n, __pos, __old_start);
00708         _STLP_STD::copy(__first, __last, __pos - difference_type(__n));
00709       }
00710       else {
00711         const_iterator __mid = __first + (__n - __elems_before);
00712         _STLP_PRIV __uninitialized_copy_copy(this->_M_start, __pos, __first, __mid, __new_start);
00713         this->_M_start = __new_start;
00714         _STLP_STD::copy(__mid, __last, __old_start);
00715       }
00716     }
00717     _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
00718   }
00719   else {
00720     iterator __new_finish = _M_reserve_elements_at_back(__n);
00721     iterator __old_finish = this->_M_finish;
00722     const difference_type __elems_after = __length - __elems_before;
00723     __pos = this->_M_finish - __elems_after;
00724     _STLP_TRY {
00725       if (__elems_after > difference_type(__n)) {
00726         iterator __finish_n = this->_M_finish - difference_type(__n);
00727         _STLP_PRIV __ucopy(__finish_n, this->_M_finish, this->_M_finish);
00728         this->_M_finish = __new_finish;
00729         _STLP_STD::copy_backward(__pos, __finish_n, __old_finish);
00730         _STLP_STD::copy(__first, __last, __pos);
00731       }
00732       else {
00733         const_iterator __mid = __first + __elems_after;
00734         _STLP_PRIV __uninitialized_copy_copy(__mid, __last, __pos, this->_M_finish, this->_M_finish);
00735         this->_M_finish = __new_finish;
00736         _STLP_STD::copy(__first, __mid, __pos);
00737       }
00738     }
00739     _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1))
00740   }
00741 }
00742 #endif /* _STLP_MEMBER_TEMPLATES */
00743 
00744 template <class _Tp, class _Alloc >
00745 void deque<_Tp,_Alloc>::_M_new_elements_at_front(size_type __new_elems) {
00746   size_type __new_nodes
00747       = (__new_elems + this->buffer_size() - 1) / this->buffer_size();
00748   _M_reserve_map_at_front(__new_nodes);
00749   size_type __i = 1;
00750   _STLP_TRY {
00751     for (; __i <= __new_nodes; ++__i)
00752       *(this->_M_start._M_node - __i) = this->_M_map_size.allocate(this->buffer_size());
00753   }
00754   _STLP_UNWIND(for (size_type __j = 1; __j < __i; ++__j)
00755                  this->_M_map_size.deallocate(*(this->_M_start._M_node - __j), this->buffer_size()))
00756 }
00757 
00758 template <class _Tp, class _Alloc >
00759 void deque<_Tp,_Alloc>::_M_new_elements_at_back(size_type __new_elems) {
00760   size_type __new_nodes
00761       = (__new_elems + this->buffer_size() - 1) / this->buffer_size();
00762   _M_reserve_map_at_back(__new_nodes);
00763   size_type __i = 1;
00764   _STLP_TRY {
00765     for (; __i <= __new_nodes; ++__i)
00766       *(this->_M_finish._M_node + __i) = this->_M_map_size.allocate(this->buffer_size());
00767   }
00768   _STLP_UNWIND(for (size_type __j = 1; __j < __i; ++__j)
00769                  this->_M_map_size.deallocate(*(this->_M_finish._M_node + __j), this->buffer_size()))
00770 }
00771 
00772 template <class _Tp, class _Alloc >
00773 void deque<_Tp,_Alloc>::_M_reallocate_map(size_type __nodes_to_add,
00774                                           bool __add_at_front) {
00775   size_type __old_num_nodes = this->_M_finish._M_node - this->_M_start._M_node + 1;
00776   size_type __new_num_nodes = __old_num_nodes + __nodes_to_add;
00777 
00778   _Map_pointer __new_nstart;
00779   if (this->_M_map_size._M_data > 2 * __new_num_nodes) {
00780     __new_nstart = this->_M_map._M_data + (this->_M_map_size._M_data - __new_num_nodes) / 2
00781                      + (__add_at_front ? __nodes_to_add : 0);
00782     if (__new_nstart < this->_M_start._M_node)
00783       _STLP_STD::copy(this->_M_start._M_node, this->_M_finish._M_node + 1, __new_nstart);
00784     else
00785       _STLP_STD::copy_backward(this->_M_start._M_node, this->_M_finish._M_node + 1,
00786                                __new_nstart + __old_num_nodes);
00787   }
00788   else {
00789     size_type __new_map_size =
00790       this->_M_map_size._M_data + (max)((size_t)this->_M_map_size._M_data, __nodes_to_add) + 2;
00791 
00792     _Map_pointer __new_map = this->_M_map.allocate(__new_map_size);
00793     __new_nstart = __new_map + (__new_map_size - __new_num_nodes) / 2
00794                              + (__add_at_front ? __nodes_to_add : 0);
00795     _STLP_STD::copy(this->_M_start._M_node, this->_M_finish._M_node + 1, __new_nstart);
00796     this->_M_map.deallocate(this->_M_map._M_data, this->_M_map_size._M_data);
00797 
00798     this->_M_map._M_data = __new_map;
00799     this->_M_map_size._M_data = __new_map_size;
00800   }
00801 
00802   this->_M_start._M_set_node(__new_nstart);
00803   this->_M_finish._M_set_node(__new_nstart + __old_num_nodes - 1);
00804 }
00805 
00806 #if defined (deque)
00807 #  undef deque
00808 _STLP_MOVE_TO_STD_NAMESPACE
00809 #endif
00810 
00811 _STLP_END_NAMESPACE
00812 
00813 #undef __iterator__
00814 #undef iterator
00815 #undef const_iterator
00816 #undef size_type
00817 #undef value_type
00818 
00819 #endif /*  _STLP_DEQUE_C */
00820 
00821 // Local Variables:
00822 // mode:C++
00823 // End:

Generated on Sun May 27 2012 04:28:53 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.