19720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/*
29720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
39720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
49720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1994
59720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Hewlett-Packard Company
69720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
79720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1996,1997
89720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Silicon Graphics Computer Systems, Inc.
99720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1997
119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Moscow Center for SPARC Technology
129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1999
149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Boris Fomitchev
159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This material is provided "as is", with absolutely no warranty expressed
179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * or implied. Any use is at your own risk.
189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to use or copy this software for any purpose is hereby granted
209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * without fee, provided the above notices are retained on all copies.
219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to modify the code and to distribute modified code is granted,
229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * provided the above notices are retained, and a notice that the code was
239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * modified is included with the above copyright notice.
249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_DEQUE_C
279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_DEQUE_C
289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_DEQUE_H
309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_deque.h>
319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE
349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE
369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Non-inline member functions from _Deque_base.
389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc >
409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_Deque_base<_Tp,_Alloc >::~_Deque_base() {
419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (_M_map._M_data) {
429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_destroy_nodes(_M_start._M_node, this->_M_finish._M_node + 1);
439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_map.deallocate(_M_map._M_data, _M_map_size._M_data);
449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc >
489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid _Deque_base<_Tp,_Alloc>::_M_initialize_map(size_t __num_elements) {
499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_t __num_nodes = __num_elements / this->buffer_size() + 1 ;
509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _M_map_size._M_data = (max)((size_t) _S_initial_map_size, __num_nodes + 2);
529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _M_map._M_data = _M_map.allocate(_M_map_size._M_data);
539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Tp** __nstart = _M_map._M_data + (_M_map_size._M_data - __num_nodes) / 2;
559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Tp** __nfinish = __nstart + __num_nodes;
569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_create_nodes(__nstart, __nfinish);
599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_UNWIND((_M_map.deallocate(_M_map._M_data, _M_map_size._M_data),
619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                _M_map._M_data = 0, _M_map_size._M_data = 0))
629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _M_start._M_set_node(__nstart);
639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_finish._M_set_node(__nfinish - 1);
649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _M_start._M_cur = _M_start._M_first;
659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_finish._M_cur = this->_M_finish._M_first + __num_elements % this->buffer_size();
669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc >
699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid _Deque_base<_Tp,_Alloc>::_M_create_nodes(_Tp** __nstart,
709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                              _Tp** __nfinish) {
719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Tp** __cur = __nstart;
729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for (; __cur < __nfinish; ++__cur)
749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      *__cur = _M_map_size.allocate(this->buffer_size());
759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_UNWIND(_M_destroy_nodes(__nstart, __cur))
779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc >
809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid _Deque_base<_Tp,_Alloc>::_M_destroy_nodes(_Tp** __nstart,
819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                               _Tp** __nfinish) {
829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  for (_Tp** __n = __nstart; __n < __nfinish; ++__n)
839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_map_size.deallocate(*__n, this->buffer_size());
849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_PTR_SPECIALIZATIONS)
879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define deque _STLP_PTR_IMPL_NAME(deque)
889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#elif defined (_STLP_DEBUG)
899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define deque _STLP_NON_DBG_NAME(deque)
909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_NESTED_TYPE_PARAM_BUG)
959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// qualified references
969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define __iterator__   _Deque_iterator<_Tp, _Nonconst_traits<_Tp> >
979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define const_iterator _Deque_iterator<_Tp, _Const_traits<_Tp>  >
989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define iterator       __iterator__
999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define size_type      size_t
1009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define value_type     _Tp
1019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
1029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define __iterator__   _STLP_TYPENAME_ON_RETURN_TYPE deque<_Tp, _Alloc>::iterator
1039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
1049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc >
1069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockdeque<_Tp, _Alloc >&
1079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockdeque<_Tp, _Alloc >::operator= (const deque<_Tp, _Alloc >& __x) {
1089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const size_type __len = size();
1099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (&__x != this) {
1109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__len >= __x.size())
111e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      erase(_STLP_STD::copy(__x.begin(), __x.end(), this->_M_start), this->_M_finish);
1129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
1139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      const_iterator __mid = __x.begin() + difference_type(__len);
114e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _STLP_STD::copy(__x.begin(), __mid, this->_M_start);
1159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      insert(this->_M_finish, __mid, __x.end());
1169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
1179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return *this;
1199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc >
1229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid deque<_Tp, _Alloc >::_M_fill_insert(iterator __pos,
1239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                         size_type __n, const value_type& __x) {
124e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_MOVE_SEMANTIC)
125e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  typedef typename __move_traits<_Tp>::implemented _Movable;
126e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
1279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__pos._M_cur == this->_M_start._M_cur) {
1289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __new_start = _M_reserve_elements_at_front(__n);
1299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
1309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      uninitialized_fill(__new_start, this->_M_start, __x);
1319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
1329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
1339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_start = __new_start;
1349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else if (__pos._M_cur == this->_M_finish._M_cur) {
1369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __new_finish = _M_reserve_elements_at_back(__n);
1379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
1389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      uninitialized_fill(this->_M_finish, __new_finish, __x);
1399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
1409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node+1, __new_finish._M_node+1))
1419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_finish = __new_finish;
1429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else
1449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_fill_insert_aux(__pos, __n, __x, _Movable());
1459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_MEMBER_TEMPLATES)
1489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc >
1509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid deque<_Tp, _Alloc>::insert(iterator __pos,
1519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                const value_type* __first, const value_type* __last) {
152e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_MOVE_SEMANTIC)
153e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  typedef typename __move_traits<_Tp>::implemented _Movable;
154e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
1559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type __n = __last - __first;
1569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__pos._M_cur == this->_M_start._M_cur) {
1579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __new_start = _M_reserve_elements_at_front(__n);
1589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
1599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_PRIV __ucopy(__first, __last, __new_start);
1609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
1619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
1629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_start = __new_start;
1639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else if (__pos._M_cur == this->_M_finish._M_cur) {
1659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __new_finish = _M_reserve_elements_at_back(__n);
1669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
1679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_PRIV __ucopy(__first, __last, this->_M_finish);
1689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
1699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1,
1709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                        __new_finish._M_node + 1))
1719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_finish = __new_finish;
1729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else
1749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_insert_range_aux(__pos, __first, __last, __n, _Movable());
1759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc >
1789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid deque<_Tp,_Alloc>::insert(iterator __pos,
1799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                               const_iterator __first, const_iterator __last) {
180e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_MOVE_SEMANTIC)
181e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  typedef typename __move_traits<_Tp>::implemented _Movable;
182e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
1839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type __n = __last - __first;
1849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__pos._M_cur == this->_M_start._M_cur) {
1859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __new_start = _M_reserve_elements_at_front(__n);
1869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
1879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_PRIV __ucopy(__first, __last, __new_start);
1889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
1899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
1909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_start = __new_start;
1919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else if (__pos._M_cur == this->_M_finish._M_cur) {
1939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __new_finish = _M_reserve_elements_at_back(__n);
1949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
1959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_PRIV __ucopy(__first, __last, this->_M_finish);
1969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
1979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1,
1989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                        __new_finish._M_node + 1))
1999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_finish = __new_finish;
2009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else
2029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_insert_range_aux(__pos, __first, __last, __n, _Movable());
2039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_MEMBER_TEMPLATES */
2069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc >
2089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__iterator__ deque<_Tp,_Alloc>::_M_erase(iterator __pos,
2099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                         const __true_type& /*_Movable*/) {
2109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  difference_type __index = __pos - this->_M_start;
2119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (size_type(__index) < this->size() >> 1) {
2129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    //We move the start of the deque one position to the right
2139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    //starting from the rightmost element to move.
2149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __src = __pos, __dst = __pos;
2159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_STD::_Destroy(&(*__dst));
2169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__src != this->_M_start) {
2179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      for (--__src; __dst != this->_M_start; --__src, --__dst) {
2189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_STD::_Move_Construct(&(*__dst), *__src);
2199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_STD::_Destroy_Moved(&(*__src));
2209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
2219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
2229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _M_pop_front_aux();
2239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else {
2259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __src = __pos, __dst = __pos;
2269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_STD::_Destroy(&(*__dst));
2279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for (++__src; __src != this->_M_finish; ++__src, ++__dst) {
2289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_STD::_Move_Construct(&(*__dst), *__src);
2299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_STD::_Destroy_Moved(&(*__src));
2309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
2319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    //Duplication of the pop_back code without the destroy which has already been done:
2329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (this->_M_finish._M_cur != this->_M_finish._M_first) {
2339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      --this->_M_finish._M_cur;
2349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
2359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
2369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _M_pop_back_aux();
2379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
2389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return this->_M_start + __index;
2409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc >
2439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__iterator__ deque<_Tp,_Alloc>::_M_erase(iterator __pos,
2449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                         const __false_type& /*_Movable*/) {
2459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  iterator __next = __pos;
2469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ++__next;
2479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  difference_type __index = __pos - this->_M_start;
2489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (size_type(__index) < this->size() >> 1) {
2499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    copy_backward(this->_M_start, __pos, __next);
2509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    pop_front();
2519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else {
253e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _STLP_STD::copy(__next, this->_M_finish, __pos);
2549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    pop_back();
2559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return this->_M_start + __index;
2579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc >
2609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__iterator__ deque<_Tp,_Alloc>::_M_erase(iterator __first, iterator __last,
2619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                         const __true_type& /*_Movable*/) {
2629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  difference_type __n = __last - __first;
2639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  difference_type __elems_before = __first - this->_M_start;
2649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__elems_before <= difference_type(this->size() - __n) / 2) {
2659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __src = __first, __dst = __last;
2669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__src != this->_M_start) {
2679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      for (--__src, --__dst; (__src >= this->_M_start) && (__dst >= __first); --__src, --__dst) {
2689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_STD::_Destroy(&(*__dst));
2699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_STD::_Move_Construct(&(*__dst), *__src);
2709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
2719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__dst >= __first) {
2729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        //There are more elements to erase than elements to move
2739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_STD::_Destroy_Range(__first, ++__dst);
2749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_STD::_Destroy_Moved_Range(this->_M_start, __first);
2759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
2769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else {
2779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        //There are more elements to move than elements to erase
2789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        for (; __src >= this->_M_start; --__src, --__dst) {
2799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          _STLP_STD::_Destroy_Moved(&(*__dst));
2809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          _STLP_STD::_Move_Construct(&(*__dst), *__src);
2819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
2829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_STD::_Destroy_Moved_Range(this->_M_start, ++__dst);
2839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
2849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
2859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
2869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_STD::_Destroy_Range(this->_M_start, __last);
2879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
2889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __new_start = this->_M_start + __n;
2899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_destroy_nodes(this->_M_start._M_node, __new_start._M_node);
2909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_start = __new_start;
2919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
2929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else {
2939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__last != this->_M_finish) {
2949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __src = __last, __dst = __first;
2959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      for (; (__src != this->_M_finish) && (__dst != __last); ++__src, ++__dst) {
2969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_STD::_Destroy(&(*__dst));
2979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_STD::_Move_Construct(&(*__dst), *__src);
2989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
2999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__dst != __last) {
3009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        //There are more elements to erase than elements to move
3019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_STD::_Destroy_Range(__dst, __last);
3029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_STD::_Destroy_Moved_Range(__last, this->_M_finish);
3039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
3049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else {
3059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        //There are more elements to move than elements to erase
3069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        for (; __src != this->_M_finish; ++__src, ++__dst) {
3079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          _STLP_STD::_Destroy_Moved(&(*__dst));
3089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block          _STLP_STD::_Move_Construct(&(*__dst), *__src);
3099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        }
3109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_STD::_Destroy_Moved_Range(__dst, this->_M_finish);
3119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
3129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
3139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else {
3149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_STD::_Destroy_Range(__first, this->_M_finish);
3159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
3169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __new_finish = this->_M_finish - __n;
3179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_destroy_nodes(__new_finish._M_node + 1, this->_M_finish._M_node + 1);
3189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_finish = __new_finish;
3199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return this->_M_start + __elems_before;
3219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc >
3249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__iterator__ deque<_Tp,_Alloc>::_M_erase(iterator __first, iterator __last,
3259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                         const __false_type& /*_Movable*/) {
3269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  difference_type __n = __last - __first;
3279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  difference_type __elems_before = __first - this->_M_start;
3289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__elems_before <= difference_type(this->size() - __n) / 2) {
3299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    copy_backward(this->_M_start, __first, __last);
3309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __new_start = this->_M_start + __n;
3319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_STD::_Destroy_Range(this->_M_start, __new_start);
3329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_destroy_nodes(this->_M_start._M_node, __new_start._M_node);
3339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_start = __new_start;
3349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else {
336e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _STLP_STD::copy(__last, this->_M_finish, __first);
3379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __new_finish = this->_M_finish - __n;
3389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_STD::_Destroy_Range(__new_finish, this->_M_finish);
3399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_destroy_nodes(__new_finish._M_node + 1, this->_M_finish._M_node + 1);
3409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_finish = __new_finish;
3419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return this->_M_start + __elems_before;
3439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc >
3469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid deque<_Tp,_Alloc>::clear() {
3479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  for (_Map_pointer __node = this->_M_start._M_node + 1;
3489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block       __node < this->_M_finish._M_node;
3499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block       ++__node) {
3509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_STD::_Destroy_Range(*__node, *__node + this->buffer_size());
3519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_map_size.deallocate(*__node, this->buffer_size());
3529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (this->_M_start._M_node != this->_M_finish._M_node) {
3559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_STD::_Destroy_Range(this->_M_start._M_cur, this->_M_start._M_last);
3569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_STD::_Destroy_Range(this->_M_finish._M_first, this->_M_finish._M_cur);
3579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_map_size.deallocate(this->_M_finish._M_first, this->buffer_size());
3589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else
3609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_STD::_Destroy_Range(this->_M_start._M_cur, this->_M_finish._M_cur);
3619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_finish = this->_M_start;
3639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Precondition: this->_M_start and this->_M_finish have already been initialized,
3669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// but none of the deque's elements have yet been constructed.
3679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc >
3689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid deque<_Tp,_Alloc>::_M_fill_initialize(const value_type& __val,
3699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                           const __false_type& /*_TrivialInit*/) {
3709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Map_pointer __cur = this->_M_start._M_node;
3719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
3729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for (; __cur < this->_M_finish._M_node; ++__cur)
3739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      uninitialized_fill(*__cur, *__cur + this->buffer_size(), __val);
3749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    uninitialized_fill(this->_M_finish._M_first, this->_M_finish._M_cur, __val);
3759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_UNWIND(_STLP_STD::_Destroy_Range(this->_M_start, iterator(*__cur, __cur)))
3779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Called only if this->_M_finish._M_cur == this->_M_finish._M_last - 1.
3819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc >
3829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid deque<_Tp,_Alloc>::_M_push_back_aux_v(const value_type& __t) {
3839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _M_reserve_map_at_back();
3849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  *(this->_M_finish._M_node + 1) = this->_M_map_size.allocate(this->buffer_size());
3859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
3869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Copy_Construct(this->_M_finish._M_cur, __t);
3879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_finish._M_set_node(this->_M_finish._M_node + 1);
3889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_finish._M_cur = this->_M_finish._M_first;
3899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
3909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_UNWIND(this->_M_map_size.deallocate(*(this->_M_finish._M_node + 1),
3919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                            this->buffer_size()))
3929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
3939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
3949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined(_STLP_DONT_SUP_DFLT_PARAM) && !defined(_STLP_NO_ANACHRONISMS)
3959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Called only if this->_M_finish._M_cur == this->_M_finish._M_last - 1.
3969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc >
3979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid deque<_Tp,_Alloc>::_M_push_back_aux() {
3989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _M_reserve_map_at_back();
3999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  *(this->_M_finish._M_node + 1) = this->_M_map_size.allocate(this->buffer_size());
4009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
4019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_STD::_Construct(this->_M_finish._M_cur);
4029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_finish._M_set_node(this->_M_finish._M_node + 1);
4039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_finish._M_cur = this->_M_finish._M_first;
4049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_UNWIND(this->_M_map_size.deallocate(*(this->_M_finish._M_node + 1),
4069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                            this->buffer_size()))
4079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
4089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/
4099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Called only if this->_M_start._M_cur == this->_M_start._M_first.
4119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc >
4129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid deque<_Tp,_Alloc>::_M_push_front_aux_v(const value_type& __t) {
4139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _M_reserve_map_at_front();
4149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  *(this->_M_start._M_node - 1) = this->_M_map_size.allocate(this->buffer_size());
4159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
4169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_start._M_set_node(this->_M_start._M_node - 1);
4179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_start._M_cur = this->_M_start._M_last - 1;
4189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Copy_Construct(this->_M_start._M_cur, __t);
4199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_UNWIND((++this->_M_start,
4219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                this->_M_map_size.deallocate(*(this->_M_start._M_node - 1), this->buffer_size())))
4229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
4239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
4269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Called only if this->_M_start._M_cur == this->_M_start._M_first.
4279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc >
4289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid deque<_Tp,_Alloc>::_M_push_front_aux() {
4299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _M_reserve_map_at_front();
4309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  *(this->_M_start._M_node - 1) = this->_M_map_size.allocate(this->buffer_size());
4319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
4329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_start._M_set_node(this->_M_start._M_node - 1);
4339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_start._M_cur = this->_M_start._M_last - 1;
4349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_STD::_Construct(this->_M_start._M_cur);
4359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_UNWIND((++this->_M_start, this->_M_map_size.deallocate(*(this->_M_start._M_node - 1),
4379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                                               this->buffer_size())))
4389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
4399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/
4409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Called only if this->_M_finish._M_cur == this->_M_finish._M_first.
4429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc >
4439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid deque<_Tp,_Alloc>::_M_pop_back_aux() {
4449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_map_size.deallocate(this->_M_finish._M_first, this->buffer_size());
4459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_finish._M_set_node(this->_M_finish._M_node - 1);
4469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_finish._M_cur = this->_M_finish._M_last - 1;
4479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
4489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Note that if the deque has at least one element (a precondition for this member
4509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// function), and if this->_M_start._M_cur == this->_M_start._M_last, then the deque
4519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// must have at least two nodes.
4529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc >
4539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid deque<_Tp,_Alloc>::_M_pop_front_aux() {
4549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (this->_M_start._M_cur != this->_M_start._M_last - 1)
4559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    ++this->_M_start._M_cur;
4569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else {
4579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_map_size.deallocate(this->_M_start._M_first, this->buffer_size());
4589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_start._M_set_node(this->_M_start._M_node + 1);
4599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_start._M_cur = this->_M_start._M_first;
4609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
4629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
4639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc >
4649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__iterator__ deque<_Tp,_Alloc>::_M_fill_insert_aux(iterator __pos, size_type __n,
4659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                                   const value_type& __x,
4669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                                   const __true_type& /*_Movable*/) {
4679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const difference_type __elems_before = __pos - this->_M_start;
4689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type __length = this->size();
4699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  value_type __x_copy = __x;
4709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__elems_before <= difference_type(__length / 2)) {
4719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __new_start = _M_reserve_elements_at_front(__n);
4729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __pos = this->_M_start + __elems_before;
4739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
4749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __dst = __new_start;
4759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __src = this->_M_start;
4769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      for (; __src != __pos; ++__dst, ++__src) {
4779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_STD::_Move_Construct(&(*__dst), *__src);
4789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_STD::_Destroy_Moved(&(*__src));
4799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
4809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_start = __new_start;
4819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      uninitialized_fill(__dst, __src, __x_copy);
4829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      __pos = __dst;
4839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
4849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
4859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
4869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else {
4879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __new_finish = _M_reserve_elements_at_back(__n);
4889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    const difference_type __elems_after = difference_type(__length) - __elems_before;
4899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __pos = this->_M_finish - __elems_after;
4909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
4919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __dst = __new_finish;
4929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __src = this->_M_finish;
4939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      for (--__src, --__dst; __src >= __pos; --__src, --__dst) {
4949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_STD::_Move_Construct(&(*__dst), *__src);
4959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_STD::_Destroy_Moved(&(*__src));
4969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
4979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_finish = __new_finish;
4989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      uninitialized_fill(__pos, __pos + __n, __x_copy);
4999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
5009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1))
5019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __pos;
5039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
5049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc >
5069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__iterator__ deque<_Tp,_Alloc>::_M_fill_insert_aux(iterator __pos, size_type __n,
5079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                                   const value_type& __x,
5089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                                   const __false_type& /*_Movable*/) {
5099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const difference_type __elems_before = __pos - this->_M_start;
5109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type __length = this->size();
5119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  value_type __x_copy = __x;
5129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__elems_before <= difference_type(__length / 2)) {
5139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __new_start = _M_reserve_elements_at_front(__n);
5149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __old_start = this->_M_start;
5159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __pos = this->_M_start + __elems_before;
5169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
5179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__elems_before >= difference_type(__n)) {
5189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        iterator __start_n = this->_M_start + difference_type(__n);
5199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_PRIV __ucopy(this->_M_start, __start_n, __new_start);
5209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        this->_M_start = __new_start;
521e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        _STLP_STD::copy(__start_n, __pos, __old_start);
522e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        _STLP_STD::fill(__pos - difference_type(__n), __pos, __x_copy);
5239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        __pos -= difference_type(__n);
5249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
5259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else {
5269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_PRIV __uninitialized_copy_fill(this->_M_start, __pos, __new_start,
5279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                             this->_M_start, __x_copy);
5289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        this->_M_start = __new_start;
5299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        fill(__old_start, __pos, __x_copy);
5309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
5319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
5329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
5339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else {
5359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __new_finish = _M_reserve_elements_at_back(__n);
5369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __old_finish = this->_M_finish;
5379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    const difference_type __elems_after =
5389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      difference_type(__length) - __elems_before;
5399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __pos = this->_M_finish - __elems_after;
5409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
5419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__elems_after > difference_type(__n)) {
5429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        iterator __finish_n = this->_M_finish - difference_type(__n);
5439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_PRIV __ucopy(__finish_n, this->_M_finish, this->_M_finish);
5449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        this->_M_finish = __new_finish;
5459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        copy_backward(__pos, __finish_n, __old_finish);
5469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        fill(__pos, __pos + difference_type(__n), __x_copy);
5479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
5489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else {
5499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_PRIV __uninitialized_fill_copy(this->_M_finish, __pos + difference_type(__n),
5509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                             __x_copy, __pos, this->_M_finish);
5519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        this->_M_finish = __new_finish;
5529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        fill(__pos, __old_finish, __x_copy);
5539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
5549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
5559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1))
5569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __pos;
5589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
5599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
5609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_MEMBER_TEMPLATES)
5619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc >
5629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid deque<_Tp,_Alloc>::_M_insert_range_aux(iterator __pos,
5639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                            const value_type* __first, const value_type* __last,
5649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                            size_type __n, const __true_type& /*_Movable*/) {
5659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const difference_type __elems_before = __pos - this->_M_start;
5669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type __length = size();
5679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__elems_before <= difference_type(__length / 2)) {
5689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __new_start = _M_reserve_elements_at_front(__n);
5699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __pos = this->_M_start + __elems_before;
5709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
5719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __dst = __new_start;
5729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __src = this->_M_start;
5739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      for (; __src != __pos; ++__dst, ++__src) {
5749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_STD::_Move_Construct(&(*__dst), *__src);
5759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_STD::_Destroy_Moved(&(*__src));
5769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
5779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_start = __new_start;
5789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_PRIV __ucopy(__first, __last, __dst);
5799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
5809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
5819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else {
5839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __new_finish = _M_reserve_elements_at_back(__n);
5849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    const difference_type __elems_after = difference_type(__length) - __elems_before;
5859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __pos = this->_M_finish - __elems_after;
5869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
5879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __dst = __new_finish;
5889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __src = this->_M_finish;
5899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      for (--__src, --__dst; __src >= __pos; --__src, --__dst) {
5909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_STD::_Move_Construct(&(*__dst), *__src);
5919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_STD::_Destroy_Moved(&(*__src));
5929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
5939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_finish = __new_finish;
5949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_PRIV __ucopy(__first, __last, __pos);
5959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
5969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1))
5979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
5989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
5999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc >
6019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid deque<_Tp,_Alloc>::_M_insert_range_aux(iterator __pos,
6029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                            const value_type* __first, const value_type* __last,
6039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                            size_type __n, const __false_type& /*_Movable*/) {
6049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const difference_type __elems_before = __pos - this->_M_start;
6059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type __length = size();
6069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__elems_before <= difference_type(__length / 2)) {
6079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __new_start = _M_reserve_elements_at_front(__n);
6089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __old_start = this->_M_start;
6099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __pos = this->_M_start + __elems_before;
6109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
6119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__elems_before >= difference_type(__n)) {
6129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        iterator __start_n = this->_M_start + difference_type(__n);
6139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_PRIV __ucopy(this->_M_start, __start_n, __new_start);
6149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        this->_M_start = __new_start;
615e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        _STLP_STD::copy(__start_n, __pos, __old_start);
616e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        _STLP_STD::copy(__first, __last, __pos - difference_type(__n));
6179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
6189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else {
6199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        const value_type* __mid = __first + (difference_type(__n) - __elems_before);
620e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        _STLP_PRIV __uninitialized_copy_copy(this->_M_start, __pos, __first, __mid, __new_start);
6219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        this->_M_start = __new_start;
622e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        _STLP_STD::copy(__mid, __last, __old_start);
6239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
6249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
6259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
6269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else {
6289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __new_finish = _M_reserve_elements_at_back(__n);
6299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __old_finish = this->_M_finish;
6309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    const difference_type __elems_after =
6319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      difference_type(__length) - __elems_before;
6329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __pos = this->_M_finish - __elems_after;
6339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
6349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__elems_after > difference_type(__n)) {
6369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        iterator __finish_n = this->_M_finish - difference_type(__n);
6379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_PRIV __ucopy(__finish_n, this->_M_finish, this->_M_finish);
6389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        this->_M_finish = __new_finish;
639e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        _STLP_STD::copy_backward(__pos, __finish_n, __old_finish);
640e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        _STLP_STD::copy(__first, __last, __pos);
6419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
6429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else {
6439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        const value_type* __mid = __first + __elems_after;
644e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        _STLP_PRIV __uninitialized_copy_copy(__mid, __last, __pos, this->_M_finish, this->_M_finish);
6459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        this->_M_finish = __new_finish;
646e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        _STLP_STD::copy(__first, __mid, __pos);
6479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
6489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
6499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1))
6509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
6529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc >
6549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid deque<_Tp,_Alloc>::_M_insert_range_aux(iterator __pos,
6559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                            const_iterator __first, const_iterator __last,
6569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                            size_type __n, const __true_type& /*_Movable*/) {
6579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const difference_type __elems_before = __pos - this->_M_start;
6589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type __length = size();
6599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__elems_before <= difference_type(__length / 2)) {
6609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __new_start = _M_reserve_elements_at_front(__n);
6619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __pos = this->_M_start + __elems_before;
6629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
6639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __dst = __new_start;
6649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __src = this->_M_start;
6659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      for (; __src != __pos; ++__dst, ++__src) {
6669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_STD::_Move_Construct(&(*__dst), *__src);
6679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_STD::_Destroy_Moved(&(*__src));
6689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
6699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_start = __new_start;
6709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_PRIV __ucopy(__first, __last, __dst);
6719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
6729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
6739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else {
6759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __new_finish = _M_reserve_elements_at_back(__n);
6769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    const difference_type __elems_after = difference_type(__length) - __elems_before;
6779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __pos = this->_M_finish - __elems_after;
6789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
6799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __dst = __new_finish;
6809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      iterator __src = this->_M_finish;
6819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      for (--__src, --__dst; __src >= __pos; --__src, --__dst) {
6829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_STD::_Move_Construct(&(*__dst), *__src);
6839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_STD::_Destroy_Moved(&(*__src));
6849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
6859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_finish = __new_finish;
6869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      _STLP_PRIV __ucopy(__first, __last, __pos);
6879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
6889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1))
6899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
6909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
6919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
6929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc >
6939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid deque<_Tp,_Alloc>::_M_insert_range_aux(iterator __pos,
6949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                            const_iterator __first, const_iterator __last,
6959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                            size_type __n, const __false_type& /*_Movable*/) {
6969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const difference_type __elems_before = __pos - this->_M_start;
6979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type __length = size();
6989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (__elems_before < difference_type(__length / 2)) {
6999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __new_start = _M_reserve_elements_at_front(__n);
7009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __old_start = this->_M_start;
7019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __pos = this->_M_start + __elems_before;
7029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
7039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__elems_before >= difference_type(__n)) {
7049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        iterator __start_n = this->_M_start + __n;
7059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_PRIV __ucopy(this->_M_start, __start_n, __new_start);
7069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        this->_M_start = __new_start;
707e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        _STLP_STD::copy(__start_n, __pos, __old_start);
708e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        _STLP_STD::copy(__first, __last, __pos - difference_type(__n));
7099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
7109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else {
7119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        const_iterator __mid = __first + (__n - __elems_before);
712e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        _STLP_PRIV __uninitialized_copy_copy(this->_M_start, __pos, __first, __mid, __new_start);
7139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        this->_M_start = __new_start;
714e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        _STLP_STD::copy(__mid, __last, __old_start);
7159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
7169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
7179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
7189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else {
7209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __new_finish = _M_reserve_elements_at_back(__n);
7219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    iterator __old_finish = this->_M_finish;
7229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    const difference_type __elems_after = __length - __elems_before;
7239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __pos = this->_M_finish - __elems_after;
7249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_TRY {
7259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      if (__elems_after > difference_type(__n)) {
7269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        iterator __finish_n = this->_M_finish - difference_type(__n);
7279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        _STLP_PRIV __ucopy(__finish_n, this->_M_finish, this->_M_finish);
7289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        this->_M_finish = __new_finish;
729e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        _STLP_STD::copy_backward(__pos, __finish_n, __old_finish);
730e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        _STLP_STD::copy(__first, __last, __pos);
7319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
7329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      else {
7339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        const_iterator __mid = __first + __elems_after;
734e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        _STLP_PRIV __uninitialized_copy_copy(__mid, __last, __pos, this->_M_finish, this->_M_finish);
7359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block        this->_M_finish = __new_finish;
736e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        _STLP_STD::copy(__first, __mid, __pos);
7379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      }
7389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    }
7399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1))
7409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
7429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_MEMBER_TEMPLATES */
7439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc >
7459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid deque<_Tp,_Alloc>::_M_new_elements_at_front(size_type __new_elems) {
7469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type __new_nodes
7479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      = (__new_elems + this->buffer_size() - 1) / this->buffer_size();
7489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _M_reserve_map_at_front(__new_nodes);
7499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type __i = 1;
7509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
7519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for (; __i <= __new_nodes; ++__i)
7529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      *(this->_M_start._M_node - __i) = this->_M_map_size.allocate(this->buffer_size());
7539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_UNWIND(for (size_type __j = 1; __j < __i; ++__j)
7559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                 this->_M_map_size.deallocate(*(this->_M_start._M_node - __j), this->buffer_size()))
7569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
7579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc >
7599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid deque<_Tp,_Alloc>::_M_new_elements_at_back(size_type __new_elems) {
7609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type __new_nodes
7619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      = (__new_elems + this->buffer_size() - 1) / this->buffer_size();
7629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _M_reserve_map_at_back(__new_nodes);
7639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type __i = 1;
7649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_TRY {
7659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    for (; __i <= __new_nodes; ++__i)
7669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      *(this->_M_finish._M_node + __i) = this->_M_map_size.allocate(this->buffer_size());
7679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _STLP_UNWIND(for (size_type __j = 1; __j < __i; ++__j)
7699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                 this->_M_map_size.deallocate(*(this->_M_finish._M_node + __j), this->buffer_size()))
7709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
7719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Alloc >
7739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockvoid deque<_Tp,_Alloc>::_M_reallocate_map(size_type __nodes_to_add,
7749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                                          bool __add_at_front) {
7759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type __old_num_nodes = this->_M_finish._M_node - this->_M_start._M_node + 1;
7769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  size_type __new_num_nodes = __old_num_nodes + __nodes_to_add;
7779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Map_pointer __new_nstart;
7799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  if (this->_M_map_size._M_data > 2 * __new_num_nodes) {
7809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __new_nstart = this->_M_map._M_data + (this->_M_map_size._M_data - __new_num_nodes) / 2
7819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block                     + (__add_at_front ? __nodes_to_add : 0);
7829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    if (__new_nstart < this->_M_start._M_node)
783e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _STLP_STD::copy(this->_M_start._M_node, this->_M_finish._M_node + 1, __new_nstart);
7849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    else
785e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      _STLP_STD::copy_backward(this->_M_start._M_node, this->_M_finish._M_node + 1,
786e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                               __new_nstart + __old_num_nodes);
7879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
7889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  else {
7899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    size_type __new_map_size =
7909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block      this->_M_map_size._M_data + (max)((size_t)this->_M_map_size._M_data, __nodes_to_add) + 2;
7919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    _Map_pointer __new_map = this->_M_map.allocate(__new_map_size);
7939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __new_nstart = __new_map + (__new_map_size - __new_num_nodes) / 2
794e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                             + (__add_at_front ? __nodes_to_add : 0);
795e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    _STLP_STD::copy(this->_M_start._M_node, this->_M_finish._M_node + 1, __new_nstart);
7969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_map.deallocate(this->_M_map._M_data, this->_M_map_size._M_data);
7979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
7989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_map._M_data = __new_map;
7999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    this->_M_map_size._M_data = __new_map_size;
8009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
8019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_start._M_set_node(__new_nstart);
8039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  this->_M_finish._M_set_node(__new_nstart + __old_num_nodes - 1);
8049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
8059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (deque)
8079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  undef deque
8089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE
8099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
8109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE
8129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef __iterator__
8149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef iterator
8159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef const_iterator
8169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef size_type
8179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#undef value_type
8189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /*  _STLP_DEQUE_C */
8209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
8219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Local Variables:
8229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// mode:C++
8239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// End:
824