epoc32/include/tools/stlport/stl/_vector.h
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
 * Copyright (c) 1994
williamr@4
     4
 * Hewlett-Packard Company
williamr@4
     5
 *
williamr@4
     6
 * Copyright (c) 1996,1997
williamr@4
     7
 * Silicon Graphics Computer Systems, Inc.
williamr@4
     8
 *
williamr@4
     9
 * Copyright (c) 1997
williamr@4
    10
 * Moscow Center for SPARC Technology
williamr@4
    11
 *
williamr@4
    12
 * Copyright (c) 1999
williamr@4
    13
 * Boris Fomitchev
williamr@4
    14
 *
williamr@4
    15
 * This material is provided "as is", with absolutely no warranty expressed
williamr@4
    16
 * or implied. Any use is at your own risk.
williamr@4
    17
 *
williamr@4
    18
 * Permission to use or copy this software for any purpose is hereby granted
williamr@4
    19
 * without fee, provided the above notices are retained on all copies.
williamr@4
    20
 * Permission to modify the code and to distribute modified code is granted,
williamr@4
    21
 * provided the above notices are retained, and a notice that the code was
williamr@4
    22
 * modified is included with the above copyright notice.
williamr@4
    23
 *
williamr@4
    24
 */
williamr@4
    25
williamr@4
    26
/* NOTE: This is an internal header file, included by other STL headers.
williamr@4
    27
 *   You should not attempt to use it directly.
williamr@4
    28
 */
williamr@4
    29
williamr@4
    30
#ifndef _STLP_INTERNAL_VECTOR_H
williamr@4
    31
#define _STLP_INTERNAL_VECTOR_H
williamr@4
    32
williamr@4
    33
#ifndef _STLP_INTERNAL_ALGOBASE_H
williamr@4
    34
#  include <stl/_algobase.h>
williamr@4
    35
#endif
williamr@4
    36
williamr@4
    37
#ifndef _STLP_INTERNAL_ALLOC_H
williamr@4
    38
#  include <stl/_alloc.h>
williamr@4
    39
#endif
williamr@4
    40
williamr@4
    41
#ifndef _STLP_INTERNAL_ITERATOR_H
williamr@4
    42
#  include <stl/_iterator.h>
williamr@4
    43
#endif
williamr@4
    44
williamr@4
    45
#ifndef _STLP_INTERNAL_UNINITIALIZED_H
williamr@4
    46
#  include <stl/_uninitialized.h>
williamr@4
    47
#endif
williamr@4
    48
williamr@4
    49
_STLP_BEGIN_NAMESPACE
williamr@4
    50
williamr@4
    51
// The vector base class serves one purpose, its constructor and
williamr@4
    52
// destructor allocate (but don't initialize) storage.  This makes
williamr@4
    53
// exception safety easier.
williamr@4
    54
williamr@4
    55
_STLP_MOVE_TO_PRIV_NAMESPACE
williamr@4
    56
williamr@4
    57
template <class _Tp, class _Alloc>
williamr@4
    58
class _Vector_base {
williamr@4
    59
public:
williamr@4
    60
  typedef _Vector_base<_Tp, _Alloc> _Self;
williamr@4
    61
  _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
williamr@4
    62
  typedef typename _Alloc_traits<_Tp, _Alloc>::allocator_type allocator_type;
williamr@4
    63
  typedef _Tp* pointer;
williamr@4
    64
  typedef _STLP_alloc_proxy<pointer, _Tp, allocator_type> _AllocProxy;
williamr@4
    65
williamr@4
    66
  _Vector_base(const _Alloc& __a)
williamr@4
    67
    : _M_start(0), _M_finish(0), _M_end_of_storage(__a, 0) {}
williamr@4
    68
williamr@4
    69
  _Vector_base(size_t __n, const _Alloc& __a)
williamr@4
    70
    : _M_start(0), _M_finish(0), _M_end_of_storage(__a, 0) {
williamr@4
    71
    _M_start = _M_end_of_storage.allocate(__n, __n);
williamr@4
    72
    _M_finish = _M_start;
williamr@4
    73
    _M_end_of_storage._M_data = _M_start + __n;
williamr@4
    74
    _STLP_MPWFIX_TRY _STLP_MPWFIX_CATCH
williamr@4
    75
  }
williamr@4
    76
williamr@4
    77
  _Vector_base(__move_source<_Self> src)
williamr@4
    78
    : _M_start(src.get()._M_start), _M_finish(src.get()._M_finish),
williamr@4
    79
      _M_end_of_storage(__move_source<_AllocProxy>(src.get()._M_end_of_storage)) {
williamr@4
    80
    //Set the source as empty:
williamr@4
    81
    src.get()._M_finish = src.get()._M_end_of_storage._M_data = src.get()._M_start = 0;
williamr@4
    82
  }
williamr@4
    83
williamr@4
    84
  ~_Vector_base() {
williamr@4
    85
    if (_M_start != _STLP_DEFAULT_CONSTRUCTED(pointer))
williamr@4
    86
      _M_end_of_storage.deallocate(_M_start, _M_end_of_storage._M_data - _M_start);
williamr@4
    87
  }
williamr@4
    88
williamr@4
    89
protected:
williamr@4
    90
  void _STLP_FUNCTION_THROWS _M_throw_length_error() const;
williamr@4
    91
  void _STLP_FUNCTION_THROWS _M_throw_out_of_range() const;
williamr@4
    92
williamr@4
    93
  pointer _M_start;
williamr@4
    94
  pointer _M_finish;
williamr@4
    95
  _AllocProxy _M_end_of_storage;
williamr@4
    96
};
williamr@4
    97
williamr@4
    98
#if defined (_STLP_USE_PTR_SPECIALIZATIONS)
williamr@4
    99
#  define vector _STLP_PTR_IMPL_NAME(vector)
williamr@4
   100
#elif defined (_STLP_DEBUG)
williamr@4
   101
#  define vector _STLP_NON_DBG_NAME(vector)
williamr@4
   102
#else
williamr@4
   103
_STLP_MOVE_TO_STD_NAMESPACE
williamr@4
   104
#endif
williamr@4
   105
williamr@4
   106
template <class _Tp, _STLP_DEFAULT_ALLOCATOR_SELECT(_Tp) >
williamr@4
   107
class vector : protected _STLP_PRIV _Vector_base<_Tp, _Alloc>
williamr@4
   108
#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (vector)
williamr@4
   109
             , public __stlport_class<vector<_Tp, _Alloc> >
williamr@4
   110
#endif
williamr@4
   111
{
williamr@4
   112
private:
williamr@4
   113
  typedef _STLP_PRIV _Vector_base<_Tp, _Alloc> _Base;
williamr@4
   114
  typedef vector<_Tp, _Alloc> _Self;
williamr@4
   115
public:
williamr@4
   116
  _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
williamr@4
   117
  typedef typename _Base::allocator_type allocator_type;
williamr@4
   118
williamr@4
   119
  typedef _Tp value_type;
williamr@4
   120
  typedef value_type* pointer;
williamr@4
   121
  typedef const value_type* const_pointer;
williamr@4
   122
  typedef value_type* iterator;
williamr@4
   123
  typedef const value_type* const_iterator;
williamr@4
   124
williamr@4
   125
  typedef value_type& reference;
williamr@4
   126
  typedef const value_type& const_reference;
williamr@4
   127
  typedef size_t size_type;
williamr@4
   128
  typedef ptrdiff_t difference_type;
williamr@4
   129
  typedef random_access_iterator_tag _Iterator_category;
williamr@4
   130
williamr@4
   131
  _STLP_DECLARE_RANDOM_ACCESS_REVERSE_ITERATORS;
williamr@4
   132
williamr@4
   133
  allocator_type get_allocator() const
williamr@4
   134
  { return _STLP_CONVERT_ALLOCATOR((const allocator_type&)this->_M_end_of_storage, _Tp); }
williamr@4
   135
williamr@4
   136
private:
williamr@4
   137
  typedef typename __type_traits<_Tp>::has_trivial_assignment_operator _TrivialCopy;
williamr@4
   138
  typedef typename __type_traits<_Tp>::has_trivial_copy_constructor _TrivialUCopy;
williamr@4
   139
#if !defined (_STLP_NO_MOVE_SEMANTIC)
williamr@4
   140
  typedef typename __move_traits<_Tp>::implemented _Movable;
williamr@4
   141
#else
williamr@4
   142
  typedef __false_type _Movable;
williamr@4
   143
#endif
williamr@4
   144
williamr@4
   145
  // handles insertions on overflow
williamr@4
   146
  void _M_insert_overflow_aux(pointer __pos, const _Tp& __x, const __false_type& /*_Movable*/,
williamr@4
   147
                              size_type __fill_len, bool __atend);
williamr@4
   148
  void _M_insert_overflow_aux(pointer __pos, const _Tp& __x, const __true_type& /*_Movable*/,
williamr@4
   149
                              size_type __fill_len, bool __atend) {
williamr@4
   150
    //We need to take care of self referencing here:
williamr@4
   151
    if (_M_is_inside(__x)) {
williamr@4
   152
      value_type __x_copy = __x;
williamr@4
   153
      _M_insert_overflow_aux(__pos, __x_copy, __false_type(), __fill_len, __atend);
williamr@4
   154
      return;
williamr@4
   155
    }
williamr@4
   156
    _M_insert_overflow_aux(__pos, __x, __false_type(), __fill_len, __atend);
williamr@4
   157
  }
williamr@4
   158
williamr@4
   159
  void _M_insert_overflow(pointer __pos, const _Tp& __x, const __false_type& /*_TrivialCopy*/,
williamr@4
   160
                          size_type __fill_len, bool __atend = false)
williamr@4
   161
  { _M_insert_overflow_aux(__pos, __x, _Movable(), __fill_len, __atend); }
williamr@4
   162
  void _M_insert_overflow(pointer __pos, const _Tp& __x, const __true_type& /*_TrivialCopy*/,
williamr@4
   163
                          size_type __fill_len, bool __atend = false);
williamr@4
   164
  void _M_range_check(size_type __n) const {
williamr@4
   165
    if (__n >= size_type(this->_M_finish - this->_M_start))
williamr@4
   166
      this->_M_throw_out_of_range();
williamr@4
   167
  }
williamr@4
   168
williamr@4
   169
public:
williamr@4
   170
  iterator begin()             { return this->_M_start; }
williamr@4
   171
  const_iterator begin() const { return this->_M_start; }
williamr@4
   172
  iterator end()               { return this->_M_finish; }
williamr@4
   173
  const_iterator end() const   { return this->_M_finish; }
williamr@4
   174
williamr@4
   175
  reverse_iterator rbegin()              { return reverse_iterator(end()); }
williamr@4
   176
  const_reverse_iterator rbegin() const  { return const_reverse_iterator(end()); }
williamr@4
   177
  reverse_iterator rend()                { return reverse_iterator(begin()); }
williamr@4
   178
  const_reverse_iterator rend() const    { return const_reverse_iterator(begin()); }
williamr@4
   179
williamr@4
   180
  size_type size() const        { return size_type(this->_M_finish - this->_M_start); }
williamr@4
   181
  size_type max_size() const {
williamr@4
   182
    size_type __vector_max_size = size_type(-1) / sizeof(_Tp);
williamr@4
   183
    typename allocator_type::size_type __alloc_max_size = this->_M_end_of_storage.max_size();
williamr@4
   184
    return (__alloc_max_size < __vector_max_size)?__alloc_max_size:__vector_max_size;
williamr@4
   185
  }
williamr@4
   186
williamr@4
   187
  size_type capacity() const    { return size_type(this->_M_end_of_storage._M_data - this->_M_start); }
williamr@4
   188
  bool empty() const            { return this->_M_start == this->_M_finish; }
williamr@4
   189
williamr@4
   190
  reference operator[](size_type __n) { return *(begin() + __n); }
williamr@4
   191
  const_reference operator[](size_type __n) const { return *(begin() + __n); }
williamr@4
   192
williamr@4
   193
  reference front()             { return *begin(); }
williamr@4
   194
  const_reference front() const { return *begin(); }
williamr@4
   195
  reference back()              { return *(end() - 1); }
williamr@4
   196
  const_reference back() const  { return *(end() - 1); }
williamr@4
   197
williamr@4
   198
  reference at(size_type __n) { _M_range_check(__n); return (*this)[__n]; }
williamr@4
   199
  const_reference at(size_type __n) const { _M_range_check(__n); return (*this)[__n]; }
williamr@4
   200
williamr@4
   201
#if !defined (_STLP_DONT_SUP_DFLT_PARAM)
williamr@4
   202
  explicit vector(const allocator_type& __a = allocator_type())
williamr@4
   203
#else
williamr@4
   204
  vector()
williamr@4
   205
    : _STLP_PRIV _Vector_base<_Tp, _Alloc>(allocator_type()) {}
williamr@4
   206
  vector(const allocator_type& __a)
williamr@4
   207
#endif
williamr@4
   208
    : _STLP_PRIV _Vector_base<_Tp, _Alloc>(__a) {}
williamr@4
   209
williamr@4
   210
#if !defined (_STLP_DONT_SUP_DFLT_PARAM)
williamr@4
   211
private:
williamr@4
   212
  //We always call _M_initialize with only 1 parameter. Default parameter
williamr@4
   213
  //is used to allow explicit instanciation of vector with types with no
williamr@4
   214
  //default constructor.
williamr@4
   215
  void _M_initialize(size_type __n, const _Tp& __val = _STLP_DEFAULT_CONSTRUCTED(_Tp))
williamr@4
   216
  { this->_M_finish = _STLP_PRIV __uninitialized_init(this->_M_start, __n, __val); }
williamr@4
   217
public:
williamr@4
   218
  explicit vector(size_type __n)
williamr@4
   219
    : _STLP_PRIV _Vector_base<_Tp, _Alloc>(__n, allocator_type())
williamr@4
   220
  { _M_initialize(__n); }
williamr@4
   221
  vector(size_type __n, const _Tp& __val, const allocator_type& __a = allocator_type())
williamr@4
   222
#else
williamr@4
   223
  explicit vector(size_type __n)
williamr@4
   224
    : _STLP_PRIV _Vector_base<_Tp, _Alloc>(__n, allocator_type())
williamr@4
   225
  { this->_M_finish = _STLP_PRIV __uninitialized_init(this->_M_start, __n, _STLP_DEFAULT_CONSTRUCTED(_Tp)); }
williamr@4
   226
  vector(size_type __n, const _Tp& __val)
williamr@4
   227
    : _STLP_PRIV _Vector_base<_Tp, _Alloc>(__n, allocator_type())
williamr@4
   228
  { this->_M_finish = _STLP_PRIV __uninitialized_fill_n(this->_M_start, __n, __val); }
williamr@4
   229
  vector(size_type __n, const _Tp& __val, const allocator_type& __a)
williamr@4
   230
#endif
williamr@4
   231
    : _STLP_PRIV _Vector_base<_Tp, _Alloc>(__n, __a)
williamr@4
   232
  { this->_M_finish = _STLP_PRIV __uninitialized_fill_n(this->_M_start, __n, __val); }
williamr@4
   233
williamr@4
   234
  vector(const _Self& __x)
williamr@4
   235
    : _STLP_PRIV _Vector_base<_Tp, _Alloc>(__x.size(), __x.get_allocator())
williamr@4
   236
  { this->_M_finish = _STLP_PRIV __ucopy_ptrs(__x.begin(), __x.end(), this->_M_start, _TrivialUCopy()); }
williamr@4
   237
williamr@4
   238
  vector(__move_source<_Self> src)
williamr@4
   239
    : _STLP_PRIV _Vector_base<_Tp, _Alloc>(__move_source<_Base>(src.get()))
williamr@4
   240
  {}
williamr@4
   241
williamr@4
   242
#if defined (_STLP_MEMBER_TEMPLATES)
williamr@4
   243
private:
williamr@4
   244
  template <class _Integer>
williamr@4
   245
  void _M_initialize_aux(_Integer __n, _Integer __val,
williamr@4
   246
                         const __true_type& /*_IsIntegral*/) {
williamr@4
   247
    size_type __real_n;
williamr@4
   248
    this->_M_start = this->_M_end_of_storage.allocate(__n, __real_n);
williamr@4
   249
    this->_M_end_of_storage._M_data = this->_M_start + __real_n;
williamr@4
   250
    this->_M_finish = _STLP_PRIV __uninitialized_fill_n(this->_M_start, __n, __val);
williamr@4
   251
  }
williamr@4
   252
williamr@4
   253
  template <class _InputIterator>
williamr@4
   254
  void _M_initialize_aux(_InputIterator __first, _InputIterator __last,
williamr@4
   255
                         const __false_type& /*_IsIntegral*/)
williamr@4
   256
  { _M_range_initialize(__first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIterator)); }
williamr@4
   257
williamr@4
   258
public:
williamr@4
   259
  // Check whether it's an integral type.  If so, it's not an iterator.
williamr@4
   260
  template <class _InputIterator>
williamr@4
   261
  vector(_InputIterator __first, _InputIterator __last,
williamr@4
   262
               const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL )
williamr@4
   263
    : _STLP_PRIV _Vector_base<_Tp, _Alloc>(__a) {
williamr@4
   264
    typedef typename _IsIntegral<_InputIterator>::_Ret _Integral;
williamr@4
   265
    _M_initialize_aux(__first, __last, _Integral());
williamr@4
   266
  }
williamr@4
   267
williamr@4
   268
#  if defined (_STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS)
williamr@4
   269
  template <class _InputIterator>
williamr@4
   270
  vector(_InputIterator __first, _InputIterator __last)
williamr@4
   271
    : _STLP_PRIV _Vector_base<_Tp, _Alloc>(allocator_type()) {
williamr@4
   272
    typedef typename _IsIntegral<_InputIterator>::_Ret _Integral;
williamr@4
   273
    _M_initialize_aux(__first, __last, _Integral());
williamr@4
   274
  }
williamr@4
   275
#  endif /* _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS */
williamr@4
   276
williamr@4
   277
#else /* _STLP_MEMBER_TEMPLATES */
williamr@4
   278
  vector(const _Tp* __first, const _Tp* __last,
williamr@4
   279
         const allocator_type& __a = allocator_type())
williamr@4
   280
    : _STLP_PRIV _Vector_base<_Tp, _Alloc>(__last - __first, __a)
williamr@4
   281
  { this->_M_finish = _STLP_PRIV __ucopy_ptrs(__first, __last, this->_M_start, _TrivialUCopy()); }
williamr@4
   282
#endif /* _STLP_MEMBER_TEMPLATES */
williamr@4
   283
williamr@4
   284
  //As the vector container is a back insert oriented container it
williamr@4
   285
  //seems rather logical to destroy elements in reverse order.
williamr@4
   286
  ~vector() { _STLP_STD::_Destroy_Range(rbegin(), rend()); }
williamr@4
   287
williamr@4
   288
  _Self& operator=(const _Self& __x);
williamr@4
   289
williamr@4
   290
  void reserve(size_type __n);
williamr@4
   291
williamr@4
   292
  // assign(), a generalized assignment member function.  Two
williamr@4
   293
  // versions: one that takes a count, and one that takes a range.
williamr@4
   294
  // The range version is a member template, so we dispatch on whether
williamr@4
   295
  // or not the type is an integer.
williamr@4
   296
williamr@4
   297
  void assign(size_type __n, const _Tp& __val) { _M_fill_assign(__n, __val); }
williamr@4
   298
  void _M_fill_assign(size_type __n, const _Tp& __val);
williamr@4
   299
williamr@4
   300
#if defined (_STLP_MEMBER_TEMPLATES)
williamr@4
   301
  template <class _ForwardIter>
williamr@4
   302
  void _M_assign_aux(_ForwardIter __first, _ForwardIter __last, const forward_iterator_tag &) {
williamr@4
   303
#else
williamr@4
   304
  void assign(const_iterator __first, const_iterator __last) {
williamr@4
   305
    typedef const_iterator _ForwardIter;
williamr@4
   306
#endif
williamr@4
   307
    const size_type __len = distance(__first, __last);
williamr@4
   308
    if (__len > capacity()) {
williamr@4
   309
      size_type __n = __len;
williamr@4
   310
      iterator __tmp = _M_allocate_and_copy(__n, __first, __last);
williamr@4
   311
      _M_clear();
williamr@4
   312
      _M_set(__tmp, __tmp + __len, __tmp + __n);
williamr@4
   313
    }
williamr@4
   314
    else if (size() >= __len) {
williamr@4
   315
      iterator __new_finish = copy(__first, __last, this->_M_start);
williamr@4
   316
      _STLP_STD::_Destroy_Range(__new_finish, this->_M_finish);
williamr@4
   317
      this->_M_finish = __new_finish;
williamr@4
   318
    }
williamr@4
   319
    else {
williamr@4
   320
      _ForwardIter __mid = __first;
williamr@4
   321
      advance(__mid, size());
williamr@4
   322
      copy(__first, __mid, this->_M_start);
williamr@4
   323
      this->_M_finish = uninitialized_copy(__mid, __last, this->_M_finish);
williamr@4
   324
    }
williamr@4
   325
  }
williamr@4
   326
williamr@4
   327
#if defined (_STLP_MEMBER_TEMPLATES)
williamr@4
   328
  template <class _InputIter>
williamr@4
   329
  void _M_assign_aux(_InputIter __first, _InputIter __last,
williamr@4
   330
                     const input_iterator_tag &) {
williamr@4
   331
    iterator __cur = begin();
williamr@4
   332
    for ( ; __first != __last && __cur != end(); ++__cur, ++__first)
williamr@4
   333
      *__cur = *__first;
williamr@4
   334
    if (__first == __last)
williamr@4
   335
      erase(__cur, end());
williamr@4
   336
    else
williamr@4
   337
      insert(end(), __first, __last);
williamr@4
   338
  }
williamr@4
   339
williamr@4
   340
  template <class _Integer>
williamr@4
   341
  void _M_assign_dispatch(_Integer __n, _Integer __val,
williamr@4
   342
                          const __true_type& /*_IsIntegral*/)
williamr@4
   343
  { _M_fill_assign(__n, __val); }
williamr@4
   344
williamr@4
   345
  template <class _InputIter>
williamr@4
   346
  void _M_assign_dispatch(_InputIter __first, _InputIter __last,
williamr@4
   347
                          const __false_type& /*_IsIntegral*/)
williamr@4
   348
  { _M_assign_aux(__first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIter)); }
williamr@4
   349
williamr@4
   350
  template <class _InputIterator>
williamr@4
   351
  void assign(_InputIterator __first, _InputIterator __last) {
williamr@4
   352
    typedef typename _IsIntegral<_InputIterator>::_Ret _Integral;
williamr@4
   353
    _M_assign_dispatch(__first, __last, _Integral());
williamr@4
   354
  }
williamr@4
   355
#endif /* _STLP_MEMBER_TEMPLATES */
williamr@4
   356
williamr@4
   357
#if !defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
williamr@4
   358
  void push_back(const _Tp& __x = _STLP_DEFAULT_CONSTRUCTED(_Tp)) {
williamr@4
   359
#else
williamr@4
   360
  void push_back(const _Tp& __x) {
williamr@4
   361
#endif /*!_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/
williamr@4
   362
    if (this->_M_finish != this->_M_end_of_storage._M_data) {
williamr@4
   363
      _Copy_Construct(this->_M_finish, __x);
williamr@4
   364
      ++this->_M_finish;
williamr@4
   365
    }
williamr@4
   366
    else
williamr@4
   367
      _M_insert_overflow(this->_M_finish, __x, _TrivialCopy(), 1UL, true);
williamr@4
   368
  }
williamr@4
   369
williamr@4
   370
#if !defined(_STLP_DONT_SUP_DFLT_PARAM) && !defined(_STLP_NO_ANACHRONISMS)
williamr@4
   371
  iterator insert(iterator __pos, const _Tp& __x = _STLP_DEFAULT_CONSTRUCTED(_Tp));
williamr@4
   372
#else
williamr@4
   373
  iterator insert(iterator __pos, const _Tp& __x);
williamr@4
   374
#endif /*!_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/
williamr@4
   375
williamr@4
   376
#if defined(_STLP_DONT_SUP_DFLT_PARAM) && !defined(_STLP_NO_ANACHRONISMS)
williamr@4
   377
  void push_back() { push_back(_STLP_DEFAULT_CONSTRUCTED(_Tp)); }
williamr@4
   378
  iterator insert(iterator __pos) { return insert(__pos, _STLP_DEFAULT_CONSTRUCTED(_Tp)); }
williamr@4
   379
#endif /*_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/
williamr@4
   380
williamr@4
   381
  void swap(_Self& __x) {
williamr@4
   382
    _STLP_STD::swap(this->_M_start, __x._M_start);
williamr@4
   383
    _STLP_STD::swap(this->_M_finish, __x._M_finish);
williamr@4
   384
    this->_M_end_of_storage.swap(__x._M_end_of_storage);
williamr@4
   385
  }
williamr@4
   386
williamr@4
   387
private:
williamr@4
   388
  void _M_fill_insert_aux (iterator __pos, size_type __n, const _Tp& __x, const __true_type& /*_Movable*/);
williamr@4
   389
  void _M_fill_insert_aux (iterator __pos, size_type __n, const _Tp& __x, const __false_type& /*_Movable*/);
williamr@4
   390
  void _M_fill_insert (iterator __pos, size_type __n, const _Tp& __x);
williamr@4
   391
williamr@4
   392
  bool _M_is_inside(const value_type& __x) const {
williamr@4
   393
    return (&__x >= this->_M_start && &__x < this->_M_finish);
williamr@4
   394
  }
williamr@4
   395
williamr@4
   396
#if defined (_STLP_MEMBER_TEMPLATES)
williamr@4
   397
  template <class _ForwardIterator>
williamr@4
   398
  void _M_range_insert_realloc(iterator __pos,
williamr@4
   399
                               _ForwardIterator __first, _ForwardIterator __last,
williamr@4
   400
#else
williamr@4
   401
  void _M_range_insert_realloc(iterator __pos,
williamr@4
   402
                               const_iterator __first, const_iterator __last,
williamr@4
   403
#endif /* _STLP_MEMBER_TEMPLATES */
williamr@4
   404
                               size_type __n) {
williamr@4
   405
    const size_type __old_size = size();
williamr@4
   406
    size_type __len = __old_size + (max)(__old_size, __n);
williamr@4
   407
    pointer __new_start = this->_M_end_of_storage.allocate(__len, __len);
williamr@4
   408
    pointer __new_finish = __new_start;
williamr@4
   409
    _STLP_TRY {
williamr@4
   410
      __new_finish = _STLP_PRIV __uninitialized_move(this->_M_start, __pos, __new_start, _TrivialUCopy(), _Movable());
williamr@4
   411
      __new_finish = uninitialized_copy(__first, __last, __new_finish);
williamr@4
   412
      __new_finish = _STLP_PRIV __uninitialized_move(__pos, this->_M_finish, __new_finish, _TrivialUCopy(), _Movable());
williamr@4
   413
    }
williamr@4
   414
    _STLP_UNWIND((_STLP_STD::_Destroy_Range(__new_start,__new_finish),
williamr@4
   415
                  this->_M_end_of_storage.deallocate(__new_start,__len)))
williamr@4
   416
    _M_clear_after_move();
williamr@4
   417
    _M_set(__new_start, __new_finish, __new_start + __len);
williamr@4
   418
  }
williamr@4
   419
williamr@4
   420
#if defined (_STLP_MEMBER_TEMPLATES)
williamr@4
   421
  template <class _ForwardIterator>
williamr@4
   422
  void _M_range_insert_aux(iterator __pos,
williamr@4
   423
                           _ForwardIterator __first, _ForwardIterator __last,
williamr@4
   424
#else
williamr@4
   425
  void _M_range_insert_aux(iterator __pos,
williamr@4
   426
                           const_iterator __first, const_iterator __last,
williamr@4
   427
#endif /* _STLP_MEMBER_TEMPLATES */
williamr@4
   428
                           size_type __n, const __true_type& /*_Movable*/) {
williamr@4
   429
    iterator __src = this->_M_finish - 1;
williamr@4
   430
    iterator __dst = __src + __n;
williamr@4
   431
    for (; __src >= __pos; --__dst, --__src) {
williamr@4
   432
      _STLP_STD::_Move_Construct(__dst, *__src);
williamr@4
   433
      _STLP_STD::_Destroy_Moved(__src);
williamr@4
   434
    }
williamr@4
   435
    uninitialized_copy(__first, __last, __pos);
williamr@4
   436
    this->_M_finish += __n;
williamr@4
   437
  }
williamr@4
   438
williamr@4
   439
#if defined (_STLP_MEMBER_TEMPLATES)
williamr@4
   440
  template <class _ForwardIterator>
williamr@4
   441
  void _M_range_insert_aux(iterator __pos,
williamr@4
   442
                           _ForwardIterator __first, _ForwardIterator __last,
williamr@4
   443
#else
williamr@4
   444
  void _M_range_insert_aux(iterator __pos,
williamr@4
   445
                           const_iterator __first, const_iterator __last,
williamr@4
   446
#endif /* _STLP_MEMBER_TEMPLATES */
williamr@4
   447
                           size_type __n, const __false_type& /*_Movable*/) {
williamr@4
   448
    const size_type __elems_after = this->_M_finish - __pos;
williamr@4
   449
    pointer __old_finish = this->_M_finish;
williamr@4
   450
    if (__elems_after > __n) {
williamr@4
   451
      _STLP_PRIV __ucopy_ptrs(this->_M_finish - __n, this->_M_finish, this->_M_finish, _TrivialUCopy());
williamr@4
   452
      this->_M_finish += __n;
williamr@4
   453
      _STLP_PRIV __copy_backward_ptrs(__pos, __old_finish - __n, __old_finish, _TrivialCopy());
williamr@4
   454
      copy(__first, __last, __pos);
williamr@4
   455
    }
williamr@4
   456
    else {
williamr@4
   457
#if defined ( _STLP_MEMBER_TEMPLATES )
williamr@4
   458
      _ForwardIterator __mid = __first;
williamr@4
   459
      advance(__mid, __elems_after);
williamr@4
   460
#else
williamr@4
   461
      const_pointer __mid = __first + __elems_after;
williamr@4
   462
#endif
williamr@4
   463
      uninitialized_copy(__mid, __last, this->_M_finish);
williamr@4
   464
      this->_M_finish += __n - __elems_after;
williamr@4
   465
      _STLP_PRIV __ucopy_ptrs(__pos, __old_finish, this->_M_finish, _TrivialUCopy());
williamr@4
   466
      this->_M_finish += __elems_after;
williamr@4
   467
      copy(__first, __mid, __pos);
williamr@4
   468
    } /* elems_after */
williamr@4
   469
  }
williamr@4
   470
williamr@4
   471
williamr@4
   472
#if defined (_STLP_MEMBER_TEMPLATES)
williamr@4
   473
  template <class _Integer>
williamr@4
   474
  void _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __val,
williamr@4
   475
                          const __true_type&)
williamr@4
   476
  { _M_fill_insert(__pos, (size_type) __n, (_Tp) __val); }
williamr@4
   477
williamr@4
   478
  template <class _InputIterator>
williamr@4
   479
  void _M_insert_dispatch(iterator __pos,
williamr@4
   480
                          _InputIterator __first, _InputIterator __last,
williamr@4
   481
                          const __false_type&)
williamr@4
   482
  { _M_range_insert(__pos, __first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIterator)); }
williamr@4
   483
williamr@4
   484
public:
williamr@4
   485
  // Check whether it's an integral type.  If so, it's not an iterator.
williamr@4
   486
  template <class _InputIterator>
williamr@4
   487
  void insert(iterator __pos, _InputIterator __first, _InputIterator __last) {
williamr@4
   488
    typedef typename _IsIntegral<_InputIterator>::_Ret _Integral;
williamr@4
   489
    _M_insert_dispatch(__pos, __first, __last, _Integral());
williamr@4
   490
  }
williamr@4
   491
williamr@4
   492
private:
williamr@4
   493
  template <class _InputIterator>
williamr@4
   494
  void _M_range_insert(iterator __pos,
williamr@4
   495
                       _InputIterator __first, _InputIterator __last,
williamr@4
   496
                       const input_iterator_tag &) {
williamr@4
   497
    for ( ; __first != __last; ++__first) {
williamr@4
   498
      __pos = insert(__pos, *__first);
williamr@4
   499
      ++__pos;
williamr@4
   500
    }
williamr@4
   501
  }
williamr@4
   502
williamr@4
   503
  template <class _ForwardIterator>
williamr@4
   504
  void _M_range_insert(iterator __pos,
williamr@4
   505
                       _ForwardIterator __first, _ForwardIterator __last,
williamr@4
   506
                       const forward_iterator_tag &) {
williamr@4
   507
#else /* _STLP_MEMBER_TEMPLATES */
williamr@4
   508
public:
williamr@4
   509
  void insert(iterator __pos,
williamr@4
   510
              const_iterator __first, const_iterator __last) {
williamr@4
   511
#endif /* _STLP_MEMBER_TEMPLATES */
williamr@4
   512
    /* This method do not check self referencing.
williamr@4
   513
     * Standard forbids it, checked by the debug mode.
williamr@4
   514
     */
williamr@4
   515
    if (__first != __last) {
williamr@4
   516
      size_type __n = distance(__first, __last);
williamr@4
   517
williamr@4
   518
      if (size_type(this->_M_end_of_storage._M_data - this->_M_finish) >= __n) {
williamr@4
   519
        _M_range_insert_aux(__pos, __first, __last, __n, _Movable());
williamr@4
   520
      }
williamr@4
   521
      else {
williamr@4
   522
        _M_range_insert_realloc(__pos, __first, __last, __n);
williamr@4
   523
      }
williamr@4
   524
    }
williamr@4
   525
  }
williamr@4
   526
williamr@4
   527
public:
williamr@4
   528
  void insert (iterator __pos, size_type __n, const _Tp& __x)
williamr@4
   529
  { _M_fill_insert(__pos, __n, __x); }
williamr@4
   530
williamr@4
   531
  void pop_back() {
williamr@4
   532
    --this->_M_finish;
williamr@4
   533
    _STLP_STD::_Destroy(this->_M_finish);
williamr@4
   534
  }
williamr@4
   535
williamr@4
   536
private:
williamr@4
   537
  iterator _M_erase(iterator __pos, const __true_type& /*_Movable*/) {
williamr@4
   538
    _STLP_STD::_Destroy(__pos);
williamr@4
   539
    iterator __dst = __pos, __src = __dst + 1;
williamr@4
   540
    iterator __end = end();
williamr@4
   541
    for (; __src != __end; ++__dst, ++__src) {
williamr@4
   542
      _STLP_STD::_Move_Construct(__dst, *__src);
williamr@4
   543
      _STLP_STD::_Destroy_Moved(__src);
williamr@4
   544
    }
williamr@4
   545
    this->_M_finish = __dst;
williamr@4
   546
    return __pos;
williamr@4
   547
  }
williamr@4
   548
  iterator _M_erase(iterator __pos, const __false_type& /*_Movable*/) {
williamr@4
   549
    if (__pos + 1 != end())
williamr@4
   550
      _STLP_PRIV __copy_ptrs(__pos + 1, this->_M_finish, __pos, _TrivialCopy());
williamr@4
   551
    --this->_M_finish;
williamr@4
   552
    _STLP_STD::_Destroy(this->_M_finish);
williamr@4
   553
    return __pos;
williamr@4
   554
  }
williamr@4
   555
  iterator _M_erase(iterator __first, iterator __last, const __true_type& /*_Movable*/) {
williamr@4
   556
    iterator __dst = __first, __src = __last;
williamr@4
   557
    iterator __end = end();
williamr@4
   558
    for (; __dst != __last && __src != __end; ++__dst, ++__src) {
williamr@4
   559
      _STLP_STD::_Destroy(__dst);
williamr@4
   560
      _STLP_STD::_Move_Construct(__dst, *__src);
williamr@4
   561
    }
williamr@4
   562
    if (__dst != __last) {
williamr@4
   563
      //There is more elements to erase than element to move:
williamr@4
   564
      _STLP_STD::_Destroy_Range(__dst, __last);
williamr@4
   565
      _STLP_STD::_Destroy_Moved_Range(__last, __end);
williamr@4
   566
    }
williamr@4
   567
    else {
williamr@4
   568
      //There is more element to move than element to erase:
williamr@4
   569
      for (; __src != __end; ++__dst, ++__src) {
williamr@4
   570
        _STLP_STD::_Destroy_Moved(__dst);
williamr@4
   571
        _STLP_STD::_Move_Construct(__dst, *__src);
williamr@4
   572
      }
williamr@4
   573
      _STLP_STD::_Destroy_Moved_Range(__dst, __end);
williamr@4
   574
    }
williamr@4
   575
    this->_M_finish = __dst;
williamr@4
   576
    return __first;
williamr@4
   577
  }
williamr@4
   578
  iterator _M_erase(iterator __first, iterator __last, const __false_type& /*_Movable*/) {
williamr@4
   579
    pointer __i = _STLP_PRIV __copy_ptrs(__last, this->_M_finish, __first, _TrivialCopy());
williamr@4
   580
    _STLP_STD::_Destroy_Range(__i, this->_M_finish);
williamr@4
   581
    this->_M_finish = __i;
williamr@4
   582
    return __first;
williamr@4
   583
  }
williamr@4
   584
williamr@4
   585
public:
williamr@4
   586
  iterator erase(iterator __pos) {
williamr@4
   587
    return _M_erase(__pos, _Movable());
williamr@4
   588
  }
williamr@4
   589
  iterator erase(iterator __first, iterator __last) {
williamr@4
   590
    if (__first == __last)
williamr@4
   591
      return __first;
williamr@4
   592
    return _M_erase(__first, __last, _Movable());
williamr@4
   593
  }
williamr@4
   594
williamr@4
   595
#if !defined (_STLP_DONT_SUP_DFLT_PARAM)
williamr@4
   596
  void resize(size_type __new_size, const _Tp& __x = _STLP_DEFAULT_CONSTRUCTED(_Tp)) {
williamr@4
   597
#else
williamr@4
   598
  void resize(size_type __new_size, const _Tp& __x) {
williamr@4
   599
#endif /*_STLP_DONT_SUP_DFLT_PARAM*/
williamr@4
   600
    if (__new_size < size())
williamr@4
   601
      erase(begin() + __new_size, end());
williamr@4
   602
    else
williamr@4
   603
      insert(end(), __new_size - size(), __x);
williamr@4
   604
  }
williamr@4
   605
williamr@4
   606
#if defined (_STLP_DONT_SUP_DFLT_PARAM)
williamr@4
   607
  void resize(size_type __new_size) { resize(__new_size, _STLP_DEFAULT_CONSTRUCTED(_Tp)); }
williamr@4
   608
#endif /*_STLP_DONT_SUP_DFLT_PARAM*/
williamr@4
   609
williamr@4
   610
  void clear() {
williamr@4
   611
    erase(begin(), end());
williamr@4
   612
  }
williamr@4
   613
williamr@4
   614
private:
williamr@4
   615
  void _M_clear() {
williamr@4
   616
    _STLP_STD::_Destroy_Range(rbegin(), rend());
williamr@4
   617
    this->_M_end_of_storage.deallocate(this->_M_start, this->_M_end_of_storage._M_data - this->_M_start);
williamr@4
   618
  }
williamr@4
   619
williamr@4
   620
  void _M_clear_after_move() {
williamr@4
   621
    _STLP_STD::_Destroy_Moved_Range(rbegin(), rend());
williamr@4
   622
    this->_M_end_of_storage.deallocate(this->_M_start, this->_M_end_of_storage._M_data - this->_M_start);
williamr@4
   623
  }
williamr@4
   624
williamr@4
   625
  void _M_set(pointer __s, pointer __f, pointer __e) {
williamr@4
   626
    this->_M_start = __s;
williamr@4
   627
    this->_M_finish = __f;
williamr@4
   628
    this->_M_end_of_storage._M_data = __e;
williamr@4
   629
  }
williamr@4
   630
williamr@4
   631
#if defined (_STLP_MEMBER_TEMPLATES)
williamr@4
   632
  template <class _ForwardIterator>
williamr@4
   633
  pointer _M_allocate_and_copy(size_type& __n,
williamr@4
   634
                               _ForwardIterator __first, _ForwardIterator __last)
williamr@4
   635
#else /* _STLP_MEMBER_TEMPLATES */
williamr@4
   636
  pointer _M_allocate_and_copy(size_type& __n,
williamr@4
   637
                               const_pointer __first, const_pointer __last)
williamr@4
   638
#endif /* _STLP_MEMBER_TEMPLATES */
williamr@4
   639
  {
williamr@4
   640
    pointer __result = this->_M_end_of_storage.allocate(__n, __n);
williamr@4
   641
    _STLP_TRY {
williamr@4
   642
      uninitialized_copy(__first, __last, __result);
williamr@4
   643
      return __result;
williamr@4
   644
    }
williamr@4
   645
    _STLP_UNWIND(this->_M_end_of_storage.deallocate(__result, __n))
williamr@4
   646
    _STLP_RET_AFTER_THROW(__result)
williamr@4
   647
  }
williamr@4
   648
williamr@4
   649
williamr@4
   650
#if defined (_STLP_MEMBER_TEMPLATES)
williamr@4
   651
  template <class _InputIterator>
williamr@4
   652
  void _M_range_initialize(_InputIterator __first, _InputIterator __last,
williamr@4
   653
                           const input_iterator_tag &) {
williamr@4
   654
    for ( ; __first != __last; ++__first)
williamr@4
   655
      push_back(*__first);
williamr@4
   656
  }
williamr@4
   657
  // This function is only called by the constructor.
williamr@4
   658
  template <class _ForwardIterator>
williamr@4
   659
  void _M_range_initialize(_ForwardIterator __first, _ForwardIterator __last,
williamr@4
   660
                           const forward_iterator_tag &) {
williamr@4
   661
    size_type __n = distance(__first, __last);
williamr@4
   662
    this->_M_start = this->_M_end_of_storage.allocate(__n, __n);
williamr@4
   663
    this->_M_end_of_storage._M_data = this->_M_start + __n;
williamr@4
   664
    this->_M_finish = uninitialized_copy(__first, __last, this->_M_start);
williamr@4
   665
  }
williamr@4
   666
#endif /* _STLP_MEMBER_TEMPLATES */
williamr@4
   667
};
williamr@4
   668
williamr@4
   669
#if defined (vector)
williamr@4
   670
#  undef vector
williamr@4
   671
_STLP_MOVE_TO_STD_NAMESPACE
williamr@4
   672
#endif
williamr@4
   673
williamr@4
   674
_STLP_END_NAMESPACE
williamr@4
   675
williamr@4
   676
#if !defined (_STLP_LINK_TIME_INSTANTIATION)
williamr@4
   677
#  include <stl/_vector.c>
williamr@4
   678
#endif
williamr@4
   679
williamr@4
   680
#if defined (_STLP_USE_PTR_SPECIALIZATIONS)
williamr@4
   681
#  include <stl/pointers/_vector.h>
williamr@4
   682
#endif
williamr@4
   683
williamr@4
   684
//We define the bool specialization before the debug interfave
williamr@4
   685
//to benefit of the debug version of vector even for the bool
williamr@4
   686
//specialization.
williamr@4
   687
#if !defined (_STLP_NO_BOOL) || !defined (_STLP_NO_EXTENSIONS)
williamr@4
   688
#  if !defined (_STLP_INTERNAL_BVECTOR_H)
williamr@4
   689
#    include <stl/_bvector.h>
williamr@4
   690
#  endif
williamr@4
   691
#endif
williamr@4
   692
williamr@4
   693
#if defined (_STLP_DEBUG)
williamr@4
   694
#  include <stl/debug/_vector.h>
williamr@4
   695
#endif
williamr@4
   696
williamr@4
   697
_STLP_BEGIN_NAMESPACE
williamr@4
   698
williamr@4
   699
#if !defined (_STLP_NO_BOOL) && !defined (_STLP_NO_EXTENSIONS)
williamr@4
   700
// This typedef is non-standard.  It is provided for backward compatibility.
williamr@4
   701
typedef vector<bool, allocator<bool> > bit_vector;
williamr@4
   702
#endif
williamr@4
   703
williamr@4
   704
#define _STLP_TEMPLATE_HEADER template <class _Tp, class _Alloc>
williamr@4
   705
#define _STLP_TEMPLATE_CONTAINER vector<_Tp, _Alloc>
williamr@4
   706
#include <stl/_relops_cont.h>
williamr@4
   707
#undef _STLP_TEMPLATE_CONTAINER
williamr@4
   708
#undef _STLP_TEMPLATE_HEADER
williamr@4
   709
williamr@4
   710
#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
williamr@4
   711
template <class _Tp, class _Alloc>
williamr@4
   712
struct __move_traits<vector<_Tp, _Alloc> > {
williamr@4
   713
  typedef __stlp_movable implemented;
williamr@4
   714
  typedef typename __move_traits<_Alloc>::complete complete;
williamr@4
   715
#if defined (__BORLANDC__) && (__BORLANDC__ < 0x560)
williamr@4
   716
  // disable incorrect "dependent type qualifier" error
williamr@4
   717
  typedef __false_type _Ret;
williamr@4
   718
#endif
williamr@4
   719
};
williamr@4
   720
williamr@4
   721
#  if !defined (_STLP_DEBUG)
williamr@4
   722
template <class _Tp, class _Alloc>
williamr@4
   723
struct _DefaultZeroValue<vector<_Tp, _Alloc> >
williamr@4
   724
{ typedef typename __type_traits<_Alloc>::has_trivial_default_constructor _Ret; };
williamr@4
   725
#  endif
williamr@4
   726
williamr@4
   727
#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
williamr@4
   728
williamr@4
   729
_STLP_END_NAMESPACE
williamr@4
   730
williamr@4
   731
#endif /* _STLP_VECTOR_H */
williamr@4
   732
williamr@4
   733
// Local Variables:
williamr@4
   734
// mode:C++
williamr@4
   735
// End: