epoc32/include/stdapis/stlport/stl/_vector.h
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
parent 0 061f57f2323e
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@2
     1
/*
williamr@2
     2
 *
williamr@2
     3
 * Copyright (c) 1994
williamr@2
     4
 * Hewlett-Packard Company
williamr@2
     5
 *
williamr@2
     6
 * Copyright (c) 1996,1997
williamr@2
     7
 * Silicon Graphics Computer Systems, Inc.
williamr@2
     8
 *
williamr@2
     9
 * Copyright (c) 1997
williamr@2
    10
 * Moscow Center for SPARC Technology
williamr@2
    11
 *
williamr@2
    12
 * Copyright (c) 1999 
williamr@2
    13
 * Boris Fomitchev
williamr@2
    14
 *
williamr@2
    15
 * This material is provided "as is", with absolutely no warranty expressed
williamr@2
    16
 * or implied. Any use is at your own risk.
williamr@2
    17
 *
williamr@2
    18
 * Permission to use or copy this software for any purpose is hereby granted 
williamr@2
    19
 * without fee, provided the above notices are retained on all copies.
williamr@2
    20
 * Permission to modify the code and to distribute modified code is granted,
williamr@2
    21
 * provided the above notices are retained, and a notice that the code was
williamr@2
    22
 * modified is included with the above copyright notice.
williamr@2
    23
 *
williamr@2
    24
 */
williamr@2
    25
williamr@2
    26
/* NOTE: This is an internal header file, included by other STL headers.
williamr@2
    27
 *   You should not attempt to use it directly.
williamr@2
    28
 */
williamr@2
    29
williamr@2
    30
#ifndef _STLP_INTERNAL_VECTOR_H
williamr@2
    31
#define _STLP_INTERNAL_VECTOR_H
williamr@2
    32
williamr@2
    33
williamr@2
    34
williamr@2
    35
# ifndef _STLP_INTERNAL_ALGOBASE_H
williamr@2
    36
#  include <stl/_algobase.h>
williamr@2
    37
# endif
williamr@2
    38
williamr@2
    39
# ifndef _STLP_INTERNAL_ALLOC_H
williamr@2
    40
#  include <stl/_alloc.h>
williamr@2
    41
# endif
williamr@2
    42
williamr@2
    43
# ifndef _STLP_INTERNAL_ITERATOR_H
williamr@2
    44
#  include <stl/_iterator.h>
williamr@2
    45
# endif
williamr@2
    46
williamr@2
    47
# ifndef _STLP_INTERNAL_UNINITIALIZED_H
williamr@2
    48
#  include <stl/_uninitialized.h>
williamr@2
    49
# endif
williamr@2
    50
williamr@2
    51
# ifndef _STLP_RANGE_ERRORS_H
williamr@2
    52
#  include <stl/_range_errors.h>
williamr@2
    53
# endif
williamr@2
    54
williamr@2
    55
#  undef  vector
williamr@2
    56
#  define vector __WORKAROUND_DBG_RENAME(vector)
williamr@2
    57
williamr@2
    58
_STLP_BEGIN_NAMESPACE 
williamr@2
    59
williamr@2
    60
// The vector base class serves two purposes.  First, its constructor
williamr@2
    61
// and destructor allocate (but don't initialize) storage.  This makes
williamr@2
    62
// exception safety easier.
williamr@2
    63
williamr@2
    64
template <class _Tp, class _Alloc> 
williamr@2
    65
class _Vector_base {
williamr@2
    66
public:
williamr@2
    67
  typedef _Vector_base<_Tp, _Alloc> _Base;
williamr@2
    68
  _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
williamr@2
    69
  typedef typename _Alloc_traits<_Tp, _Alloc>::allocator_type allocator_type;
williamr@2
    70
williamr@2
    71
  _Vector_base(const _Alloc& __a)
williamr@2
    72
    : _M_start(0), _M_finish(0), _M_end_of_storage(__a, 0) {
williamr@2
    73
    // no push here as not needed
williamr@2
    74
  }
williamr@2
    75
  _Vector_base(size_t __n, const _Alloc& __a)
williamr@2
    76
    : _M_start(0), _M_finish(0), _M_end_of_storage(__a, 0)
williamr@2
    77
  {
williamr@2
    78
    _STLP_PUSH_CLEANUP_ITEM(_Base, this)
williamr@2
    79
    _M_start = _M_end_of_storage.allocate(__n);
williamr@2
    80
    _M_finish = _M_start;
williamr@2
    81
    _M_end_of_storage._M_data = _M_start + __n;
williamr@2
    82
    _STLP_MPWFIX_TRY _STLP_MPWFIX_CATCH
williamr@2
    83
  }
williamr@2
    84
williamr@2
    85
  ~_Vector_base() { 
williamr@2
    86
    if (_M_start !=0) 
williamr@2
    87
    _M_end_of_storage.deallocate(_M_start, _M_end_of_storage._M_data - _M_start); 
williamr@2
    88
  }
williamr@2
    89
williamr@2
    90
protected:
williamr@2
    91
  _Tp* _M_start;
williamr@2
    92
  _Tp* _M_finish;
williamr@2
    93
  _STLP_alloc_proxy<_Tp*, _Tp, allocator_type> _M_end_of_storage;
williamr@2
    94
};
williamr@2
    95
williamr@2
    96
template <class _Tp, _STLP_DEFAULT_ALLOCATOR_SELECT(_Tp) >
williamr@2
    97
class vector : public _Vector_base<_Tp, _Alloc> 
williamr@2
    98
{
williamr@2
    99
private:
williamr@2
   100
  typedef _Vector_base<_Tp, _Alloc> _Base;
williamr@2
   101
public:
williamr@2
   102
  typedef _Tp value_type;
williamr@2
   103
  typedef value_type* pointer;
williamr@2
   104
  typedef const value_type* const_pointer;
williamr@2
   105
  typedef value_type* iterator;
williamr@2
   106
  typedef const value_type* const_iterator;
williamr@2
   107
williamr@2
   108
public:
williamr@2
   109
  typedef value_type& reference;
williamr@2
   110
  typedef const value_type& const_reference;
williamr@2
   111
  typedef size_t size_type;
williamr@2
   112
  typedef ptrdiff_t difference_type;
williamr@2
   113
  typedef random_access_iterator_tag _Iterator_category;
williamr@2
   114
williamr@2
   115
  _STLP_DECLARE_RANDOM_ACCESS_REVERSE_ITERATORS;
williamr@2
   116
  _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
williamr@2
   117
  typedef typename _Vector_base<_Tp, _Alloc>::allocator_type allocator_type;
williamr@2
   118
williamr@2
   119
  allocator_type get_allocator() const {
williamr@2
   120
    return _STLP_CONVERT_ALLOCATOR((const allocator_type&)this->_M_end_of_storage, _Tp);
williamr@2
   121
  }
williamr@2
   122
williamr@2
   123
#ifdef _STLP_USE_TRAP_LEAVE
williamr@2
   124
public:
williamr@2
   125
  static void* operator new (size_t __n, TLeave) { return _STLP_StackHelper<bool>::_NewLC(__n); }
williamr@2
   126
  static void* operator new (size_t __n) { return _STLP_StackHelper<bool>::_NewLC(__n); }
williamr@2
   127
#endif
williamr@2
   128
williamr@2
   129
protected:
williamr@2
   130
  typedef typename  __type_traits<_Tp>::has_trivial_assignment_operator _TrivialAss;
williamr@2
   131
  typedef typename  __type_traits<_Tp>::has_trivial_assignment_operator _IsPODType;
williamr@2
   132
williamr@2
   133
  // handles insertions on overflow
williamr@2
   134
  void _M_insert_overflow(pointer __position, const _Tp& __x, const __false_type&, 
williamr@2
   135
			  size_type __fill_len, bool __atend = false) {
williamr@2
   136
    const size_type __old_size = size();
williamr@2
   137
    const size_type __len = __old_size + (max)(__old_size, __fill_len);
williamr@2
   138
    
williamr@2
   139
    _STLP_LEAVE_VOLATILE pointer __new_start = this->_M_end_of_storage.allocate(__len);
williamr@2
   140
    _STLP_LEAVE_VOLATILE pointer __new_finish = __new_start;
williamr@2
   141
    _STLP_TRY {
williamr@2
   142
      __new_finish = __uninitialized_copy(this->_M_start, __position, __new_start, __false_type());
williamr@2
   143
      // handle insertion
williamr@2
   144
      if (__fill_len == 1) {
williamr@2
   145
        _Construct(__new_finish, __x);
williamr@2
   146
        ++__new_finish;
williamr@2
   147
      } else
williamr@2
   148
        __new_finish = __uninitialized_fill_n(__new_finish, __fill_len, __x, __false_type());
williamr@2
   149
      if (!__atend)
williamr@2
   150
        // copy remainder
williamr@2
   151
        __new_finish = __uninitialized_copy(__position, this->_M_finish, __new_finish, __false_type());
williamr@2
   152
    }
williamr@2
   153
    _STLP_UNWIND((_Destroy(__new_start,__new_finish), 
williamr@2
   154
                  this->_M_end_of_storage.deallocate(__new_start,__len)));
williamr@2
   155
    _M_clear();
williamr@2
   156
    _M_set(__new_start, __new_finish, __new_start + __len);
williamr@2
   157
  }
williamr@2
   158
williamr@2
   159
  void _M_insert_overflow(pointer __position, const _Tp& __x, const __true_type&, 
williamr@2
   160
			  size_type __fill_len, bool __atend = false) {
williamr@2
   161
    const size_type __old_size = size();
williamr@2
   162
    const size_type __len = __old_size + (max)(__old_size, __fill_len);
williamr@2
   163
    
williamr@2
   164
    pointer __new_start = this->_M_end_of_storage.allocate(__len);
williamr@2
   165
    pointer __new_finish = (pointer)__copy_trivial(this->_M_start, __position, __new_start);
williamr@2
   166
      // handle insertion
williamr@2
   167
    __new_finish = fill_n(__new_finish, __fill_len, __x);
williamr@2
   168
    if (!__atend)
williamr@2
   169
      // copy remainder
williamr@2
   170
      __new_finish = (pointer)__copy_trivial(__position, this->_M_finish, __new_finish);
williamr@2
   171
    _M_clear();
williamr@2
   172
    _M_set(__new_start, __new_finish, __new_start + __len);
williamr@2
   173
  }
williamr@2
   174
 
williamr@2
   175
  void _M_range_check(size_type __n) const {
williamr@2
   176
    if (__n >= size_type(this->_M_finish-this->_M_start))
williamr@2
   177
      __stl_throw_out_of_range("vector");
williamr@2
   178
  }
williamr@2
   179
williamr@2
   180
public:
williamr@2
   181
  iterator begin()             { return this->_M_start; }
williamr@2
   182
  const_iterator begin() const { return this->_M_start; }
williamr@2
   183
  iterator end()               { return this->_M_finish; }
williamr@2
   184
  const_iterator end() const   { return this->_M_finish; }
williamr@2
   185
williamr@2
   186
  reverse_iterator rbegin()              { return reverse_iterator(end()); }
williamr@2
   187
  const_reverse_iterator rbegin() const  { return const_reverse_iterator(end()); }
williamr@2
   188
  reverse_iterator rend()                { return reverse_iterator(begin()); }
williamr@2
   189
  const_reverse_iterator rend() const    { return const_reverse_iterator(begin()); }
williamr@2
   190
williamr@2
   191
  size_type size() const        { return size_type(this->_M_finish - this->_M_start); }
williamr@2
   192
  size_type max_size() const    { return size_type(-1) / sizeof(_Tp); }
williamr@2
   193
  size_type capacity() const    { return size_type(this->_M_end_of_storage._M_data - this->_M_start); }
williamr@2
   194
  bool empty() const            { return this->_M_start == this->_M_finish; }
williamr@2
   195
williamr@2
   196
  reference operator[](size_type __n) { return *(begin() + __n); }
williamr@2
   197
  const_reference operator[](size_type __n) const { return *(begin() + __n); }
williamr@2
   198
williamr@2
   199
  reference front()             { return *begin(); }
williamr@2
   200
  const_reference front() const { return *begin(); }
williamr@2
   201
  reference back()              { return *(end() - 1); }
williamr@2
   202
  const_reference back() const  { return *(end() - 1); }
williamr@2
   203
williamr@2
   204
  reference at(size_type __n) { _M_range_check(__n); return (*this)[__n]; }
williamr@2
   205
  const_reference at(size_type __n) const { _M_range_check(__n); return (*this)[__n]; }
williamr@2
   206
williamr@2
   207
  //explicit vector(const allocator_type& __a = allocator_type()) : 
williamr@2
   208
  vector(const allocator_type& __a = allocator_type()) : //to useimplicitly  constructor taking allocator
williamr@2
   209
    _Vector_base<_Tp, _Alloc>(__a) {
williamr@2
   210
    // needed for new() to work correctly
williamr@2
   211
    _STLP_POP_IF_CHECK
williamr@2
   212
  }
williamr@2
   213
williamr@2
   214
  vector(size_type __n, const _Tp& __val,
williamr@2
   215
         const allocator_type& __a = allocator_type()) 
williamr@2
   216
    : _Vector_base<_Tp, _Alloc>(__n, __a) { 
williamr@2
   217
    this->_M_finish = uninitialized_fill_n(this->_M_start, __n, __val); 
williamr@2
   218
    _STLP_POP_CLEANUP_ITEM
williamr@2
   219
  }
williamr@2
   220
williamr@2
   221
  explicit vector(size_type __n)
williamr@2
   222
    : _Vector_base<_Tp, _Alloc>(__n, allocator_type() ) {
williamr@2
   223
# ifdef _STLP_USE_TRAP_LEAVE
williamr@2
   224
      _Tp __p;
williamr@2
   225
      _STLP_PUSH_CLEANUP_ITEM(_Tp, &__p) 
williamr@2
   226
      this->_M_finish = uninitialized_fill_n(this->_M_start, __n, __p); 
williamr@2
   227
      // unconditional for __p
williamr@2
   228
      CleanupStack::Pop();
williamr@2
   229
      _STLP_POP_CLEANUP_ITEM
williamr@2
   230
# else
williamr@2
   231
    this->_M_finish = uninitialized_fill_n(this->_M_start, __n, _Tp()); 
williamr@2
   232
# endif
williamr@2
   233
  }
williamr@2
   234
williamr@2
   235
  vector(const vector<_Tp, _Alloc>& __x) 
williamr@2
   236
    : _Vector_base<_Tp, _Alloc>(__x.size(), __x.get_allocator()) {
williamr@2
   237
    this->_M_finish = __uninitialized_copy((const_pointer)__x._M_start, 
williamr@2
   238
                                           (const_pointer)__x._M_finish, this->_M_start, _IsPODType());
williamr@2
   239
    _STLP_POP_CLEANUP_ITEM 
williamr@2
   240
  }
williamr@2
   241
  
williamr@2
   242
#if defined (_STLP_MEMBER_TEMPLATES)
williamr@2
   243
  template <class _Integer>
williamr@2
   244
  void _M_initialize_aux(_Integer __n, _Integer __val, const __true_type&) {
williamr@2
   245
    this->_M_start = this->_M_end_of_storage.allocate(__n);
williamr@2
   246
    this->_M_end_of_storage._M_data = this->_M_start + __n; 
williamr@2
   247
    this->_M_finish = uninitialized_fill_n(this->_M_start, __n, __val);
williamr@2
   248
  }
williamr@2
   249
williamr@2
   250
  template <class _InputIterator>
williamr@2
   251
  void _M_initialize_aux(_InputIterator __first, _InputIterator __last,
williamr@2
   252
                         const __false_type&) {
williamr@2
   253
    _M_range_initialize(__first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));
williamr@2
   254
  }
williamr@2
   255
williamr@2
   256
  // Check whether it's an integral type.  If so, it's not an iterator.
williamr@2
   257
 # ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
williamr@2
   258
  template <class _InputIterator>
williamr@2
   259
  vector(_InputIterator __first, _InputIterator __last) :
williamr@2
   260
    _Vector_base<_Tp, _Alloc>(allocator_type()) {
williamr@2
   261
    typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
williamr@2
   262
    _STLP_PUSH_CLEANUP_ITEM(_Base, this) 
williamr@2
   263
    _M_initialize_aux(__first, __last, _Integral());
williamr@2
   264
    _STLP_POP_CLEANUP_ITEM
williamr@2
   265
  }
williamr@2
   266
 # endif
williamr@2
   267
  template <class _InputIterator>
williamr@2
   268
  vector(_InputIterator __first, _InputIterator __last,
williamr@2
   269
         const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL ) :
williamr@2
   270
    _Vector_base<_Tp, _Alloc>(__a) {
williamr@2
   271
    typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
williamr@2
   272
    _STLP_PUSH_CLEANUP_ITEM(_Base, this) 
williamr@2
   273
    _M_initialize_aux(__first, __last, _Integral());
williamr@2
   274
    _STLP_POP_CLEANUP_ITEM
williamr@2
   275
  }
williamr@2
   276
williamr@2
   277
#else
williamr@2
   278
  vector(const _Tp* __first, const _Tp* __last,
williamr@2
   279
         const allocator_type& __a = allocator_type())
williamr@2
   280
    : _Vector_base<_Tp, _Alloc>(__last - __first, __a) { 
williamr@2
   281
      this->_M_finish = __uninitialized_copy(__first, __last, this->_M_start, _IsPODType()); 
williamr@2
   282
    _STLP_POP_CLEANUP_ITEM
williamr@2
   283
  }
williamr@2
   284
#endif /* _STLP_MEMBER_TEMPLATES */
williamr@2
   285
williamr@2
   286
  ~vector() { _Destroy(this->_M_start, this->_M_finish); }
williamr@2
   287
williamr@2
   288
  vector<_Tp, _Alloc>& operator=(const vector<_Tp, _Alloc>& __x);
williamr@2
   289
williamr@2
   290
  void reserve(size_type __n);
williamr@2
   291
williamr@2
   292
  // assign(), a generalized assignment member function.  Two
williamr@2
   293
  // versions: one that takes a count, and one that takes a range.
williamr@2
   294
  // The range version is a member template, so we dispatch on whether
williamr@2
   295
  // or not the type is an integer.
williamr@2
   296
williamr@2
   297
  void assign(size_type __n, const _Tp& __val) { _M_fill_assign(__n, __val); }
williamr@2
   298
  void _M_fill_assign(size_type __n, const _Tp& __val);
williamr@2
   299
  
williamr@2
   300
#ifdef _STLP_MEMBER_TEMPLATES
williamr@2
   301
  template <class _ForwardIter>
williamr@2
   302
  void _M_assign_aux(_ForwardIter __first, _ForwardIter __last, const forward_iterator_tag &)
williamr@2
   303
#else
williamr@2
   304
  void assign(const_iterator __first, const_iterator __last)
williamr@2
   305
#endif
williamr@2
   306
  {
williamr@2
   307
    size_type __len = distance(__first, __last);
williamr@2
   308
    
williamr@2
   309
    if (__len > capacity()) {
williamr@2
   310
      iterator __tmp = _M_allocate_and_copy(__len, __first, __last);
williamr@2
   311
    _M_clear();
williamr@2
   312
    _M_set(__tmp, __tmp + __len, __tmp + __len);
williamr@2
   313
    }
williamr@2
   314
    else if (size() >= __len) {
williamr@2
   315
      iterator __new_finish = copy(__first, __last, this->_M_start);
williamr@2
   316
      _Destroy(__new_finish, this->_M_finish);
williamr@2
   317
      this->_M_finish = __new_finish;
williamr@2
   318
    }
williamr@2
   319
    else {
williamr@2
   320
# if defined ( _STLP_MEMBER_TEMPLATES )
williamr@2
   321
          _ForwardIter __mid = __first;
williamr@2
   322
          advance(__mid, size());
williamr@2
   323
# else
williamr@2
   324
          const_iterator __mid = __first + size() ;
williamr@2
   325
# endif
williamr@2
   326
    copy(__first, __mid, this->_M_start);
williamr@2
   327
    this->_M_finish = __uninitialized_copy(__mid, __last, this->_M_finish, _IsPODType());
williamr@2
   328
    }
williamr@2
   329
  }
williamr@2
   330
williamr@2
   331
#ifdef _STLP_MEMBER_TEMPLATES
williamr@2
   332
  template <class _InputIter>
williamr@2
   333
  void _M_assign_aux(_InputIter __first, _InputIter __last,
williamr@2
   334
		     const input_iterator_tag &) {
williamr@2
   335
    iterator __cur = begin();
williamr@2
   336
    for ( ; __first != __last && __cur != end(); ++__cur, ++__first)
williamr@2
   337
      *__cur = *__first;
williamr@2
   338
    if (__first == __last)
williamr@2
   339
      erase(__cur, end());
williamr@2
   340
    else
williamr@2
   341
      insert(end(), __first, __last);
williamr@2
   342
  }
williamr@2
   343
  
williamr@2
   344
  template <class _Integer>
williamr@2
   345
  void _M_assign_dispatch(_Integer __n, _Integer __val, const __true_type&)
williamr@2
   346
    { assign((size_type) __n, (_Tp) __val); }
williamr@2
   347
williamr@2
   348
  template <class _InputIter>
williamr@2
   349
  void _M_assign_dispatch(_InputIter __first, _InputIter __last, const __false_type&)
williamr@2
   350
    { _M_assign_aux(__first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIter)); }
williamr@2
   351
williamr@2
   352
  template <class _InputIterator>
williamr@2
   353
  void assign(_InputIterator __first, _InputIterator __last) {
williamr@2
   354
    typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
williamr@2
   355
    _M_assign_dispatch(__first, __last, _Integral());
williamr@2
   356
  }
williamr@2
   357
#endif /* _STLP_MEMBER_TEMPLATES */
williamr@2
   358
williamr@2
   359
  void push_back(const _Tp& __x) {
williamr@2
   360
    if (this->_M_finish != this->_M_end_of_storage._M_data) {
williamr@2
   361
      _Construct(this->_M_finish, __x);
williamr@2
   362
      ++this->_M_finish;
williamr@2
   363
    }
williamr@2
   364
    else
williamr@2
   365
      _M_insert_overflow(this->_M_finish, __x, _IsPODType(), 1UL, true);
williamr@2
   366
  }
williamr@2
   367
williamr@2
   368
  void swap(vector<_Tp, _Alloc>& __x) {
williamr@2
   369
    _STLP_STD::swap(this->_M_start, __x._M_start);
williamr@2
   370
    _STLP_STD::swap(this->_M_finish, __x._M_finish);
williamr@2
   371
    _STLP_STD::swap(this->_M_end_of_storage, __x._M_end_of_storage);
williamr@2
   372
  }
williamr@2
   373
williamr@2
   374
  iterator insert(iterator __position, const _Tp& __x) {
williamr@2
   375
    size_type __n = __position - begin();
williamr@2
   376
    if (this->_M_finish != this->_M_end_of_storage._M_data) {
williamr@2
   377
      if (__position == end()) {
williamr@2
   378
        _Construct(this->_M_finish, __x);
williamr@2
   379
        ++this->_M_finish;
williamr@2
   380
      } else {
williamr@2
   381
        _Construct(this->_M_finish, *(this->_M_finish - 1));
williamr@2
   382
        ++this->_M_finish;
williamr@2
   383
        _Tp __x_copy = __x;
williamr@2
   384
        __copy_backward_ptrs(__position, this->_M_finish - 2, this->_M_finish - 1, _TrivialAss());
williamr@2
   385
        *__position = __x_copy;
williamr@2
   386
      }
williamr@2
   387
    }
williamr@2
   388
    else
williamr@2
   389
      _M_insert_overflow(__position, __x, _IsPODType(), 1UL);
williamr@2
   390
    return begin() + __n;
williamr@2
   391
  }
williamr@2
   392
williamr@2
   393
# ifndef _STLP_NO_ANACHRONISMS
williamr@2
   394
  void push_back() { push_back(_Tp()); }
williamr@2
   395
  iterator insert(iterator __position) { return insert(__position, _Tp()); }
williamr@2
   396
# endif
williamr@2
   397
williamr@2
   398
  void _M_fill_insert (iterator __pos, size_type __n, const _Tp& __x);
williamr@2
   399
williamr@2
   400
#if defined ( _STLP_MEMBER_TEMPLATES)
williamr@2
   401
williamr@2
   402
  template <class _Integer>
williamr@2
   403
  void _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __val,
williamr@2
   404
                          const __true_type&) {
williamr@2
   405
    _M_fill_insert(__pos, (size_type) __n, (_Tp) __val);
williamr@2
   406
  }
williamr@2
   407
williamr@2
   408
  template <class _InputIterator>
williamr@2
   409
  void _M_insert_dispatch(iterator __pos,
williamr@2
   410
                          _InputIterator __first, _InputIterator __last,
williamr@2
   411
                          const __false_type&) {
williamr@2
   412
    _M_range_insert(__pos, __first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));
williamr@2
   413
  }
williamr@2
   414
williamr@2
   415
  // Check whether it's an integral type.  If so, it's not an iterator.
williamr@2
   416
  template <class _InputIterator>
williamr@2
   417
  void insert(iterator __pos, _InputIterator __first, _InputIterator __last) {
williamr@2
   418
    typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
williamr@2
   419
    _M_insert_dispatch(__pos, __first, __last, _Integral());
williamr@2
   420
  }
williamr@2
   421
williamr@2
   422
  template <class _InputIterator>
williamr@2
   423
  void _M_range_insert(iterator __pos, 
williamr@2
   424
		       _InputIterator __first, 
williamr@2
   425
		       _InputIterator __last,
williamr@2
   426
		       const input_iterator_tag &) {
williamr@2
   427
    for ( ; __first != __last; ++__first) {
williamr@2
   428
      __pos = insert(__pos, *__first);
williamr@2
   429
      ++__pos;
williamr@2
   430
    }
williamr@2
   431
  }
williamr@2
   432
williamr@2
   433
  template <class _ForwardIterator>
williamr@2
   434
  void _M_range_insert(iterator __position,
williamr@2
   435
                       _ForwardIterator __first,
williamr@2
   436
                       _ForwardIterator __last,
williamr@2
   437
                       const forward_iterator_tag &) 
williamr@2
   438
#else /* _STLP_MEMBER_TEMPLATES */
williamr@2
   439
  void insert(iterator __position,
williamr@2
   440
              const_iterator __first, const_iterator __last)
williamr@2
   441
#endif /* _STLP_MEMBER_TEMPLATES */
williamr@2
   442
williamr@2
   443
  {
williamr@2
   444
    if (__first != __last) {
williamr@2
   445
      size_type __n = distance(__first, __last);
williamr@2
   446
williamr@2
   447
      if (size_type(this->_M_end_of_storage._M_data - this->_M_finish) >= __n) {
williamr@2
   448
        const size_type __elems_after = this->_M_finish - __position;
williamr@2
   449
        pointer __old_finish = this->_M_finish;
williamr@2
   450
        if (__elems_after > __n) {
williamr@2
   451
          __uninitialized_copy(this->_M_finish - __n, this->_M_finish, this->_M_finish, _IsPODType());
williamr@2
   452
          this->_M_finish += __n;
williamr@2
   453
          __copy_backward_ptrs(__position, __old_finish - __n, __old_finish, _TrivialAss());
williamr@2
   454
          copy(__first, __last, __position);
williamr@2
   455
        }
williamr@2
   456
        else {
williamr@2
   457
# if defined ( _STLP_MEMBER_TEMPLATES )
williamr@2
   458
          _ForwardIterator __mid = __first;
williamr@2
   459
          advance(__mid, __elems_after);
williamr@2
   460
# else
williamr@2
   461
          const_pointer __mid = __first + __elems_after;
williamr@2
   462
# endif
williamr@2
   463
          __uninitialized_copy(__mid, __last, this->_M_finish, _IsPODType());
williamr@2
   464
          this->_M_finish += __n - __elems_after;
williamr@2
   465
          __uninitialized_copy(__position, __old_finish, this->_M_finish, _IsPODType());
williamr@2
   466
          this->_M_finish += __elems_after;
williamr@2
   467
          copy(__first, __mid, __position);
williamr@2
   468
        } /* elems_after */
williamr@2
   469
      }
williamr@2
   470
      else {
williamr@2
   471
        const size_type __old_size = size();
williamr@2
   472
        const size_type __len = __old_size + (max)(__old_size, __n);
williamr@2
   473
        _STLP_LEAVE_VOLATILE pointer __new_start = this->_M_end_of_storage.allocate(__len);
williamr@2
   474
        _STLP_LEAVE_VOLATILE pointer __new_finish = __new_start;
williamr@2
   475
        _STLP_TRY {
williamr@2
   476
          __new_finish = __uninitialized_copy(this->_M_start, __position, __new_start, _IsPODType());
williamr@2
   477
          __new_finish = __uninitialized_copy(__first, __last, __new_finish, _IsPODType());
williamr@2
   478
          __new_finish = __uninitialized_copy(__position, this->_M_finish, __new_finish, _IsPODType());
williamr@2
   479
        }
williamr@2
   480
        _STLP_UNWIND((_Destroy(__new_start,__new_finish), 
williamr@2
   481
                      this->_M_end_of_storage.deallocate(__new_start,__len)));
williamr@2
   482
        _M_clear();
williamr@2
   483
        _M_set(__new_start, __new_finish, __new_start + __len);
williamr@2
   484
      }
williamr@2
   485
    }
williamr@2
   486
  }
williamr@2
   487
  void insert (iterator __pos, size_type __n, const _Tp& __x)
williamr@2
   488
  { _M_fill_insert(__pos, __n, __x); }
williamr@2
   489
  
williamr@2
   490
  void pop_back() {
williamr@2
   491
    --this->_M_finish;
williamr@2
   492
    _Destroy(this->_M_finish);
williamr@2
   493
  }
williamr@2
   494
  iterator erase(iterator __position) {
williamr@2
   495
    if (__position + 1 != end())
williamr@2
   496
      __copy_ptrs(__position + 1, this->_M_finish, __position, _TrivialAss());
williamr@2
   497
    --this->_M_finish;
williamr@2
   498
    _Destroy(this->_M_finish);
williamr@2
   499
    return __position;
williamr@2
   500
  }
williamr@2
   501
  iterator erase(iterator __first, iterator __last) {
williamr@2
   502
    pointer __i = __copy_ptrs(__last, this->_M_finish, __first, _TrivialAss());
williamr@2
   503
    _Destroy(__i, this->_M_finish);
williamr@2
   504
    this->_M_finish = __i;
williamr@2
   505
    return __first;
williamr@2
   506
  }
williamr@2
   507
williamr@2
   508
  void resize(size_type __new_size, _Tp __x) {
williamr@2
   509
    if (__new_size < size()) 
williamr@2
   510
      erase(begin() + __new_size, end());
williamr@2
   511
    else
williamr@2
   512
      insert(end(), __new_size - size(), __x);
williamr@2
   513
  }
williamr@2
   514
williamr@2
   515
  void resize(size_type __new_size) { 
williamr@2
   516
   resize(__new_size, _Tp());
williamr@2
   517
  }
williamr@2
   518
williamr@2
   519
  void clear() { 
williamr@2
   520
    erase(begin(), end());
williamr@2
   521
  }
williamr@2
   522
williamr@2
   523
protected:
williamr@2
   524
williamr@2
   525
  void _M_clear() {
williamr@2
   526
    //    if (this->_M_start) {
williamr@2
   527
    _Destroy(this->_M_start, this->_M_finish);
williamr@2
   528
    this->_M_end_of_storage.deallocate(this->_M_start, this->_M_end_of_storage._M_data - this->_M_start);
williamr@2
   529
    //    }
williamr@2
   530
  }
williamr@2
   531
williamr@2
   532
  void _M_set(pointer __s, pointer __f, pointer __e) {
williamr@2
   533
    this->_M_start = __s;
williamr@2
   534
    this->_M_finish = __f;
williamr@2
   535
    this->_M_end_of_storage._M_data = __e;
williamr@2
   536
  }
williamr@2
   537
williamr@2
   538
#ifdef _STLP_MEMBER_TEMPLATES
williamr@2
   539
  template <class _ForwardIterator>
williamr@2
   540
  pointer _M_allocate_and_copy(size_type __n, _ForwardIterator __first, 
williamr@2
   541
				_ForwardIterator __last)
williamr@2
   542
#else /* _STLP_MEMBER_TEMPLATES */
williamr@2
   543
  pointer _M_allocate_and_copy(size_type __n, const_pointer __first, 
williamr@2
   544
			       const_pointer __last)
williamr@2
   545
#endif /* _STLP_MEMBER_TEMPLATES */
williamr@2
   546
  {
williamr@2
   547
    _STLP_LEAVE_VOLATILE pointer __result = this->_M_end_of_storage.allocate(__n);
williamr@2
   548
    _STLP_TRY {
williamr@2
   549
#if (!defined(__MRC__))		//*TY 12/17/2000 - added workaround for MrCpp. it confuses on nested try/catch block
williamr@2
   550
      __uninitialized_copy(__first, __last, __result, _IsPODType());
williamr@2
   551
#else
williamr@2
   552
      uninitialized_copy(__first, __last, __result);
williamr@2
   553
#endif
williamr@2
   554
      //      return __result;
williamr@2
   555
    }
williamr@2
   556
    _STLP_UNWIND(this->_M_end_of_storage.deallocate(__result, __n));
williamr@2
   557
    return __result;
williamr@2
   558
  }
williamr@2
   559
williamr@2
   560
williamr@2
   561
#ifdef _STLP_MEMBER_TEMPLATES
williamr@2
   562
  template <class _InputIterator>
williamr@2
   563
  void _M_range_initialize(_InputIterator __first,  
williamr@2
   564
                           _InputIterator __last, const input_iterator_tag &) {
williamr@2
   565
    for ( ; __first != __last; ++__first)
williamr@2
   566
      push_back(*__first);
williamr@2
   567
  }
williamr@2
   568
  // This function is only called by the constructor. 
williamr@2
   569
  template <class _ForwardIterator>
williamr@2
   570
  void _M_range_initialize(_ForwardIterator __first,
williamr@2
   571
                           _ForwardIterator __last, const forward_iterator_tag &) {
williamr@2
   572
    size_type __n = distance(__first, __last);
williamr@2
   573
    this->_M_start = this->_M_end_of_storage.allocate(__n);
williamr@2
   574
    this->_M_end_of_storage._M_data = this->_M_start + __n;
williamr@2
   575
    this->_M_finish = __uninitialized_copy(__first, __last, this->_M_start, _IsPODType());
williamr@2
   576
  }
williamr@2
   577
  
williamr@2
   578
#endif /* _STLP_MEMBER_TEMPLATES */
williamr@2
   579
};
williamr@2
   580
williamr@2
   581
# define _STLP_TEMPLATE_CONTAINER vector<_Tp, _Alloc>
williamr@2
   582
# define _STLP_TEMPLATE_HEADER    template <class _Tp, class _Alloc>
williamr@2
   583
# include <stl/_relops_cont.h>
williamr@2
   584
# undef _STLP_TEMPLATE_CONTAINER
williamr@2
   585
# undef _STLP_TEMPLATE_HEADER
williamr@2
   586
williamr@2
   587
# if defined (_STLP_USE_TEMPLATE_EXPORT) 
williamr@2
   588
_STLP_EXPORT_TEMPLATE_CLASS allocator<void*>;
williamr@2
   589
_STLP_EXPORT_TEMPLATE_CLASS _STLP_alloc_proxy<void**, void*, allocator<void*> >;
williamr@2
   590
_STLP_EXPORT_TEMPLATE_CLASS _Vector_base<void*,allocator<void*> >;
williamr@2
   591
_STLP_EXPORT_TEMPLATE_CLASS vector<void*,allocator<void*> >;
williamr@2
   592
# endif
williamr@2
   593
williamr@2
   594
#  undef  vector
williamr@2
   595
#  undef  __vector__
williamr@2
   596
#  define __vector__ __WORKAROUND_RENAME(vector)
williamr@2
   597
williamr@2
   598
_STLP_END_NAMESPACE
williamr@2
   599
williamr@2
   600
# if !defined (_STLP_LINK_TIME_INSTANTIATION)
williamr@2
   601
#  include <stl/_vector.c>
williamr@2
   602
# endif
williamr@2
   603
williamr@2
   604
#ifndef _STLP_INTERNAL_BVECTOR_H
williamr@2
   605
# include <stl/_bvector.h>
williamr@2
   606
#endif
williamr@2
   607
williamr@2
   608
# if defined (_STLP_DEBUG)
williamr@2
   609
#  include <stl/debug/_vector.h>
williamr@2
   610
# endif
williamr@2
   611
williamr@2
   612
# if defined (_STLP_USE_WRAPPER_FOR_ALLOC_PARAM)
williamr@2
   613
#  include <stl/wrappers/_vector.h>
williamr@2
   614
# endif
williamr@2
   615
williamr@2
   616
#endif /* _STLP_VECTOR_H */
williamr@2
   617
williamr@2
   618
// Local Variables:
williamr@2
   619
// mode:C++
williamr@2
   620
// End:
williamr@2
   621