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