epoc32/include/tools/stlport/stl/_deque.c
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
permissions -rw-r--r--
Current Symbian^3 public API header files (from PDK 3.0.h)
This is the epoc32/include tree with the "platform" subtrees removed, and
all but a selected few mbg and rsg files removed.
williamr@4
     1
/*
williamr@4
     2
 *
williamr@4
     3
 *
williamr@4
     4
 * Copyright (c) 1994
williamr@4
     5
 * Hewlett-Packard Company
williamr@4
     6
 *
williamr@4
     7
 * Copyright (c) 1996,1997
williamr@4
     8
 * Silicon Graphics Computer Systems, Inc.
williamr@4
     9
 *
williamr@4
    10
 * Copyright (c) 1997
williamr@4
    11
 * Moscow Center for SPARC Technology
williamr@4
    12
 *
williamr@4
    13
 * Copyright (c) 1999
williamr@4
    14
 * Boris Fomitchev
williamr@4
    15
 *
williamr@4
    16
 * This material is provided "as is", with absolutely no warranty expressed
williamr@4
    17
 * or implied. Any use is at your own risk.
williamr@4
    18
 *
williamr@4
    19
 * Permission to use or copy this software for any purpose is hereby granted
williamr@4
    20
 * without fee, provided the above notices are retained on all copies.
williamr@4
    21
 * Permission to modify the code and to distribute modified code is granted,
williamr@4
    22
 * provided the above notices are retained, and a notice that the code was
williamr@4
    23
 * modified is included with the above copyright notice.
williamr@4
    24
 *
williamr@4
    25
 */
williamr@4
    26
#ifndef _STLP_DEQUE_C
williamr@4
    27
#define _STLP_DEQUE_C
williamr@4
    28
williamr@4
    29
#ifndef _STLP_INTERNAL_DEQUE_H
williamr@4
    30
#  include <stl/_deque.h>
williamr@4
    31
#endif
williamr@4
    32
williamr@4
    33
_STLP_BEGIN_NAMESPACE
williamr@4
    34
williamr@4
    35
_STLP_MOVE_TO_PRIV_NAMESPACE
williamr@4
    36
williamr@4
    37
// Non-inline member functions from _Deque_base.
williamr@4
    38
williamr@4
    39
template <class _Tp, class _Alloc >
williamr@4
    40
_Deque_base<_Tp,_Alloc >::~_Deque_base() {
williamr@4
    41
  if (_M_map._M_data) {
williamr@4
    42
    _M_destroy_nodes(_M_start._M_node, this->_M_finish._M_node + 1);
williamr@4
    43
    _M_map.deallocate(_M_map._M_data, _M_map_size._M_data);
williamr@4
    44
  }
williamr@4
    45
}
williamr@4
    46
williamr@4
    47
template <class _Tp, class _Alloc >
williamr@4
    48
void _Deque_base<_Tp,_Alloc>::_M_initialize_map(size_t __num_elements) {
williamr@4
    49
  size_t __num_nodes = __num_elements / this->buffer_size() + 1 ;
williamr@4
    50
williamr@4
    51
  _M_map_size._M_data = (max)((size_t) _S_initial_map_size, __num_nodes + 2);
williamr@4
    52
  _M_map._M_data = _M_map.allocate(_M_map_size._M_data);
williamr@4
    53
williamr@4
    54
  _Tp** __nstart = _M_map._M_data + (_M_map_size._M_data - __num_nodes) / 2;
williamr@4
    55
  _Tp** __nfinish = __nstart + __num_nodes;
williamr@4
    56
williamr@4
    57
  _STLP_TRY {
williamr@4
    58
    _M_create_nodes(__nstart, __nfinish);
williamr@4
    59
  }
williamr@4
    60
  _STLP_UNWIND((_M_map.deallocate(_M_map._M_data, _M_map_size._M_data),
williamr@4
    61
                _M_map._M_data = 0, _M_map_size._M_data = 0))
williamr@4
    62
  _M_start._M_set_node(__nstart);
williamr@4
    63
  this->_M_finish._M_set_node(__nfinish - 1);
williamr@4
    64
  _M_start._M_cur = _M_start._M_first;
williamr@4
    65
  this->_M_finish._M_cur = this->_M_finish._M_first + __num_elements % this->buffer_size();
williamr@4
    66
}
williamr@4
    67
williamr@4
    68
template <class _Tp, class _Alloc >
williamr@4
    69
void _Deque_base<_Tp,_Alloc>::_M_create_nodes(_Tp** __nstart,
williamr@4
    70
                                              _Tp** __nfinish) {
williamr@4
    71
  _Tp** __cur = __nstart;
williamr@4
    72
  _STLP_TRY {
williamr@4
    73
    for (; __cur < __nfinish; ++__cur)
williamr@4
    74
      *__cur = _M_map_size.allocate(this->buffer_size());
williamr@4
    75
  }
williamr@4
    76
  _STLP_UNWIND(_M_destroy_nodes(__nstart, __cur))
williamr@4
    77
}
williamr@4
    78
williamr@4
    79
template <class _Tp, class _Alloc >
williamr@4
    80
void _Deque_base<_Tp,_Alloc>::_M_destroy_nodes(_Tp** __nstart,
williamr@4
    81
                                               _Tp** __nfinish) {
williamr@4
    82
  for (_Tp** __n = __nstart; __n < __nfinish; ++__n)
williamr@4
    83
    _M_map_size.deallocate(*__n, this->buffer_size());
williamr@4
    84
}
williamr@4
    85
williamr@4
    86
#if defined (_STLP_USE_PTR_SPECIALIZATIONS)
williamr@4
    87
#  define deque _STLP_PTR_IMPL_NAME(deque)
williamr@4
    88
#elif defined (_STLP_DEBUG)
williamr@4
    89
#  define deque _STLP_NON_DBG_NAME(deque)
williamr@4
    90
#else
williamr@4
    91
_STLP_MOVE_TO_STD_NAMESPACE
williamr@4
    92
#endif
williamr@4
    93
williamr@4
    94
#if defined (_STLP_NESTED_TYPE_PARAM_BUG)
williamr@4
    95
// qualified references
williamr@4
    96
#  define __iterator__   _Deque_iterator<_Tp, _Nonconst_traits<_Tp> >
williamr@4
    97
#  define const_iterator _Deque_iterator<_Tp, _Const_traits<_Tp>  >
williamr@4
    98
#  define iterator       __iterator__
williamr@4
    99
#  define size_type      size_t
williamr@4
   100
#  define value_type     _Tp
williamr@4
   101
#else
williamr@4
   102
#  define __iterator__   _STLP_TYPENAME_ON_RETURN_TYPE deque<_Tp, _Alloc>::iterator
williamr@4
   103
#endif
williamr@4
   104
williamr@4
   105
template <class _Tp, class _Alloc >
williamr@4
   106
deque<_Tp, _Alloc >&
williamr@4
   107
deque<_Tp, _Alloc >::operator= (const deque<_Tp, _Alloc >& __x) {
williamr@4
   108
  const size_type __len = size();
williamr@4
   109
  if (&__x != this) {
williamr@4
   110
    if (__len >= __x.size())
williamr@4
   111
      erase(copy(__x.begin(), __x.end(), this->_M_start), this->_M_finish);
williamr@4
   112
    else {
williamr@4
   113
      const_iterator __mid = __x.begin() + difference_type(__len);
williamr@4
   114
      copy(__x.begin(), __mid, this->_M_start);
williamr@4
   115
      insert(this->_M_finish, __mid, __x.end());
williamr@4
   116
    }
williamr@4
   117
  }
williamr@4
   118
  return *this;
williamr@4
   119
}
williamr@4
   120
williamr@4
   121
template <class _Tp, class _Alloc >
williamr@4
   122
void deque<_Tp, _Alloc >::_M_fill_insert(iterator __pos,
williamr@4
   123
                                         size_type __n, const value_type& __x) {
williamr@4
   124
  if (__pos._M_cur == this->_M_start._M_cur) {
williamr@4
   125
    iterator __new_start = _M_reserve_elements_at_front(__n);
williamr@4
   126
    _STLP_TRY {
williamr@4
   127
      uninitialized_fill(__new_start, this->_M_start, __x);
williamr@4
   128
    }
williamr@4
   129
    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
williamr@4
   130
    this->_M_start = __new_start;
williamr@4
   131
  }
williamr@4
   132
  else if (__pos._M_cur == this->_M_finish._M_cur) {
williamr@4
   133
    iterator __new_finish = _M_reserve_elements_at_back(__n);
williamr@4
   134
    _STLP_TRY {
williamr@4
   135
      uninitialized_fill(this->_M_finish, __new_finish, __x);
williamr@4
   136
    }
williamr@4
   137
    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node+1, __new_finish._M_node+1))
williamr@4
   138
    this->_M_finish = __new_finish;
williamr@4
   139
  }
williamr@4
   140
  else
williamr@4
   141
    _M_fill_insert_aux(__pos, __n, __x, _Movable());
williamr@4
   142
}
williamr@4
   143
williamr@4
   144
#if !defined (_STLP_MEMBER_TEMPLATES)
williamr@4
   145
williamr@4
   146
template <class _Tp, class _Alloc >
williamr@4
   147
void deque<_Tp, _Alloc>::insert(iterator __pos,
williamr@4
   148
                                const value_type* __first, const value_type* __last) {
williamr@4
   149
  size_type __n = __last - __first;
williamr@4
   150
  if (__pos._M_cur == this->_M_start._M_cur) {
williamr@4
   151
    iterator __new_start = _M_reserve_elements_at_front(__n);
williamr@4
   152
    _STLP_TRY {
williamr@4
   153
      _STLP_PRIV __ucopy(__first, __last, __new_start);
williamr@4
   154
    }
williamr@4
   155
    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
williamr@4
   156
    this->_M_start = __new_start;
williamr@4
   157
  }
williamr@4
   158
  else if (__pos._M_cur == this->_M_finish._M_cur) {
williamr@4
   159
    iterator __new_finish = _M_reserve_elements_at_back(__n);
williamr@4
   160
    _STLP_TRY {
williamr@4
   161
      _STLP_PRIV __ucopy(__first, __last, this->_M_finish);
williamr@4
   162
    }
williamr@4
   163
    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1,
williamr@4
   164
                                        __new_finish._M_node + 1))
williamr@4
   165
    this->_M_finish = __new_finish;
williamr@4
   166
  }
williamr@4
   167
  else
williamr@4
   168
    _M_insert_range_aux(__pos, __first, __last, __n, _Movable());
williamr@4
   169
}
williamr@4
   170
williamr@4
   171
template <class _Tp, class _Alloc >
williamr@4
   172
void deque<_Tp,_Alloc>::insert(iterator __pos,
williamr@4
   173
                               const_iterator __first, const_iterator __last) {
williamr@4
   174
  size_type __n = __last - __first;
williamr@4
   175
  if (__pos._M_cur == this->_M_start._M_cur) {
williamr@4
   176
    iterator __new_start = _M_reserve_elements_at_front(__n);
williamr@4
   177
    _STLP_TRY {
williamr@4
   178
      _STLP_PRIV __ucopy(__first, __last, __new_start);
williamr@4
   179
    }
williamr@4
   180
    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
williamr@4
   181
    this->_M_start = __new_start;
williamr@4
   182
  }
williamr@4
   183
  else if (__pos._M_cur == this->_M_finish._M_cur) {
williamr@4
   184
    iterator __new_finish = _M_reserve_elements_at_back(__n);
williamr@4
   185
    _STLP_TRY {
williamr@4
   186
      _STLP_PRIV __ucopy(__first, __last, this->_M_finish);
williamr@4
   187
    }
williamr@4
   188
    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1,
williamr@4
   189
                                        __new_finish._M_node + 1))
williamr@4
   190
    this->_M_finish = __new_finish;
williamr@4
   191
  }
williamr@4
   192
  else
williamr@4
   193
    _M_insert_range_aux(__pos, __first, __last, __n, _Movable());
williamr@4
   194
}
williamr@4
   195
williamr@4
   196
#endif /* _STLP_MEMBER_TEMPLATES */
williamr@4
   197
williamr@4
   198
template <class _Tp, class _Alloc >
williamr@4
   199
__iterator__ deque<_Tp,_Alloc>::_M_erase(iterator __pos,
williamr@4
   200
                                         const __true_type& /*_Movable*/) {
williamr@4
   201
  difference_type __index = __pos - this->_M_start;
williamr@4
   202
  if (size_type(__index) < this->size() >> 1) {
williamr@4
   203
    //We move the start of the deque one position to the right
williamr@4
   204
    //starting from the rightmost element to move.
williamr@4
   205
    iterator __src = __pos, __dst = __pos;
williamr@4
   206
    _STLP_STD::_Destroy(&(*__dst));
williamr@4
   207
    if (__src != this->_M_start) {
williamr@4
   208
      for (--__src; __dst != this->_M_start; --__src, --__dst) {
williamr@4
   209
        _STLP_STD::_Move_Construct(&(*__dst), *__src);
williamr@4
   210
        _STLP_STD::_Destroy_Moved(&(*__src));
williamr@4
   211
      }
williamr@4
   212
    }
williamr@4
   213
    _M_pop_front_aux();
williamr@4
   214
  }
williamr@4
   215
  else {
williamr@4
   216
    iterator __src = __pos, __dst = __pos;
williamr@4
   217
    _STLP_STD::_Destroy(&(*__dst));
williamr@4
   218
    for (++__src; __src != this->_M_finish; ++__src, ++__dst) {
williamr@4
   219
      _STLP_STD::_Move_Construct(&(*__dst), *__src);
williamr@4
   220
      _STLP_STD::_Destroy_Moved(&(*__src));
williamr@4
   221
    }
williamr@4
   222
    //Duplication of the pop_back code without the destroy which has already been done:
williamr@4
   223
    if (this->_M_finish._M_cur != this->_M_finish._M_first) {
williamr@4
   224
      --this->_M_finish._M_cur;
williamr@4
   225
    }
williamr@4
   226
    else {
williamr@4
   227
      _M_pop_back_aux();
williamr@4
   228
    }
williamr@4
   229
  }
williamr@4
   230
  return this->_M_start + __index;
williamr@4
   231
}
williamr@4
   232
williamr@4
   233
template <class _Tp, class _Alloc >
williamr@4
   234
__iterator__ deque<_Tp,_Alloc>::_M_erase(iterator __pos,
williamr@4
   235
                                         const __false_type& /*_Movable*/) {
williamr@4
   236
  iterator __next = __pos;
williamr@4
   237
  ++__next;
williamr@4
   238
  difference_type __index = __pos - this->_M_start;
williamr@4
   239
  if (size_type(__index) < this->size() >> 1) {
williamr@4
   240
    copy_backward(this->_M_start, __pos, __next);
williamr@4
   241
    pop_front();
williamr@4
   242
  }
williamr@4
   243
  else {
williamr@4
   244
    copy(__next, this->_M_finish, __pos);
williamr@4
   245
    pop_back();
williamr@4
   246
  }
williamr@4
   247
  return this->_M_start + __index;
williamr@4
   248
}
williamr@4
   249
williamr@4
   250
template <class _Tp, class _Alloc >
williamr@4
   251
__iterator__ deque<_Tp,_Alloc>::_M_erase(iterator __first, iterator __last,
williamr@4
   252
                                         const __true_type& /*_Movable*/) {
williamr@4
   253
  difference_type __n = __last - __first;
williamr@4
   254
  difference_type __elems_before = __first - this->_M_start;
williamr@4
   255
  if (__elems_before <= difference_type(this->size() - __n) / 2) {
williamr@4
   256
    iterator __src = __first, __dst = __last;
williamr@4
   257
    if (__src != this->_M_start) {
williamr@4
   258
      for (--__src, --__dst; (__src >= this->_M_start) && (__dst >= __first); --__src, --__dst) {
williamr@4
   259
        _STLP_STD::_Destroy(&(*__dst));
williamr@4
   260
        _STLP_STD::_Move_Construct(&(*__dst), *__src);
williamr@4
   261
      }
williamr@4
   262
      if (__dst >= __first) {
williamr@4
   263
        //There are more elements to erase than elements to move
williamr@4
   264
        _STLP_STD::_Destroy_Range(__first, ++__dst);
williamr@4
   265
        _STLP_STD::_Destroy_Moved_Range(this->_M_start, __first);
williamr@4
   266
      }
williamr@4
   267
      else {
williamr@4
   268
        //There are more elements to move than elements to erase
williamr@4
   269
        for (; __src >= this->_M_start; --__src, --__dst) {
williamr@4
   270
          _STLP_STD::_Destroy_Moved(&(*__dst));
williamr@4
   271
          _STLP_STD::_Move_Construct(&(*__dst), *__src);
williamr@4
   272
        }
williamr@4
   273
        _STLP_STD::_Destroy_Moved_Range(this->_M_start, ++__dst);
williamr@4
   274
      }
williamr@4
   275
    }
williamr@4
   276
    else {
williamr@4
   277
      _STLP_STD::_Destroy_Range(this->_M_start, __last);
williamr@4
   278
    }
williamr@4
   279
    iterator __new_start = this->_M_start + __n;
williamr@4
   280
    this->_M_destroy_nodes(this->_M_start._M_node, __new_start._M_node);
williamr@4
   281
    this->_M_start = __new_start;
williamr@4
   282
  }
williamr@4
   283
  else {
williamr@4
   284
    if (__last != this->_M_finish) {
williamr@4
   285
      iterator __src = __last, __dst = __first;
williamr@4
   286
      for (; (__src != this->_M_finish) && (__dst != __last); ++__src, ++__dst) {
williamr@4
   287
        _STLP_STD::_Destroy(&(*__dst));
williamr@4
   288
        _STLP_STD::_Move_Construct(&(*__dst), *__src);
williamr@4
   289
      }
williamr@4
   290
      if (__dst != __last) {
williamr@4
   291
        //There are more elements to erase than elements to move
williamr@4
   292
        _STLP_STD::_Destroy_Range(__dst, __last);
williamr@4
   293
        _STLP_STD::_Destroy_Moved_Range(__last, this->_M_finish);
williamr@4
   294
      }
williamr@4
   295
      else {
williamr@4
   296
        //There are more elements to move than elements to erase
williamr@4
   297
        for (; __src != this->_M_finish; ++__src, ++__dst) {
williamr@4
   298
          _STLP_STD::_Destroy_Moved(&(*__dst));
williamr@4
   299
          _STLP_STD::_Move_Construct(&(*__dst), *__src);
williamr@4
   300
        }
williamr@4
   301
        _STLP_STD::_Destroy_Moved_Range(__dst, this->_M_finish);
williamr@4
   302
      }
williamr@4
   303
    }
williamr@4
   304
    else {
williamr@4
   305
      _STLP_STD::_Destroy_Range(__first, this->_M_finish);
williamr@4
   306
    }
williamr@4
   307
    iterator __new_finish = this->_M_finish - __n;
williamr@4
   308
    this->_M_destroy_nodes(__new_finish._M_node + 1, this->_M_finish._M_node + 1);
williamr@4
   309
    this->_M_finish = __new_finish;
williamr@4
   310
  }
williamr@4
   311
  return this->_M_start + __elems_before;
williamr@4
   312
}
williamr@4
   313
williamr@4
   314
template <class _Tp, class _Alloc >
williamr@4
   315
__iterator__ deque<_Tp,_Alloc>::_M_erase(iterator __first, iterator __last,
williamr@4
   316
                                         const __false_type& /*_Movable*/) {
williamr@4
   317
  difference_type __n = __last - __first;
williamr@4
   318
  difference_type __elems_before = __first - this->_M_start;
williamr@4
   319
  if (__elems_before <= difference_type(this->size() - __n) / 2) {
williamr@4
   320
    copy_backward(this->_M_start, __first, __last);
williamr@4
   321
    iterator __new_start = this->_M_start + __n;
williamr@4
   322
    _STLP_STD::_Destroy_Range(this->_M_start, __new_start);
williamr@4
   323
    this->_M_destroy_nodes(this->_M_start._M_node, __new_start._M_node);
williamr@4
   324
    this->_M_start = __new_start;
williamr@4
   325
  }
williamr@4
   326
  else {
williamr@4
   327
    copy(__last, this->_M_finish, __first);
williamr@4
   328
    iterator __new_finish = this->_M_finish - __n;
williamr@4
   329
    _STLP_STD::_Destroy_Range(__new_finish, this->_M_finish);
williamr@4
   330
    this->_M_destroy_nodes(__new_finish._M_node + 1, this->_M_finish._M_node + 1);
williamr@4
   331
    this->_M_finish = __new_finish;
williamr@4
   332
  }
williamr@4
   333
  return this->_M_start + __elems_before;
williamr@4
   334
}
williamr@4
   335
williamr@4
   336
template <class _Tp, class _Alloc >
williamr@4
   337
void deque<_Tp,_Alloc>::clear() {
williamr@4
   338
  for (_Map_pointer __node = this->_M_start._M_node + 1;
williamr@4
   339
       __node < this->_M_finish._M_node;
williamr@4
   340
       ++__node) {
williamr@4
   341
    _STLP_STD::_Destroy_Range(*__node, *__node + this->buffer_size());
williamr@4
   342
    this->_M_map_size.deallocate(*__node, this->buffer_size());
williamr@4
   343
  }
williamr@4
   344
williamr@4
   345
  if (this->_M_start._M_node != this->_M_finish._M_node) {
williamr@4
   346
    _STLP_STD::_Destroy_Range(this->_M_start._M_cur, this->_M_start._M_last);
williamr@4
   347
    _STLP_STD::_Destroy_Range(this->_M_finish._M_first, this->_M_finish._M_cur);
williamr@4
   348
    this->_M_map_size.deallocate(this->_M_finish._M_first, this->buffer_size());
williamr@4
   349
  }
williamr@4
   350
  else
williamr@4
   351
    _STLP_STD::_Destroy_Range(this->_M_start._M_cur, this->_M_finish._M_cur);
williamr@4
   352
williamr@4
   353
  this->_M_finish = this->_M_start;
williamr@4
   354
}
williamr@4
   355
williamr@4
   356
// Precondition: this->_M_start and this->_M_finish have already been initialized,
williamr@4
   357
// but none of the deque's elements have yet been constructed.
williamr@4
   358
template <class _Tp, class _Alloc >
williamr@4
   359
void deque<_Tp,_Alloc>::_M_fill_initialize(const value_type& __val,
williamr@4
   360
                                           const __false_type& /*_TrivialInit*/) {
williamr@4
   361
  _Map_pointer __cur = this->_M_start._M_node;
williamr@4
   362
  _STLP_TRY {
williamr@4
   363
    for (; __cur < this->_M_finish._M_node; ++__cur)
williamr@4
   364
      uninitialized_fill(*__cur, *__cur + this->buffer_size(), __val);
williamr@4
   365
    uninitialized_fill(this->_M_finish._M_first, this->_M_finish._M_cur, __val);
williamr@4
   366
  }
williamr@4
   367
  _STLP_UNWIND(_STLP_STD::_Destroy_Range(this->_M_start, iterator(*__cur, __cur)))
williamr@4
   368
}
williamr@4
   369
williamr@4
   370
williamr@4
   371
// Called only if this->_M_finish._M_cur == this->_M_finish._M_last - 1.
williamr@4
   372
template <class _Tp, class _Alloc >
williamr@4
   373
void deque<_Tp,_Alloc>::_M_push_back_aux_v(const value_type& __t) {
williamr@4
   374
  _M_reserve_map_at_back();
williamr@4
   375
  *(this->_M_finish._M_node + 1) = this->_M_map_size.allocate(this->buffer_size());
williamr@4
   376
  _STLP_TRY {
williamr@4
   377
    _Copy_Construct(this->_M_finish._M_cur, __t);
williamr@4
   378
    this->_M_finish._M_set_node(this->_M_finish._M_node + 1);
williamr@4
   379
    this->_M_finish._M_cur = this->_M_finish._M_first;
williamr@4
   380
  }
williamr@4
   381
  _STLP_UNWIND(this->_M_map_size.deallocate(*(this->_M_finish._M_node + 1),
williamr@4
   382
                                            this->buffer_size()))
williamr@4
   383
}
williamr@4
   384
williamr@4
   385
#if defined(_STLP_DONT_SUP_DFLT_PARAM) && !defined(_STLP_NO_ANACHRONISMS)
williamr@4
   386
// Called only if this->_M_finish._M_cur == this->_M_finish._M_last - 1.
williamr@4
   387
template <class _Tp, class _Alloc >
williamr@4
   388
void deque<_Tp,_Alloc>::_M_push_back_aux() {
williamr@4
   389
  _M_reserve_map_at_back();
williamr@4
   390
  *(this->_M_finish._M_node + 1) = this->_M_map_size.allocate(this->buffer_size());
williamr@4
   391
  _STLP_TRY {
williamr@4
   392
    _STLP_STD::_Construct(this->_M_finish._M_cur);
williamr@4
   393
    this->_M_finish._M_set_node(this->_M_finish._M_node + 1);
williamr@4
   394
    this->_M_finish._M_cur = this->_M_finish._M_first;
williamr@4
   395
  }
williamr@4
   396
  _STLP_UNWIND(this->_M_map_size.deallocate(*(this->_M_finish._M_node + 1),
williamr@4
   397
                                            this->buffer_size()))
williamr@4
   398
}
williamr@4
   399
#endif /*_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/
williamr@4
   400
williamr@4
   401
// Called only if this->_M_start._M_cur == this->_M_start._M_first.
williamr@4
   402
template <class _Tp, class _Alloc >
williamr@4
   403
void deque<_Tp,_Alloc>::_M_push_front_aux_v(const value_type& __t) {
williamr@4
   404
  _M_reserve_map_at_front();
williamr@4
   405
  *(this->_M_start._M_node - 1) = this->_M_map_size.allocate(this->buffer_size());
williamr@4
   406
  _STLP_TRY {
williamr@4
   407
    this->_M_start._M_set_node(this->_M_start._M_node - 1);
williamr@4
   408
    this->_M_start._M_cur = this->_M_start._M_last - 1;
williamr@4
   409
    _Copy_Construct(this->_M_start._M_cur, __t);
williamr@4
   410
  }
williamr@4
   411
  _STLP_UNWIND((++this->_M_start,
williamr@4
   412
                this->_M_map_size.deallocate(*(this->_M_start._M_node - 1), this->buffer_size())))
williamr@4
   413
}
williamr@4
   414
williamr@4
   415
williamr@4
   416
#if defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
williamr@4
   417
// Called only if this->_M_start._M_cur == this->_M_start._M_first.
williamr@4
   418
template <class _Tp, class _Alloc >
williamr@4
   419
void deque<_Tp,_Alloc>::_M_push_front_aux() {
williamr@4
   420
  _M_reserve_map_at_front();
williamr@4
   421
  *(this->_M_start._M_node - 1) = this->_M_map_size.allocate(this->buffer_size());
williamr@4
   422
  _STLP_TRY {
williamr@4
   423
    this->_M_start._M_set_node(this->_M_start._M_node - 1);
williamr@4
   424
    this->_M_start._M_cur = this->_M_start._M_last - 1;
williamr@4
   425
    _STLP_STD::_Construct(this->_M_start._M_cur);
williamr@4
   426
  }
williamr@4
   427
  _STLP_UNWIND((++this->_M_start, this->_M_map_size.deallocate(*(this->_M_start._M_node - 1),
williamr@4
   428
                                                               this->buffer_size())))
williamr@4
   429
}
williamr@4
   430
#endif /*_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/
williamr@4
   431
williamr@4
   432
// Called only if this->_M_finish._M_cur == this->_M_finish._M_first.
williamr@4
   433
template <class _Tp, class _Alloc >
williamr@4
   434
void deque<_Tp,_Alloc>::_M_pop_back_aux() {
williamr@4
   435
  this->_M_map_size.deallocate(this->_M_finish._M_first, this->buffer_size());
williamr@4
   436
  this->_M_finish._M_set_node(this->_M_finish._M_node - 1);
williamr@4
   437
  this->_M_finish._M_cur = this->_M_finish._M_last - 1;
williamr@4
   438
}
williamr@4
   439
williamr@4
   440
// Note that if the deque has at least one element (a precondition for this member
williamr@4
   441
// function), and if this->_M_start._M_cur == this->_M_start._M_last, then the deque
williamr@4
   442
// must have at least two nodes.
williamr@4
   443
template <class _Tp, class _Alloc >
williamr@4
   444
void deque<_Tp,_Alloc>::_M_pop_front_aux() {
williamr@4
   445
  if (this->_M_start._M_cur != this->_M_start._M_last - 1)
williamr@4
   446
    ++this->_M_start._M_cur;
williamr@4
   447
  else {
williamr@4
   448
    this->_M_map_size.deallocate(this->_M_start._M_first, this->buffer_size());
williamr@4
   449
    this->_M_start._M_set_node(this->_M_start._M_node + 1);
williamr@4
   450
    this->_M_start._M_cur = this->_M_start._M_first;
williamr@4
   451
  }
williamr@4
   452
}
williamr@4
   453
williamr@4
   454
template <class _Tp, class _Alloc >
williamr@4
   455
__iterator__ deque<_Tp,_Alloc>::_M_fill_insert_aux(iterator __pos, size_type __n,
williamr@4
   456
                                                   const value_type& __t,
williamr@4
   457
                                                   const __true_type& /*_Movable*/) {
williamr@4
   458
  const difference_type __elems_before = __pos - this->_M_start;
williamr@4
   459
  size_type __length = this->size();
williamr@4
   460
  value_type __x_copy = __t;
williamr@4
   461
  if (__elems_before <= difference_type(__length / 2)) {
williamr@4
   462
    iterator __new_start = _M_reserve_elements_at_front(__n);
williamr@4
   463
    __pos = this->_M_start + __elems_before;
williamr@4
   464
    _STLP_TRY {
williamr@4
   465
      iterator __dst = __new_start;
williamr@4
   466
      iterator __src = this->_M_start;
williamr@4
   467
      for (; __src != __pos; ++__dst, ++__src) {
williamr@4
   468
        _STLP_STD::_Move_Construct(&(*__dst), *__src);
williamr@4
   469
        _STLP_STD::_Destroy_Moved(&(*__src));
williamr@4
   470
      }
williamr@4
   471
      this->_M_start = __new_start;
williamr@4
   472
      uninitialized_fill(__dst, __src, __x_copy);
williamr@4
   473
      __pos = __dst;
williamr@4
   474
    }
williamr@4
   475
    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
williamr@4
   476
  }
williamr@4
   477
  else {
williamr@4
   478
    iterator __new_finish = _M_reserve_elements_at_back(__n);
williamr@4
   479
    const difference_type __elems_after = difference_type(__length) - __elems_before;
williamr@4
   480
    __pos = this->_M_finish - __elems_after;
williamr@4
   481
    _STLP_TRY {
williamr@4
   482
      iterator __dst = __new_finish;
williamr@4
   483
      iterator __src = this->_M_finish;
williamr@4
   484
      for (--__src, --__dst; __src >= __pos; --__src, --__dst) {
williamr@4
   485
        _STLP_STD::_Move_Construct(&(*__dst), *__src);
williamr@4
   486
        _STLP_STD::_Destroy_Moved(&(*__src));
williamr@4
   487
      }
williamr@4
   488
      this->_M_finish = __new_finish;
williamr@4
   489
      uninitialized_fill(__pos, __pos + __n, __x_copy);
williamr@4
   490
    }
williamr@4
   491
    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1))
williamr@4
   492
  }
williamr@4
   493
  return __pos;
williamr@4
   494
}
williamr@4
   495
williamr@4
   496
template <class _Tp, class _Alloc >
williamr@4
   497
__iterator__ deque<_Tp,_Alloc>::_M_fill_insert_aux(iterator __pos, size_type __n,
williamr@4
   498
                                                   const value_type& __t,
williamr@4
   499
                                                   const __false_type& /*_Movable*/) {
williamr@4
   500
  const difference_type __elems_before = __pos - this->_M_start;
williamr@4
   501
  size_type __length = this->size();
williamr@4
   502
  value_type __x_copy = __t;
williamr@4
   503
  if (__elems_before <= difference_type(__length / 2)) {
williamr@4
   504
    iterator __new_start = _M_reserve_elements_at_front(__n);
williamr@4
   505
    iterator __old_start = this->_M_start;
williamr@4
   506
    __pos = this->_M_start + __elems_before;
williamr@4
   507
    _STLP_TRY {
williamr@4
   508
      if (__elems_before >= difference_type(__n)) {
williamr@4
   509
        iterator __start_n = this->_M_start + difference_type(__n);
williamr@4
   510
        _STLP_PRIV __ucopy(this->_M_start, __start_n, __new_start);
williamr@4
   511
        this->_M_start = __new_start;
williamr@4
   512
        copy(__start_n, __pos, __old_start);
williamr@4
   513
        fill(__pos - difference_type(__n), __pos, __x_copy);
williamr@4
   514
      }
williamr@4
   515
      else {
williamr@4
   516
        _STLP_PRIV __uninitialized_copy_fill(this->_M_start, __pos, __new_start,
williamr@4
   517
                                             this->_M_start, __x_copy);
williamr@4
   518
        this->_M_start = __new_start;
williamr@4
   519
        fill(__old_start, __pos, __x_copy);
williamr@4
   520
      }
williamr@4
   521
    }
williamr@4
   522
    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
williamr@4
   523
  }
williamr@4
   524
  else {
williamr@4
   525
    iterator __new_finish = _M_reserve_elements_at_back(__n);
williamr@4
   526
    iterator __old_finish = this->_M_finish;
williamr@4
   527
    const difference_type __elems_after =
williamr@4
   528
      difference_type(__length) - __elems_before;
williamr@4
   529
    __pos = this->_M_finish - __elems_after;
williamr@4
   530
    _STLP_TRY {
williamr@4
   531
      if (__elems_after > difference_type(__n)) {
williamr@4
   532
        iterator __finish_n = this->_M_finish - difference_type(__n);
williamr@4
   533
        _STLP_PRIV __ucopy(__finish_n, this->_M_finish, this->_M_finish);
williamr@4
   534
        this->_M_finish = __new_finish;
williamr@4
   535
        copy_backward(__pos, __finish_n, __old_finish);
williamr@4
   536
        fill(__pos, __pos + difference_type(__n), __x_copy);
williamr@4
   537
      }
williamr@4
   538
      else {
williamr@4
   539
        _STLP_PRIV __uninitialized_fill_copy(this->_M_finish, __pos + difference_type(__n),
williamr@4
   540
                                             __x_copy, __pos, this->_M_finish);
williamr@4
   541
        this->_M_finish = __new_finish;
williamr@4
   542
        fill(__pos, __old_finish, __x_copy);
williamr@4
   543
      }
williamr@4
   544
    }
williamr@4
   545
    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1))
williamr@4
   546
  }
williamr@4
   547
  return __pos;
williamr@4
   548
}
williamr@4
   549
williamr@4
   550
#if !defined (_STLP_MEMBER_TEMPLATES)
williamr@4
   551
template <class _Tp, class _Alloc >
williamr@4
   552
void deque<_Tp,_Alloc>::_M_insert_range_aux(iterator __pos,
williamr@4
   553
                                            const value_type* __first, const value_type* __last,
williamr@4
   554
                                            size_type __n, const __true_type& /*_Movable*/) {
williamr@4
   555
  const difference_type __elems_before = __pos - this->_M_start;
williamr@4
   556
  size_type __length = size();
williamr@4
   557
  if (__elems_before <= difference_type(__length / 2)) {
williamr@4
   558
    iterator __new_start = _M_reserve_elements_at_front(__n);
williamr@4
   559
    __pos = this->_M_start + __elems_before;
williamr@4
   560
    _STLP_TRY {
williamr@4
   561
      iterator __dst = __new_start;
williamr@4
   562
      iterator __src = this->_M_start;
williamr@4
   563
      for (; __src != __pos; ++__dst, ++__src) {
williamr@4
   564
        _STLP_STD::_Move_Construct(&(*__dst), *__src);
williamr@4
   565
        _STLP_STD::_Destroy_Moved(&(*__src));
williamr@4
   566
      }
williamr@4
   567
      this->_M_start = __new_start;
williamr@4
   568
      _STLP_PRIV __ucopy(__first, __last, __dst);
williamr@4
   569
    }
williamr@4
   570
    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
williamr@4
   571
  }
williamr@4
   572
  else {
williamr@4
   573
    iterator __new_finish = _M_reserve_elements_at_back(__n);
williamr@4
   574
    const difference_type __elems_after = difference_type(__length) - __elems_before;
williamr@4
   575
    __pos = this->_M_finish - __elems_after;
williamr@4
   576
    _STLP_TRY {
williamr@4
   577
      iterator __dst = __new_finish;
williamr@4
   578
      iterator __src = this->_M_finish;
williamr@4
   579
      for (--__src, --__dst; __src >= __pos; --__src, --__dst) {
williamr@4
   580
        _STLP_STD::_Move_Construct(&(*__dst), *__src);
williamr@4
   581
        _STLP_STD::_Destroy_Moved(&(*__src));
williamr@4
   582
      }
williamr@4
   583
      this->_M_finish = __new_finish;
williamr@4
   584
      _STLP_PRIV __ucopy(__first, __last, __pos);
williamr@4
   585
    }
williamr@4
   586
    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1))
williamr@4
   587
  }
williamr@4
   588
}
williamr@4
   589
williamr@4
   590
template <class _Tp, class _Alloc >
williamr@4
   591
void deque<_Tp,_Alloc>::_M_insert_range_aux(iterator __pos,
williamr@4
   592
                                            const value_type* __first, const value_type* __last,
williamr@4
   593
                                            size_type __n, const __false_type& /*_Movable*/) {
williamr@4
   594
  const difference_type __elems_before = __pos - this->_M_start;
williamr@4
   595
  size_type __length = size();
williamr@4
   596
  if (__elems_before <= difference_type(__length / 2)) {
williamr@4
   597
    iterator __new_start = _M_reserve_elements_at_front(__n);
williamr@4
   598
    iterator __old_start = this->_M_start;
williamr@4
   599
    __pos = this->_M_start + __elems_before;
williamr@4
   600
    _STLP_TRY {
williamr@4
   601
      if (__elems_before >= difference_type(__n)) {
williamr@4
   602
        iterator __start_n = this->_M_start + difference_type(__n);
williamr@4
   603
        _STLP_PRIV __ucopy(this->_M_start, __start_n, __new_start);
williamr@4
   604
        this->_M_start = __new_start;
williamr@4
   605
        copy(__start_n, __pos, __old_start);
williamr@4
   606
        copy(__first, __last, __pos - difference_type(__n));
williamr@4
   607
      }
williamr@4
   608
      else {
williamr@4
   609
        const value_type* __mid = __first + (difference_type(__n) - __elems_before);
williamr@4
   610
        __uninitialized_copy_copy(this->_M_start, __pos, __first, __mid, __new_start);
williamr@4
   611
        this->_M_start = __new_start;
williamr@4
   612
        copy(__mid, __last, __old_start);
williamr@4
   613
      }
williamr@4
   614
    }
williamr@4
   615
    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
williamr@4
   616
  }
williamr@4
   617
  else {
williamr@4
   618
    iterator __new_finish = _M_reserve_elements_at_back(__n);
williamr@4
   619
    iterator __old_finish = this->_M_finish;
williamr@4
   620
    const difference_type __elems_after =
williamr@4
   621
      difference_type(__length) - __elems_before;
williamr@4
   622
    __pos = this->_M_finish - __elems_after;
williamr@4
   623
    _STLP_TRY {
williamr@4
   624
williamr@4
   625
      if (__elems_after > difference_type(__n)) {
williamr@4
   626
        iterator __finish_n = this->_M_finish - difference_type(__n);
williamr@4
   627
        _STLP_PRIV __ucopy(__finish_n, this->_M_finish, this->_M_finish);
williamr@4
   628
        this->_M_finish = __new_finish;
williamr@4
   629
        copy_backward(__pos, __finish_n, __old_finish);
williamr@4
   630
        copy(__first, __last, __pos);
williamr@4
   631
      }
williamr@4
   632
      else {
williamr@4
   633
        const value_type* __mid = __first + __elems_after;
williamr@4
   634
        __uninitialized_copy_copy(__mid, __last, __pos, this->_M_finish, this->_M_finish);
williamr@4
   635
        this->_M_finish = __new_finish;
williamr@4
   636
        copy(__first, __mid, __pos);
williamr@4
   637
      }
williamr@4
   638
    }
williamr@4
   639
    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1))
williamr@4
   640
  }
williamr@4
   641
}
williamr@4
   642
williamr@4
   643
template <class _Tp, class _Alloc >
williamr@4
   644
void deque<_Tp,_Alloc>::_M_insert_range_aux(iterator __pos,
williamr@4
   645
                                            const_iterator __first, const_iterator __last,
williamr@4
   646
                                            size_type __n, const __true_type& /*_Movable*/) {
williamr@4
   647
  const difference_type __elems_before = __pos - this->_M_start;
williamr@4
   648
  size_type __length = size();
williamr@4
   649
  if (__elems_before <= difference_type(__length / 2)) {
williamr@4
   650
    iterator __new_start = _M_reserve_elements_at_front(__n);
williamr@4
   651
    __pos = this->_M_start + __elems_before;
williamr@4
   652
    _STLP_TRY {
williamr@4
   653
      iterator __dst = __new_start;
williamr@4
   654
      iterator __src = this->_M_start;
williamr@4
   655
      for (; __src != __pos; ++__dst, ++__src) {
williamr@4
   656
        _STLP_STD::_Move_Construct(&(*__dst), *__src);
williamr@4
   657
        _STLP_STD::_Destroy_Moved(&(*__src));
williamr@4
   658
      }
williamr@4
   659
      this->_M_start = __new_start;
williamr@4
   660
      _STLP_PRIV __ucopy(__first, __last, __dst);
williamr@4
   661
    }
williamr@4
   662
    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
williamr@4
   663
  }
williamr@4
   664
  else {
williamr@4
   665
    iterator __new_finish = _M_reserve_elements_at_back(__n);
williamr@4
   666
    const difference_type __elems_after = difference_type(__length) - __elems_before;
williamr@4
   667
    __pos = this->_M_finish - __elems_after;
williamr@4
   668
    _STLP_TRY {
williamr@4
   669
      iterator __dst = __new_finish;
williamr@4
   670
      iterator __src = this->_M_finish;
williamr@4
   671
      for (--__src, --__dst; __src >= __pos; --__src, --__dst) {
williamr@4
   672
        _STLP_STD::_Move_Construct(&(*__dst), *__src);
williamr@4
   673
        _STLP_STD::_Destroy_Moved(&(*__src));
williamr@4
   674
      }
williamr@4
   675
      this->_M_finish = __new_finish;
williamr@4
   676
      _STLP_PRIV __ucopy(__first, __last, __pos);
williamr@4
   677
    }
williamr@4
   678
    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1))
williamr@4
   679
  }
williamr@4
   680
}
williamr@4
   681
williamr@4
   682
template <class _Tp, class _Alloc >
williamr@4
   683
void deque<_Tp,_Alloc>::_M_insert_range_aux(iterator __pos,
williamr@4
   684
                                            const_iterator __first, const_iterator __last,
williamr@4
   685
                                            size_type __n, const __false_type& /*_Movable*/) {
williamr@4
   686
  const difference_type __elems_before = __pos - this->_M_start;
williamr@4
   687
  size_type __length = size();
williamr@4
   688
  if (__elems_before < difference_type(__length / 2)) {
williamr@4
   689
    iterator __new_start = _M_reserve_elements_at_front(__n);
williamr@4
   690
    iterator __old_start = this->_M_start;
williamr@4
   691
    __pos = this->_M_start + __elems_before;
williamr@4
   692
    _STLP_TRY {
williamr@4
   693
      if (__elems_before >= difference_type(__n)) {
williamr@4
   694
        iterator __start_n = this->_M_start + __n;
williamr@4
   695
        _STLP_PRIV __ucopy(this->_M_start, __start_n, __new_start);
williamr@4
   696
        this->_M_start = __new_start;
williamr@4
   697
        copy(__start_n, __pos, __old_start);
williamr@4
   698
        copy(__first, __last, __pos - difference_type(__n));
williamr@4
   699
      }
williamr@4
   700
      else {
williamr@4
   701
        const_iterator __mid = __first + (__n - __elems_before);
williamr@4
   702
        __uninitialized_copy_copy(this->_M_start, __pos, __first, __mid, __new_start);
williamr@4
   703
        this->_M_start = __new_start;
williamr@4
   704
        copy(__mid, __last, __old_start);
williamr@4
   705
      }
williamr@4
   706
    }
williamr@4
   707
    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
williamr@4
   708
  }
williamr@4
   709
  else {
williamr@4
   710
    iterator __new_finish = _M_reserve_elements_at_back(__n);
williamr@4
   711
    iterator __old_finish = this->_M_finish;
williamr@4
   712
    const difference_type __elems_after = __length - __elems_before;
williamr@4
   713
    __pos = this->_M_finish - __elems_after;
williamr@4
   714
    _STLP_TRY {
williamr@4
   715
      if (__elems_after > difference_type(__n)) {
williamr@4
   716
        iterator __finish_n = this->_M_finish - difference_type(__n);
williamr@4
   717
        _STLP_PRIV __ucopy(__finish_n, this->_M_finish, this->_M_finish);
williamr@4
   718
        this->_M_finish = __new_finish;
williamr@4
   719
        copy_backward(__pos, __finish_n, __old_finish);
williamr@4
   720
        copy(__first, __last, __pos);
williamr@4
   721
      }
williamr@4
   722
      else {
williamr@4
   723
        const_iterator __mid = __first + __elems_after;
williamr@4
   724
        __uninitialized_copy_copy(__mid, __last, __pos, this->_M_finish, this->_M_finish);
williamr@4
   725
        this->_M_finish = __new_finish;
williamr@4
   726
        copy(__first, __mid, __pos);
williamr@4
   727
      }
williamr@4
   728
    }
williamr@4
   729
    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1))
williamr@4
   730
  }
williamr@4
   731
}
williamr@4
   732
#endif /* _STLP_MEMBER_TEMPLATES */
williamr@4
   733
williamr@4
   734
template <class _Tp, class _Alloc >
williamr@4
   735
void deque<_Tp,_Alloc>::_M_new_elements_at_front(size_type __new_elems) {
williamr@4
   736
  size_type __new_nodes
williamr@4
   737
      = (__new_elems + this->buffer_size() - 1) / this->buffer_size();
williamr@4
   738
  _M_reserve_map_at_front(__new_nodes);
williamr@4
   739
  size_type __i = 1;
williamr@4
   740
  _STLP_TRY {
williamr@4
   741
    for (; __i <= __new_nodes; ++__i)
williamr@4
   742
      *(this->_M_start._M_node - __i) = this->_M_map_size.allocate(this->buffer_size());
williamr@4
   743
  }
williamr@4
   744
  _STLP_UNWIND(for (size_type __j = 1; __j < __i; ++__j)
williamr@4
   745
                 this->_M_map_size.deallocate(*(this->_M_start._M_node - __j), this->buffer_size()))
williamr@4
   746
}
williamr@4
   747
williamr@4
   748
template <class _Tp, class _Alloc >
williamr@4
   749
void deque<_Tp,_Alloc>::_M_new_elements_at_back(size_type __new_elems) {
williamr@4
   750
  size_type __new_nodes
williamr@4
   751
      = (__new_elems + this->buffer_size() - 1) / this->buffer_size();
williamr@4
   752
  _M_reserve_map_at_back(__new_nodes);
williamr@4
   753
  size_type __i = 1;
williamr@4
   754
  _STLP_TRY {
williamr@4
   755
    for (; __i <= __new_nodes; ++__i)
williamr@4
   756
      *(this->_M_finish._M_node + __i) = this->_M_map_size.allocate(this->buffer_size());
williamr@4
   757
  }
williamr@4
   758
  _STLP_UNWIND(for (size_type __j = 1; __j < __i; ++__j)
williamr@4
   759
                 this->_M_map_size.deallocate(*(this->_M_finish._M_node + __j), this->buffer_size()))
williamr@4
   760
}
williamr@4
   761
williamr@4
   762
template <class _Tp, class _Alloc >
williamr@4
   763
void deque<_Tp,_Alloc>::_M_reallocate_map(size_type __nodes_to_add,
williamr@4
   764
                                          bool __add_at_front) {
williamr@4
   765
  size_type __old_num_nodes = this->_M_finish._M_node - this->_M_start._M_node + 1;
williamr@4
   766
  size_type __new_num_nodes = __old_num_nodes + __nodes_to_add;
williamr@4
   767
williamr@4
   768
  _Map_pointer __new_nstart;
williamr@4
   769
  if (this->_M_map_size._M_data > 2 * __new_num_nodes) {
williamr@4
   770
    __new_nstart = this->_M_map._M_data + (this->_M_map_size._M_data - __new_num_nodes) / 2
williamr@4
   771
                     + (__add_at_front ? __nodes_to_add : 0);
williamr@4
   772
    if (__new_nstart < this->_M_start._M_node)
williamr@4
   773
      copy(this->_M_start._M_node, this->_M_finish._M_node + 1, __new_nstart);
williamr@4
   774
    else
williamr@4
   775
      copy_backward(this->_M_start._M_node, this->_M_finish._M_node + 1,
williamr@4
   776
                    __new_nstart + __old_num_nodes);
williamr@4
   777
  }
williamr@4
   778
  else {
williamr@4
   779
    size_type __new_map_size =
williamr@4
   780
      this->_M_map_size._M_data + (max)((size_t)this->_M_map_size._M_data, __nodes_to_add) + 2;
williamr@4
   781
williamr@4
   782
    _Map_pointer __new_map = this->_M_map.allocate(__new_map_size);
williamr@4
   783
    __new_nstart = __new_map + (__new_map_size - __new_num_nodes) / 2
williamr@4
   784
                         + (__add_at_front ? __nodes_to_add : 0);
williamr@4
   785
    copy(this->_M_start._M_node, this->_M_finish._M_node + 1, __new_nstart);
williamr@4
   786
    this->_M_map.deallocate(this->_M_map._M_data, this->_M_map_size._M_data);
williamr@4
   787
williamr@4
   788
    this->_M_map._M_data = __new_map;
williamr@4
   789
    this->_M_map_size._M_data = __new_map_size;
williamr@4
   790
  }
williamr@4
   791
williamr@4
   792
  this->_M_start._M_set_node(__new_nstart);
williamr@4
   793
  this->_M_finish._M_set_node(__new_nstart + __old_num_nodes - 1);
williamr@4
   794
}
williamr@4
   795
williamr@4
   796
#if defined (deque)
williamr@4
   797
#  undef deque
williamr@4
   798
_STLP_MOVE_TO_STD_NAMESPACE
williamr@4
   799
#endif
williamr@4
   800
williamr@4
   801
_STLP_END_NAMESPACE
williamr@4
   802
williamr@4
   803
#undef __iterator__
williamr@4
   804
#undef iterator
williamr@4
   805
#undef const_iterator
williamr@4
   806
#undef size_type
williamr@4
   807
#undef value_type
williamr@4
   808
williamr@4
   809
#endif /*  _STLP_DEQUE_C */
williamr@4
   810
williamr@4
   811
// Local Variables:
williamr@4
   812
// mode:C++
williamr@4
   813
// End: