111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1994
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Hewlett-Packard Company
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1996,1997
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Silicon Graphics Computer Systems, Inc.
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1997
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Moscow Center for SPARC Technology
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright (c) 1999
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Boris Fomitchev
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This material is provided "as is", with absolutely no warranty expressed
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * or implied. Any use is at your own risk.
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Permission to use or copy this software for any purpose is hereby granted
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * without fee, provided the above notices are retained on all copies.
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Permission to modify the code and to distribute modified code is granted,
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * provided the above notices are retained, and a notice that the code was
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * modified is included with the above copyright notice.
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _STLP_DEQUE_C
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _STLP_DEQUE_C
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _STLP_INTERNAL_DEQUE_H
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  include <stl/_deque.h>
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_BEGIN_NAMESPACE
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_MOVE_TO_PRIV_NAMESPACE
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Non-inline member functions from _Deque_base.
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc >
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_Deque_base<_Tp,_Alloc >::~_Deque_base() {
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  if (_M_map._M_data) {
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_destroy_nodes(_M_start._M_node, this->_M_finish._M_node + 1);
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_map.deallocate(_M_map._M_data, _M_map_size._M_data);
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc >
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid _Deque_base<_Tp,_Alloc>::_M_initialize_map(size_t __num_elements) {
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  size_t __num_nodes = __num_elements / this->buffer_size() + 1 ;
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _M_map_size._M_data = (max)((size_t) _S_initial_map_size, __num_nodes + 2);
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _M_map._M_data = _M_map.allocate(_M_map_size._M_data);
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Tp** __nstart = _M_map._M_data + (_M_map_size._M_data - __num_nodes) / 2;
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Tp** __nfinish = __nstart + __num_nodes;
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _STLP_TRY {
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_create_nodes(__nstart, __nfinish);
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _STLP_UNWIND((_M_map.deallocate(_M_map._M_data, _M_map_size._M_data),
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                _M_map._M_data = 0, _M_map_size._M_data = 0))
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _M_start._M_set_node(__nstart);
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  this->_M_finish._M_set_node(__nfinish - 1);
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _M_start._M_cur = _M_start._M_first;
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  this->_M_finish._M_cur = this->_M_finish._M_first + __num_elements % this->buffer_size();
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc >
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid _Deque_base<_Tp,_Alloc>::_M_create_nodes(_Tp** __nstart,
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                              _Tp** __nfinish) {
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Tp** __cur = __nstart;
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _STLP_TRY {
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    for (; __cur < __nfinish; ++__cur)
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      *__cur = _M_map_size.allocate(this->buffer_size());
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _STLP_UNWIND(_M_destroy_nodes(__nstart, __cur))
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc >
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid _Deque_base<_Tp,_Alloc>::_M_destroy_nodes(_Tp** __nstart,
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                               _Tp** __nfinish) {
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  for (_Tp** __n = __nstart; __n < __nfinish; ++__n)
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_map_size.deallocate(*__n, this->buffer_size());
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_USE_PTR_SPECIALIZATIONS)
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  define deque _STLP_PTR_IMPL_NAME(deque)
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#elif defined (_STLP_DEBUG)
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  define deque _STLP_NON_DBG_NAME(deque)
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_MOVE_TO_STD_NAMESPACE
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_NESTED_TYPE_PARAM_BUG)
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// qualified references
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  define __iterator__   _Deque_iterator<_Tp, _Nonconst_traits<_Tp> >
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  define const_iterator _Deque_iterator<_Tp, _Const_traits<_Tp>  >
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  define iterator       __iterator__
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  define size_type      size_t
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  define value_type     _Tp
10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  define __iterator__   _STLP_TYPENAME_ON_RETURN_TYPE deque<_Tp, _Alloc>::iterator
10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc >
10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertdeque<_Tp, _Alloc >&
10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertdeque<_Tp, _Alloc >::operator= (const deque<_Tp, _Alloc >& __x) {
10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  const size_type __len = size();
10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  if (&__x != this) {
11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (__len >= __x.size())
11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      erase(_STLP_STD::copy(__x.begin(), __x.end(), this->_M_start), this->_M_finish);
11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    else {
11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const_iterator __mid = __x.begin() + difference_type(__len);
11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _STLP_STD::copy(__x.begin(), __mid, this->_M_start);
11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      insert(this->_M_finish, __mid, __x.end());
11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  return *this;
11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc >
12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid deque<_Tp, _Alloc >::_M_fill_insert(iterator __pos,
12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                         size_type __n, const value_type& __x) {
12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined (_STLP_NO_MOVE_SEMANTIC)
12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef typename __move_traits<_Tp>::implemented _Movable;
12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  if (__pos._M_cur == this->_M_start._M_cur) {
12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    iterator __new_start = _M_reserve_elements_at_front(__n);
12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_TRY {
13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      uninitialized_fill(__new_start, this->_M_start, __x);
13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_start = __new_start;
13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  else if (__pos._M_cur == this->_M_finish._M_cur) {
13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    iterator __new_finish = _M_reserve_elements_at_back(__n);
13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_TRY {
13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      uninitialized_fill(this->_M_finish, __new_finish, __x);
13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node+1, __new_finish._M_node+1))
14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_finish = __new_finish;
14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  else
14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_fill_insert_aux(__pos, __n, __x, _Movable());
14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined (_STLP_MEMBER_TEMPLATES)
14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc >
15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid deque<_Tp, _Alloc>::insert(iterator __pos,
15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                const value_type* __first, const value_type* __last) {
15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined (_STLP_NO_MOVE_SEMANTIC)
15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef typename __move_traits<_Tp>::implemented _Movable;
15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  size_type __n = __last - __first;
15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  if (__pos._M_cur == this->_M_start._M_cur) {
15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    iterator __new_start = _M_reserve_elements_at_front(__n);
15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_TRY {
15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _STLP_PRIV __ucopy(__first, __last, __new_start);
16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_start = __new_start;
16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  else if (__pos._M_cur == this->_M_finish._M_cur) {
16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    iterator __new_finish = _M_reserve_elements_at_back(__n);
16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_TRY {
16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _STLP_PRIV __ucopy(__first, __last, this->_M_finish);
16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1,
17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                        __new_finish._M_node + 1))
17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_finish = __new_finish;
17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  else
17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_insert_range_aux(__pos, __first, __last, __n, _Movable());
17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
17711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc >
17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid deque<_Tp,_Alloc>::insert(iterator __pos,
17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                               const_iterator __first, const_iterator __last) {
18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined (_STLP_NO_MOVE_SEMANTIC)
18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  typedef typename __move_traits<_Tp>::implemented _Movable;
18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  size_type __n = __last - __first;
18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  if (__pos._M_cur == this->_M_start._M_cur) {
18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    iterator __new_start = _M_reserve_elements_at_front(__n);
18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_TRY {
18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _STLP_PRIV __ucopy(__first, __last, __new_start);
18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_start = __new_start;
19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  else if (__pos._M_cur == this->_M_finish._M_cur) {
19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    iterator __new_finish = _M_reserve_elements_at_back(__n);
19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_TRY {
19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _STLP_PRIV __ucopy(__first, __last, this->_M_finish);
19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1,
19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                        __new_finish._M_node + 1))
19911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_finish = __new_finish;
20011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
20111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  else
20211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_insert_range_aux(__pos, __first, __last, __n, _Movable());
20311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
20411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
20511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* _STLP_MEMBER_TEMPLATES */
20611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
20711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc >
20811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__iterator__ deque<_Tp,_Alloc>::_M_erase(iterator __pos,
20911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                         const __true_type& /*_Movable*/) {
21011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  difference_type __index = __pos - this->_M_start;
21111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  if (size_type(__index) < this->size() >> 1) {
21211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    //We move the start of the deque one position to the right
21311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    //starting from the rightmost element to move.
21411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    iterator __src = __pos, __dst = __pos;
21511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_STD::_Destroy(&(*__dst));
21611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (__src != this->_M_start) {
21711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      for (--__src; __dst != this->_M_start; --__src, --__dst) {
21811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::_Move_Construct(&(*__dst), *__src);
21911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::_Destroy_Moved(&(*__src));
22011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
22111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
22211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _M_pop_front_aux();
22311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
22411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  else {
22511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    iterator __src = __pos, __dst = __pos;
22611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_STD::_Destroy(&(*__dst));
22711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    for (++__src; __src != this->_M_finish; ++__src, ++__dst) {
22811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _STLP_STD::_Move_Construct(&(*__dst), *__src);
22911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _STLP_STD::_Destroy_Moved(&(*__src));
23011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
23111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    //Duplication of the pop_back code without the destroy which has already been done:
23211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (this->_M_finish._M_cur != this->_M_finish._M_first) {
23311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      --this->_M_finish._M_cur;
23411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
23511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    else {
23611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_pop_back_aux();
23711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
23811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
23911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  return this->_M_start + __index;
24011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
24111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
24211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc >
24311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__iterator__ deque<_Tp,_Alloc>::_M_erase(iterator __pos,
24411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                         const __false_type& /*_Movable*/) {
24511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  iterator __next = __pos;
24611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  ++__next;
24711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  difference_type __index = __pos - this->_M_start;
24811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  if (size_type(__index) < this->size() >> 1) {
24911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    copy_backward(this->_M_start, __pos, __next);
25011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    pop_front();
25111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
25211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  else {
25311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_STD::copy(__next, this->_M_finish, __pos);
25411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    pop_back();
25511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
25611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  return this->_M_start + __index;
25711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
25811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
25911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc >
26011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__iterator__ deque<_Tp,_Alloc>::_M_erase(iterator __first, iterator __last,
26111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                         const __true_type& /*_Movable*/) {
26211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  difference_type __n = __last - __first;
26311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  difference_type __elems_before = __first - this->_M_start;
26411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  if (__elems_before <= difference_type(this->size() - __n) / 2) {
26511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    iterator __src = __first, __dst = __last;
26611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (__src != this->_M_start) {
26711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      for (--__src, --__dst; (__src >= this->_M_start) && (__dst >= __first); --__src, --__dst) {
26811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::_Destroy(&(*__dst));
26911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::_Move_Construct(&(*__dst), *__src);
27011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
27111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      if (__dst >= __first) {
27211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        //There are more elements to erase than elements to move
27311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::_Destroy_Range(__first, ++__dst);
27411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::_Destroy_Moved_Range(this->_M_start, __first);
27511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
27611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      else {
27711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        //There are more elements to move than elements to erase
27811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        for (; __src >= this->_M_start; --__src, --__dst) {
27911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert          _STLP_STD::_Destroy_Moved(&(*__dst));
28011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert          _STLP_STD::_Move_Construct(&(*__dst), *__src);
28111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        }
28211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::_Destroy_Moved_Range(this->_M_start, ++__dst);
28311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
28411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
28511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    else {
28611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _STLP_STD::_Destroy_Range(this->_M_start, __last);
28711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
28811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    iterator __new_start = this->_M_start + __n;
28911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_destroy_nodes(this->_M_start._M_node, __new_start._M_node);
29011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_start = __new_start;
29111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
29211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  else {
29311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (__last != this->_M_finish) {
29411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      iterator __src = __last, __dst = __first;
29511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      for (; (__src != this->_M_finish) && (__dst != __last); ++__src, ++__dst) {
29611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::_Destroy(&(*__dst));
29711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::_Move_Construct(&(*__dst), *__src);
29811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
29911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      if (__dst != __last) {
30011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        //There are more elements to erase than elements to move
30111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::_Destroy_Range(__dst, __last);
30211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::_Destroy_Moved_Range(__last, this->_M_finish);
30311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
30411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      else {
30511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        //There are more elements to move than elements to erase
30611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        for (; __src != this->_M_finish; ++__src, ++__dst) {
30711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert          _STLP_STD::_Destroy_Moved(&(*__dst));
30811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert          _STLP_STD::_Move_Construct(&(*__dst), *__src);
30911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        }
31011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::_Destroy_Moved_Range(__dst, this->_M_finish);
31111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
31211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
31311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    else {
31411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _STLP_STD::_Destroy_Range(__first, this->_M_finish);
31511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
31611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    iterator __new_finish = this->_M_finish - __n;
31711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_destroy_nodes(__new_finish._M_node + 1, this->_M_finish._M_node + 1);
31811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_finish = __new_finish;
31911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
32011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  return this->_M_start + __elems_before;
32111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
32211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
32311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc >
32411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__iterator__ deque<_Tp,_Alloc>::_M_erase(iterator __first, iterator __last,
32511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                         const __false_type& /*_Movable*/) {
32611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  difference_type __n = __last - __first;
32711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  difference_type __elems_before = __first - this->_M_start;
32811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  if (__elems_before <= difference_type(this->size() - __n) / 2) {
32911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    copy_backward(this->_M_start, __first, __last);
33011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    iterator __new_start = this->_M_start + __n;
33111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_STD::_Destroy_Range(this->_M_start, __new_start);
33211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_destroy_nodes(this->_M_start._M_node, __new_start._M_node);
33311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_start = __new_start;
33411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
33511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  else {
33611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_STD::copy(__last, this->_M_finish, __first);
33711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    iterator __new_finish = this->_M_finish - __n;
33811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_STD::_Destroy_Range(__new_finish, this->_M_finish);
33911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_destroy_nodes(__new_finish._M_node + 1, this->_M_finish._M_node + 1);
34011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_finish = __new_finish;
34111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
34211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  return this->_M_start + __elems_before;
34311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
34411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
34511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc >
34611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid deque<_Tp,_Alloc>::clear() {
34711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  for (_Map_pointer __node = this->_M_start._M_node + 1;
34811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       __node < this->_M_finish._M_node;
34911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       ++__node) {
35011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_STD::_Destroy_Range(*__node, *__node + this->buffer_size());
35111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_map_size.deallocate(*__node, this->buffer_size());
35211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
35311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
35411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  if (this->_M_start._M_node != this->_M_finish._M_node) {
35511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_STD::_Destroy_Range(this->_M_start._M_cur, this->_M_start._M_last);
35611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_STD::_Destroy_Range(this->_M_finish._M_first, this->_M_finish._M_cur);
35711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_map_size.deallocate(this->_M_finish._M_first, this->buffer_size());
35811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
35911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  else
36011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_STD::_Destroy_Range(this->_M_start._M_cur, this->_M_finish._M_cur);
36111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
36211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  this->_M_finish = this->_M_start;
36311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
36411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
36511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Precondition: this->_M_start and this->_M_finish have already been initialized,
36611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// but none of the deque's elements have yet been constructed.
36711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc >
36811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid deque<_Tp,_Alloc>::_M_fill_initialize(const value_type& __val,
36911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                           const __false_type& /*_TrivialInit*/) {
37011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Map_pointer __cur = this->_M_start._M_node;
37111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _STLP_TRY {
37211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    for (; __cur < this->_M_finish._M_node; ++__cur)
37311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      uninitialized_fill(*__cur, *__cur + this->buffer_size(), __val);
37411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    uninitialized_fill(this->_M_finish._M_first, this->_M_finish._M_cur, __val);
37511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
37611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _STLP_UNWIND(_STLP_STD::_Destroy_Range(this->_M_start, iterator(*__cur, __cur)))
37711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
37811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
37911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
38011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Called only if this->_M_finish._M_cur == this->_M_finish._M_last - 1.
38111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc >
38211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid deque<_Tp,_Alloc>::_M_push_back_aux_v(const value_type& __t) {
38311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _M_reserve_map_at_back();
38411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  *(this->_M_finish._M_node + 1) = this->_M_map_size.allocate(this->buffer_size());
38511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _STLP_TRY {
38611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _Copy_Construct(this->_M_finish._M_cur, __t);
38711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_finish._M_set_node(this->_M_finish._M_node + 1);
38811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_finish._M_cur = this->_M_finish._M_first;
38911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
39011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _STLP_UNWIND(this->_M_map_size.deallocate(*(this->_M_finish._M_node + 1),
39111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                            this->buffer_size()))
39211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
39311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
39411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined(_STLP_DONT_SUP_DFLT_PARAM) && !defined(_STLP_NO_ANACHRONISMS)
39511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Called only if this->_M_finish._M_cur == this->_M_finish._M_last - 1.
39611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc >
39711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid deque<_Tp,_Alloc>::_M_push_back_aux() {
39811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _M_reserve_map_at_back();
39911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  *(this->_M_finish._M_node + 1) = this->_M_map_size.allocate(this->buffer_size());
40011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _STLP_TRY {
40111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_STD::_Construct(this->_M_finish._M_cur);
40211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_finish._M_set_node(this->_M_finish._M_node + 1);
40311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_finish._M_cur = this->_M_finish._M_first;
40411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
40511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _STLP_UNWIND(this->_M_map_size.deallocate(*(this->_M_finish._M_node + 1),
40611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                            this->buffer_size()))
40711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
40811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /*_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/
40911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
41011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Called only if this->_M_start._M_cur == this->_M_start._M_first.
41111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc >
41211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid deque<_Tp,_Alloc>::_M_push_front_aux_v(const value_type& __t) {
41311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _M_reserve_map_at_front();
41411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  *(this->_M_start._M_node - 1) = this->_M_map_size.allocate(this->buffer_size());
41511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _STLP_TRY {
41611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_start._M_set_node(this->_M_start._M_node - 1);
41711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_start._M_cur = this->_M_start._M_last - 1;
41811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _Copy_Construct(this->_M_start._M_cur, __t);
41911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
42011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _STLP_UNWIND((++this->_M_start,
42111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                this->_M_map_size.deallocate(*(this->_M_start._M_node - 1), this->buffer_size())))
42211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
42311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
42411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
42511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
42611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Called only if this->_M_start._M_cur == this->_M_start._M_first.
42711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc >
42811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid deque<_Tp,_Alloc>::_M_push_front_aux() {
42911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _M_reserve_map_at_front();
43011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  *(this->_M_start._M_node - 1) = this->_M_map_size.allocate(this->buffer_size());
43111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _STLP_TRY {
43211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_start._M_set_node(this->_M_start._M_node - 1);
43311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_start._M_cur = this->_M_start._M_last - 1;
43411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_STD::_Construct(this->_M_start._M_cur);
43511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
43611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _STLP_UNWIND((++this->_M_start, this->_M_map_size.deallocate(*(this->_M_start._M_node - 1),
43711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                                               this->buffer_size())))
43811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
43911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /*_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/
44011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
44111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Called only if this->_M_finish._M_cur == this->_M_finish._M_first.
44211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc >
44311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid deque<_Tp,_Alloc>::_M_pop_back_aux() {
44411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  this->_M_map_size.deallocate(this->_M_finish._M_first, this->buffer_size());
44511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  this->_M_finish._M_set_node(this->_M_finish._M_node - 1);
44611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  this->_M_finish._M_cur = this->_M_finish._M_last - 1;
44711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
44811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
44911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Note that if the deque has at least one element (a precondition for this member
45011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// function), and if this->_M_start._M_cur == this->_M_start._M_last, then the deque
45111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// must have at least two nodes.
45211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc >
45311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid deque<_Tp,_Alloc>::_M_pop_front_aux() {
45411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  if (this->_M_start._M_cur != this->_M_start._M_last - 1)
45511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ++this->_M_start._M_cur;
45611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  else {
45711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_map_size.deallocate(this->_M_start._M_first, this->buffer_size());
45811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_start._M_set_node(this->_M_start._M_node + 1);
45911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_start._M_cur = this->_M_start._M_first;
46011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
46111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
46211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
46311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc >
46411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__iterator__ deque<_Tp,_Alloc>::_M_fill_insert_aux(iterator __pos, size_type __n,
46511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                                   const value_type& __x,
46611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                                   const __true_type& /*_Movable*/) {
46711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  const difference_type __elems_before = __pos - this->_M_start;
46811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  size_type __length = this->size();
46911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  value_type __x_copy = __x;
47011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  if (__elems_before <= difference_type(__length / 2)) {
47111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    iterator __new_start = _M_reserve_elements_at_front(__n);
47211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __pos = this->_M_start + __elems_before;
47311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_TRY {
47411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      iterator __dst = __new_start;
47511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      iterator __src = this->_M_start;
47611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      for (; __src != __pos; ++__dst, ++__src) {
47711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::_Move_Construct(&(*__dst), *__src);
47811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::_Destroy_Moved(&(*__src));
47911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
48011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      this->_M_start = __new_start;
48111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      uninitialized_fill(__dst, __src, __x_copy);
48211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __pos = __dst;
48311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
48411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
48511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
48611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  else {
48711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    iterator __new_finish = _M_reserve_elements_at_back(__n);
48811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    const difference_type __elems_after = difference_type(__length) - __elems_before;
48911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __pos = this->_M_finish - __elems_after;
49011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_TRY {
49111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      iterator __dst = __new_finish;
49211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      iterator __src = this->_M_finish;
49311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      for (--__src, --__dst; __src >= __pos; --__src, --__dst) {
49411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::_Move_Construct(&(*__dst), *__src);
49511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::_Destroy_Moved(&(*__src));
49611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
49711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      this->_M_finish = __new_finish;
49811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      uninitialized_fill(__pos, __pos + __n, __x_copy);
49911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
50011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1))
50111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
50211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  return __pos;
50311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
50411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
50511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc >
50611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__iterator__ deque<_Tp,_Alloc>::_M_fill_insert_aux(iterator __pos, size_type __n,
50711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                                   const value_type& __x,
50811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                                   const __false_type& /*_Movable*/) {
50911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  const difference_type __elems_before = __pos - this->_M_start;
51011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  size_type __length = this->size();
51111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  value_type __x_copy = __x;
51211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  if (__elems_before <= difference_type(__length / 2)) {
51311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    iterator __new_start = _M_reserve_elements_at_front(__n);
51411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    iterator __old_start = this->_M_start;
51511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __pos = this->_M_start + __elems_before;
51611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_TRY {
51711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      if (__elems_before >= difference_type(__n)) {
51811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        iterator __start_n = this->_M_start + difference_type(__n);
51911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_PRIV __ucopy(this->_M_start, __start_n, __new_start);
52011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        this->_M_start = __new_start;
52111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::copy(__start_n, __pos, __old_start);
52211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::fill(__pos - difference_type(__n), __pos, __x_copy);
52311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        __pos -= difference_type(__n);
52411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
52511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      else {
52611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_PRIV __uninitialized_copy_fill(this->_M_start, __pos, __new_start,
52711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                             this->_M_start, __x_copy);
52811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        this->_M_start = __new_start;
52911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        fill(__old_start, __pos, __x_copy);
53011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
53111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
53211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
53311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
53411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  else {
53511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    iterator __new_finish = _M_reserve_elements_at_back(__n);
53611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    iterator __old_finish = this->_M_finish;
53711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    const difference_type __elems_after =
53811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      difference_type(__length) - __elems_before;
53911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __pos = this->_M_finish - __elems_after;
54011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_TRY {
54111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      if (__elems_after > difference_type(__n)) {
54211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        iterator __finish_n = this->_M_finish - difference_type(__n);
54311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_PRIV __ucopy(__finish_n, this->_M_finish, this->_M_finish);
54411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        this->_M_finish = __new_finish;
54511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        copy_backward(__pos, __finish_n, __old_finish);
54611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        fill(__pos, __pos + difference_type(__n), __x_copy);
54711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
54811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      else {
54911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_PRIV __uninitialized_fill_copy(this->_M_finish, __pos + difference_type(__n),
55011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                             __x_copy, __pos, this->_M_finish);
55111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        this->_M_finish = __new_finish;
55211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        fill(__pos, __old_finish, __x_copy);
55311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
55411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
55511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1))
55611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
55711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  return __pos;
55811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
55911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
56011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if !defined (_STLP_MEMBER_TEMPLATES)
56111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc >
56211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid deque<_Tp,_Alloc>::_M_insert_range_aux(iterator __pos,
56311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                            const value_type* __first, const value_type* __last,
56411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                            size_type __n, const __true_type& /*_Movable*/) {
56511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  const difference_type __elems_before = __pos - this->_M_start;
56611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  size_type __length = size();
56711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  if (__elems_before <= difference_type(__length / 2)) {
56811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    iterator __new_start = _M_reserve_elements_at_front(__n);
56911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __pos = this->_M_start + __elems_before;
57011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_TRY {
57111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      iterator __dst = __new_start;
57211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      iterator __src = this->_M_start;
57311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      for (; __src != __pos; ++__dst, ++__src) {
57411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::_Move_Construct(&(*__dst), *__src);
57511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::_Destroy_Moved(&(*__src));
57611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
57711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      this->_M_start = __new_start;
57811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _STLP_PRIV __ucopy(__first, __last, __dst);
57911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
58011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
58111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
58211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  else {
58311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    iterator __new_finish = _M_reserve_elements_at_back(__n);
58411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    const difference_type __elems_after = difference_type(__length) - __elems_before;
58511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __pos = this->_M_finish - __elems_after;
58611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_TRY {
58711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      iterator __dst = __new_finish;
58811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      iterator __src = this->_M_finish;
58911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      for (--__src, --__dst; __src >= __pos; --__src, --__dst) {
59011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::_Move_Construct(&(*__dst), *__src);
59111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::_Destroy_Moved(&(*__src));
59211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
59311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      this->_M_finish = __new_finish;
59411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _STLP_PRIV __ucopy(__first, __last, __pos);
59511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
59611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1))
59711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
59811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
59911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
60011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc >
60111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid deque<_Tp,_Alloc>::_M_insert_range_aux(iterator __pos,
60211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                            const value_type* __first, const value_type* __last,
60311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                            size_type __n, const __false_type& /*_Movable*/) {
60411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  const difference_type __elems_before = __pos - this->_M_start;
60511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  size_type __length = size();
60611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  if (__elems_before <= difference_type(__length / 2)) {
60711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    iterator __new_start = _M_reserve_elements_at_front(__n);
60811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    iterator __old_start = this->_M_start;
60911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __pos = this->_M_start + __elems_before;
61011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_TRY {
61111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      if (__elems_before >= difference_type(__n)) {
61211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        iterator __start_n = this->_M_start + difference_type(__n);
61311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_PRIV __ucopy(this->_M_start, __start_n, __new_start);
61411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        this->_M_start = __new_start;
61511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::copy(__start_n, __pos, __old_start);
61611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::copy(__first, __last, __pos - difference_type(__n));
61711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
61811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      else {
61911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        const value_type* __mid = __first + (difference_type(__n) - __elems_before);
62011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_PRIV __uninitialized_copy_copy(this->_M_start, __pos, __first, __mid, __new_start);
62111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        this->_M_start = __new_start;
62211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::copy(__mid, __last, __old_start);
62311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
62411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
62511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
62611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
62711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  else {
62811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    iterator __new_finish = _M_reserve_elements_at_back(__n);
62911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    iterator __old_finish = this->_M_finish;
63011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    const difference_type __elems_after =
63111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      difference_type(__length) - __elems_before;
63211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __pos = this->_M_finish - __elems_after;
63311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_TRY {
63411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
63511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      if (__elems_after > difference_type(__n)) {
63611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        iterator __finish_n = this->_M_finish - difference_type(__n);
63711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_PRIV __ucopy(__finish_n, this->_M_finish, this->_M_finish);
63811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        this->_M_finish = __new_finish;
63911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::copy_backward(__pos, __finish_n, __old_finish);
64011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::copy(__first, __last, __pos);
64111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
64211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      else {
64311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        const value_type* __mid = __first + __elems_after;
64411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_PRIV __uninitialized_copy_copy(__mid, __last, __pos, this->_M_finish, this->_M_finish);
64511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        this->_M_finish = __new_finish;
64611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::copy(__first, __mid, __pos);
64711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
64811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
64911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1))
65011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
65111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
65211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
65311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc >
65411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid deque<_Tp,_Alloc>::_M_insert_range_aux(iterator __pos,
65511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                            const_iterator __first, const_iterator __last,
65611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                            size_type __n, const __true_type& /*_Movable*/) {
65711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  const difference_type __elems_before = __pos - this->_M_start;
65811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  size_type __length = size();
65911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  if (__elems_before <= difference_type(__length / 2)) {
66011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    iterator __new_start = _M_reserve_elements_at_front(__n);
66111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __pos = this->_M_start + __elems_before;
66211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_TRY {
66311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      iterator __dst = __new_start;
66411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      iterator __src = this->_M_start;
66511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      for (; __src != __pos; ++__dst, ++__src) {
66611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::_Move_Construct(&(*__dst), *__src);
66711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::_Destroy_Moved(&(*__src));
66811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
66911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      this->_M_start = __new_start;
67011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _STLP_PRIV __ucopy(__first, __last, __dst);
67111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
67211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
67311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
67411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  else {
67511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    iterator __new_finish = _M_reserve_elements_at_back(__n);
67611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    const difference_type __elems_after = difference_type(__length) - __elems_before;
67711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __pos = this->_M_finish - __elems_after;
67811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_TRY {
67911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      iterator __dst = __new_finish;
68011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      iterator __src = this->_M_finish;
68111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      for (--__src, --__dst; __src >= __pos; --__src, --__dst) {
68211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::_Move_Construct(&(*__dst), *__src);
68311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::_Destroy_Moved(&(*__src));
68411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
68511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      this->_M_finish = __new_finish;
68611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _STLP_PRIV __ucopy(__first, __last, __pos);
68711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
68811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1))
68911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
69011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
69111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
69211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc >
69311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid deque<_Tp,_Alloc>::_M_insert_range_aux(iterator __pos,
69411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                            const_iterator __first, const_iterator __last,
69511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                            size_type __n, const __false_type& /*_Movable*/) {
69611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  const difference_type __elems_before = __pos - this->_M_start;
69711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  size_type __length = size();
69811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  if (__elems_before < difference_type(__length / 2)) {
69911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    iterator __new_start = _M_reserve_elements_at_front(__n);
70011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    iterator __old_start = this->_M_start;
70111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __pos = this->_M_start + __elems_before;
70211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_TRY {
70311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      if (__elems_before >= difference_type(__n)) {
70411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        iterator __start_n = this->_M_start + __n;
70511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_PRIV __ucopy(this->_M_start, __start_n, __new_start);
70611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        this->_M_start = __new_start;
70711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::copy(__start_n, __pos, __old_start);
70811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::copy(__first, __last, __pos - difference_type(__n));
70911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
71011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      else {
71111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        const_iterator __mid = __first + (__n - __elems_before);
71211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_PRIV __uninitialized_copy_copy(this->_M_start, __pos, __first, __mid, __new_start);
71311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        this->_M_start = __new_start;
71411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::copy(__mid, __last, __old_start);
71511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
71611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
71711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
71811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
71911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  else {
72011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    iterator __new_finish = _M_reserve_elements_at_back(__n);
72111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    iterator __old_finish = this->_M_finish;
72211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    const difference_type __elems_after = __length - __elems_before;
72311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __pos = this->_M_finish - __elems_after;
72411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_TRY {
72511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      if (__elems_after > difference_type(__n)) {
72611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        iterator __finish_n = this->_M_finish - difference_type(__n);
72711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_PRIV __ucopy(__finish_n, this->_M_finish, this->_M_finish);
72811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        this->_M_finish = __new_finish;
72911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::copy_backward(__pos, __finish_n, __old_finish);
73011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::copy(__first, __last, __pos);
73111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
73211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      else {
73311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        const_iterator __mid = __first + __elems_after;
73411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_PRIV __uninitialized_copy_copy(__mid, __last, __pos, this->_M_finish, this->_M_finish);
73511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        this->_M_finish = __new_finish;
73611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        _STLP_STD::copy(__first, __mid, __pos);
73711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
73811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
73911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1))
74011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
74111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
74211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* _STLP_MEMBER_TEMPLATES */
74311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
74411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc >
74511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid deque<_Tp,_Alloc>::_M_new_elements_at_front(size_type __new_elems) {
74611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  size_type __new_nodes
74711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      = (__new_elems + this->buffer_size() - 1) / this->buffer_size();
74811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _M_reserve_map_at_front(__new_nodes);
74911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  size_type __i = 1;
75011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _STLP_TRY {
75111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    for (; __i <= __new_nodes; ++__i)
75211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      *(this->_M_start._M_node - __i) = this->_M_map_size.allocate(this->buffer_size());
75311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
75411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _STLP_UNWIND(for (size_type __j = 1; __j < __i; ++__j)
75511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                 this->_M_map_size.deallocate(*(this->_M_start._M_node - __j), this->buffer_size()))
75611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
75711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
75811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc >
75911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid deque<_Tp,_Alloc>::_M_new_elements_at_back(size_type __new_elems) {
76011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  size_type __new_nodes
76111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      = (__new_elems + this->buffer_size() - 1) / this->buffer_size();
76211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _M_reserve_map_at_back(__new_nodes);
76311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  size_type __i = 1;
76411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _STLP_TRY {
76511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    for (; __i <= __new_nodes; ++__i)
76611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      *(this->_M_finish._M_node + __i) = this->_M_map_size.allocate(this->buffer_size());
76711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
76811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _STLP_UNWIND(for (size_type __j = 1; __j < __i; ++__j)
76911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                 this->_M_map_size.deallocate(*(this->_M_finish._M_node + __j), this->buffer_size()))
77011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
77111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
77211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class _Tp, class _Alloc >
77311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid deque<_Tp,_Alloc>::_M_reallocate_map(size_type __nodes_to_add,
77411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                          bool __add_at_front) {
77511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  size_type __old_num_nodes = this->_M_finish._M_node - this->_M_start._M_node + 1;
77611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  size_type __new_num_nodes = __old_num_nodes + __nodes_to_add;
77711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
77811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  _Map_pointer __new_nstart;
77911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  if (this->_M_map_size._M_data > 2 * __new_num_nodes) {
78011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __new_nstart = this->_M_map._M_data + (this->_M_map_size._M_data - __new_num_nodes) / 2
78111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                     + (__add_at_front ? __nodes_to_add : 0);
78211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (__new_nstart < this->_M_start._M_node)
78311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _STLP_STD::copy(this->_M_start._M_node, this->_M_finish._M_node + 1, __new_nstart);
78411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    else
78511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _STLP_STD::copy_backward(this->_M_start._M_node, this->_M_finish._M_node + 1,
78611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                               __new_nstart + __old_num_nodes);
78711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
78811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  else {
78911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    size_type __new_map_size =
79011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      this->_M_map_size._M_data + (max)((size_t)this->_M_map_size._M_data, __nodes_to_add) + 2;
79111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
79211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _Map_pointer __new_map = this->_M_map.allocate(__new_map_size);
79311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __new_nstart = __new_map + (__new_map_size - __new_num_nodes) / 2
79411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                             + (__add_at_front ? __nodes_to_add : 0);
79511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _STLP_STD::copy(this->_M_start._M_node, this->_M_finish._M_node + 1, __new_nstart);
79611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_map.deallocate(this->_M_map._M_data, this->_M_map_size._M_data);
79711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
79811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_map._M_data = __new_map;
79911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    this->_M_map_size._M_data = __new_map_size;
80011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
80111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
80211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  this->_M_start._M_set_node(__new_nstart);
80311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  this->_M_finish._M_set_node(__new_nstart + __old_num_nodes - 1);
80411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
80511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
80611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if defined (deque)
80711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#  undef deque
80811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_MOVE_TO_STD_NAMESPACE
80911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
81011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
81111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_STLP_END_NAMESPACE
81211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
81311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#undef __iterator__
81411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#undef iterator
81511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#undef const_iterator
81611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#undef size_type
81711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#undef value_type
81811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
81911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /*  _STLP_DEQUE_C */
82011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
82111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Local Variables:
82211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// mode:C++
82311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// End:
824