Home | Info | Community | Development | myReactOS | Contact Us
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
1.7.6.1
|