epoc32/include/stdapis/stlportv5/stl/_list.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_LIST_IMPL_H
williamr@4
    31
#define _STLP_INTERNAL_LIST_IMPL_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_CONSTRUCT_H
williamr@4
    46
#  include <stl/_construct.h>
williamr@4
    47
#endif
williamr@4
    48
williamr@4
    49
#ifndef _STLP_INTERNAL_FUNCTION_BASE_H
williamr@4
    50
#  include <stl/_function_base.h>
williamr@4
    51
#endif
williamr@4
    52
williamr@4
    53
_STLP_BEGIN_NAMESPACE
williamr@4
    54
williamr@4
    55
_STLP_MOVE_TO_PRIV_NAMESPACE
williamr@4
    56
williamr@4
    57
struct _List_node_base {
williamr@4
    58
  _List_node_base* _M_next;
williamr@4
    59
  _List_node_base* _M_prev;
williamr@4
    60
};
williamr@4
    61
williamr@4
    62
template <class _Dummy>
williamr@4
    63
class _List_global {
williamr@4
    64
public:
williamr@4
    65
  typedef _List_node_base _Node_base;
williamr@4
    66
  static void  _STLP_CALL _Transfer(_Node_base* __pos,
williamr@4
    67
                                    _Node_base* __first, _Node_base* __last);
williamr@4
    68
};
williamr@4
    69
williamr@4
    70
#if defined (_STLP_USE_TEMPLATE_EXPORT)
williamr@4
    71
_STLP_EXPORT_TEMPLATE_CLASS _List_global<bool>;
williamr@4
    72
#endif
williamr@4
    73
typedef _List_global<bool> _List_global_inst;
williamr@4
    74
williamr@4
    75
template <class _Tp>
williamr@4
    76
class _List_node : public _List_node_base {
williamr@4
    77
public:
williamr@4
    78
  _Tp _M_data;
williamr@4
    79
  __TRIVIAL_STUFF(_List_node)
williamr@4
    80
};
williamr@4
    81
williamr@4
    82
struct _List_iterator_base {
williamr@4
    83
  typedef size_t                     size_type;
williamr@4
    84
  typedef ptrdiff_t                  difference_type;
williamr@4
    85
  typedef bidirectional_iterator_tag iterator_category;
williamr@4
    86
williamr@4
    87
  _List_node_base* _M_node;
williamr@4
    88
williamr@4
    89
  _List_iterator_base(_List_node_base* __x) : _M_node(__x) {}
williamr@4
    90
williamr@4
    91
  void _M_incr() { _M_node = _M_node->_M_next; }
williamr@4
    92
  void _M_decr() { _M_node = _M_node->_M_prev; }
williamr@4
    93
};
williamr@4
    94
williamr@4
    95
williamr@4
    96
template<class _Tp, class _Traits>
williamr@4
    97
struct _List_iterator : public _List_iterator_base {
williamr@4
    98
  typedef _Tp value_type;
williamr@4
    99
  typedef typename _Traits::pointer    pointer;
williamr@4
   100
  typedef typename _Traits::reference  reference;
williamr@4
   101
williamr@4
   102
  typedef _List_iterator<_Tp, _Traits>         _Self;
williamr@4
   103
  typedef typename _Traits::_NonConstTraits    _NonConstTraits;
williamr@4
   104
  typedef _List_iterator<_Tp, _NonConstTraits> iterator;
williamr@4
   105
  typedef typename _Traits::_ConstTraits       _ConstTraits;
williamr@4
   106
  typedef _List_iterator<_Tp, _ConstTraits>    const_iterator;
williamr@4
   107
williamr@4
   108
  typedef bidirectional_iterator_tag iterator_category;
williamr@4
   109
  typedef _List_node<_Tp> _Node;
williamr@4
   110
  typedef size_t size_type;
williamr@4
   111
  typedef ptrdiff_t difference_type;
williamr@4
   112
williamr@4
   113
  explicit _List_iterator(_List_node_base* __x) : _List_iterator_base(__x) {}
williamr@4
   114
  _List_iterator() : _List_iterator_base(0) {}
williamr@4
   115
  //copy constructor for iterator and constructor from iterator for const_iterator
williamr@4
   116
  _List_iterator(const iterator& __x) :  _List_iterator_base(__x._M_node) {}
williamr@4
   117
williamr@4
   118
  reference operator*() const { return __STATIC_CAST(_Node*, this->_M_node)->_M_data; }
williamr@4
   119
williamr@4
   120
  _STLP_DEFINE_ARROW_OPERATOR
williamr@4
   121
williamr@4
   122
  _Self& operator++() {
williamr@4
   123
    this->_M_incr();
williamr@4
   124
    return *this;
williamr@4
   125
  }
williamr@4
   126
  _Self operator++(int) {
williamr@4
   127
    _Self __tmp = *this;
williamr@4
   128
    this->_M_incr();
williamr@4
   129
    return __tmp;
williamr@4
   130
  }
williamr@4
   131
  _Self& operator--() {
williamr@4
   132
    this->_M_decr();
williamr@4
   133
    return *this;
williamr@4
   134
  }
williamr@4
   135
  _Self operator--(int) {
williamr@4
   136
    _Self __tmp = *this;
williamr@4
   137
    this->_M_decr();
williamr@4
   138
    return __tmp;
williamr@4
   139
  }
williamr@4
   140
  bool operator==(const_iterator __y ) const {
williamr@4
   141
    return this->_M_node == __y._M_node;
williamr@4
   142
  }
williamr@4
   143
  bool operator!=(const_iterator __y ) const {
williamr@4
   144
    return this->_M_node != __y._M_node;
williamr@4
   145
  }
williamr@4
   146
};
williamr@4
   147
williamr@4
   148
#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
williamr@4
   149
_STLP_MOVE_TO_STD_NAMESPACE
williamr@4
   150
template <class _Tp, class _Traits>
williamr@4
   151
struct __type_traits<_STLP_PRIV _List_iterator<_Tp, _Traits> > {
williamr@4
   152
  typedef __false_type   has_trivial_default_constructor;
williamr@4
   153
  typedef __true_type    has_trivial_copy_constructor;
williamr@4
   154
  typedef __true_type    has_trivial_assignment_operator;
williamr@4
   155
  typedef __true_type    has_trivial_destructor;
williamr@4
   156
  typedef __false_type   is_POD_type;
williamr@4
   157
};
williamr@4
   158
_STLP_MOVE_TO_PRIV_NAMESPACE
williamr@4
   159
#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
williamr@4
   160
williamr@4
   161
#if defined (_STLP_USE_OLD_HP_ITERATOR_QUERIES)
williamr@4
   162
_STLP_MOVE_TO_STD_NAMESPACE
williamr@4
   163
template <class _Tp, class _Traits>
williamr@4
   164
inline _Tp* value_type(const _STLP_PRIV _List_iterator<_Tp, _Traits>&) { return 0; }
williamr@4
   165
inline bidirectional_iterator_tag iterator_category(const _STLP_PRIV _List_iterator_base&) { return bidirectional_iterator_tag();}
williamr@4
   166
inline ptrdiff_t* distance_type(const _STLP_PRIV _List_iterator_base&) { return 0; }
williamr@4
   167
_STLP_MOVE_TO_PRIV_NAMESPACE
williamr@4
   168
#endif
williamr@4
   169
williamr@4
   170
// Base class that encapsulates details of allocators and helps
williamr@4
   171
// to simplify EH
williamr@4
   172
williamr@4
   173
template <class _Tp, class _Alloc>
williamr@4
   174
class _List_base {
williamr@4
   175
protected:
williamr@4
   176
  _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
williamr@4
   177
  typedef _List_node_base _Node_base;
williamr@4
   178
  typedef _List_node<_Tp> _Node;
williamr@4
   179
  typedef _List_base<_Tp, _Alloc> _Self;
williamr@4
   180
  typedef typename _Alloc_traits<_Node, _Alloc>::allocator_type _Node_allocator_type;
williamr@4
   181
public:
williamr@4
   182
  typedef _STLP_alloc_proxy<_Node_base, _Node, _Node_allocator_type> _AllocProxy;
williamr@4
   183
  typedef typename _Alloc_traits<_Tp, _Alloc>::allocator_type allocator_type;
williamr@4
   184
williamr@4
   185
  allocator_type get_allocator() const
williamr@4
   186
  { return _STLP_CONVERT_ALLOCATOR((const _Node_allocator_type&)_M_node, _Tp); }
williamr@4
   187
williamr@4
   188
  _List_base(const allocator_type& __a) : _M_node(_STLP_CONVERT_ALLOCATOR(__a, _Node), _Node_base())
williamr@4
   189
  { _M_empty_initialize(); }
williamr@4
   190
  _List_base(__move_source<_Self> src) :
williamr@4
   191
    _M_node(__move_source<_AllocProxy>(src.get()._M_node)) {
williamr@4
   192
    if (src.get().empty())
williamr@4
   193
      //We force this to empty.
williamr@4
   194
      _M_empty_initialize();
williamr@4
   195
    else {
williamr@4
   196
      src.get()._M_empty_initialize();
williamr@4
   197
      _M_node._M_data._M_prev->_M_next = _M_node._M_data._M_next->_M_prev = &_M_node._M_data;
williamr@4
   198
    }
williamr@4
   199
  }
williamr@4
   200
williamr@4
   201
  ~_List_base()
williamr@4
   202
  { clear(); }
williamr@4
   203
williamr@4
   204
  void clear();
williamr@4
   205
  bool empty() const { return _M_node._M_data._M_next == &_M_node._M_data; }
williamr@4
   206
williamr@4
   207
  void _M_empty_initialize() {
williamr@4
   208
    _M_node._M_data._M_next = &_M_node._M_data;
williamr@4
   209
    _M_node._M_data._M_prev = _M_node._M_data._M_next;
williamr@4
   210
  }
williamr@4
   211
williamr@4
   212
public:
williamr@4
   213
  _AllocProxy _M_node;
williamr@4
   214
};
williamr@4
   215
williamr@4
   216
#if defined (_STLP_USE_PTR_SPECIALIZATIONS)
williamr@4
   217
#  define list _STLP_PTR_IMPL_NAME(list)
williamr@4
   218
#elif defined (_STLP_DEBUG)
williamr@4
   219
#  define list _STLP_NON_DBG_NAME(list)
williamr@4
   220
#else
williamr@4
   221
_STLP_MOVE_TO_STD_NAMESPACE
williamr@4
   222
#endif
williamr@4
   223
williamr@4
   224
template <class _Tp, _STLP_DEFAULT_ALLOCATOR_SELECT(_Tp) >
williamr@4
   225
class list;
williamr@4
   226
williamr@4
   227
#if !defined (list)
williamr@4
   228
_STLP_MOVE_TO_PRIV_NAMESPACE
williamr@4
   229
#endif
williamr@4
   230
williamr@4
   231
// helper functions to reduce code duplication
williamr@4
   232
template <class _Tp, class _Alloc, class _Predicate>
williamr@4
   233
void _S_remove_if(list<_Tp, _Alloc>& __that, _Predicate __pred);
williamr@4
   234
williamr@4
   235
template <class _Tp, class _Alloc, class _BinaryPredicate>
williamr@4
   236
void _S_unique(list<_Tp, _Alloc>& __that, _BinaryPredicate __binary_pred);
williamr@4
   237
williamr@4
   238
template <class _Tp, class _Alloc, class _StrictWeakOrdering>
williamr@4
   239
void _S_merge(list<_Tp, _Alloc>& __that, list<_Tp, _Alloc>& __x,
williamr@4
   240
              _StrictWeakOrdering __comp);
williamr@4
   241
williamr@4
   242
template <class _Tp, class _Alloc, class _StrictWeakOrdering>
williamr@4
   243
void _S_sort(list<_Tp, _Alloc>& __that, _StrictWeakOrdering __comp);
williamr@4
   244
williamr@4
   245
#if !defined (list)
williamr@4
   246
_STLP_MOVE_TO_STD_NAMESPACE
williamr@4
   247
#endif
williamr@4
   248
williamr@4
   249
template <class _Tp, class _Alloc>
williamr@4
   250
class list : public _STLP_PRIV _List_base<_Tp, _Alloc>
williamr@4
   251
#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (list)
williamr@4
   252
           , public __stlport_class<list<_Tp, _Alloc> >
williamr@4
   253
#endif
williamr@4
   254
{
williamr@4
   255
  typedef _STLP_PRIV _List_base<_Tp, _Alloc> _Base;
williamr@4
   256
  typedef list<_Tp, _Alloc> _Self;
williamr@4
   257
  typedef _STLP_PRIV _List_node<_Tp> _Node;
williamr@4
   258
  typedef _STLP_PRIV _List_node_base _Node_base;
williamr@4
   259
public:
williamr@4
   260
  typedef _Tp value_type;
williamr@4
   261
  typedef value_type* pointer;
williamr@4
   262
  typedef const value_type* const_pointer;
williamr@4
   263
  typedef value_type& reference;
williamr@4
   264
  typedef const value_type& const_reference;
williamr@4
   265
  typedef size_t size_type;
williamr@4
   266
  typedef ptrdiff_t difference_type;
williamr@4
   267
  _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
williamr@4
   268
  typedef typename _Base::allocator_type allocator_type;
williamr@4
   269
  typedef bidirectional_iterator_tag _Iterator_category;
williamr@4
   270
williamr@4
   271
public:
williamr@4
   272
  typedef _STLP_PRIV _List_iterator<_Tp, _Nonconst_traits<_Tp> > iterator;
williamr@4
   273
  typedef _STLP_PRIV _List_iterator<_Tp, _Const_traits<_Tp> >    const_iterator;
williamr@4
   274
  _STLP_DECLARE_BIDIRECTIONAL_REVERSE_ITERATORS;
williamr@4
   275
williamr@4
   276
protected:
williamr@4
   277
#if !defined(_STLP_DONT_SUP_DFLT_PARAM)
williamr@4
   278
  _Node_base* _M_create_node(const_reference __x = value_type()) {
williamr@4
   279
#else
williamr@4
   280
  _Node_base* _M_create_node(const_reference __x) {
williamr@4
   281
#endif /*!_STLP_DONT_SUP_DFLT_PARAM*/
williamr@4
   282
    _Node* __p = this->_M_node.allocate(1);
williamr@4
   283
    _STLP_TRY {
williamr@4
   284
      _Copy_Construct(&__p->_M_data, __x);
williamr@4
   285
    }
williamr@4
   286
    _STLP_UNWIND(this->_M_node.deallocate(__p, 1))
williamr@4
   287
    return __p;
williamr@4
   288
  }
williamr@4
   289
williamr@4
   290
#if defined(_STLP_DONT_SUP_DFLT_PARAM)
williamr@4
   291
  _Node_base* _M_create_node() {
williamr@4
   292
    _Node* __p = this->_M_node.allocate(1);
williamr@4
   293
    _STLP_TRY {
williamr@4
   294
      _STLP_STD::_Construct(&__p->_M_data);
williamr@4
   295
    }
williamr@4
   296
    _STLP_UNWIND(this->_M_node.deallocate(__p, 1))
williamr@4
   297
    return __p;
williamr@4
   298
  }
williamr@4
   299
#endif /*_STLP_DONT_SUP_DFLT_PARAM*/
williamr@4
   300
williamr@4
   301
public:
williamr@4
   302
#if !defined (_STLP_DONT_SUP_DFLT_PARAM)
williamr@4
   303
  explicit list(size_type __n, const_reference __val = _STLP_DEFAULT_CONSTRUCTED(value_type),
williamr@4
   304
                const allocator_type& __a = allocator_type())
williamr@4
   305
#else
williamr@4
   306
  explicit list(size_type __n)
williamr@4
   307
    : _STLP_PRIV _List_base<_Tp, _Alloc>(allocator_type())
williamr@4
   308
    { this->insert(begin(), __n, _STLP_DEFAULT_CONSTRUCTED(value_type)); }
williamr@4
   309
  list(size_type __n, const_reference __val)
williamr@4
   310
    : _STLP_PRIV _List_base<_Tp, _Alloc>(allocator_type())
williamr@4
   311
    { this->insert(begin(), __n, __val); }
williamr@4
   312
  list(size_type __n, const_reference __val, const allocator_type& __a)
williamr@4
   313
#endif /*_STLP_DONT_SUP_DFLT_PARAM*/
williamr@4
   314
    : _STLP_PRIV _List_base<_Tp, _Alloc>(__a)
williamr@4
   315
    { this->insert(begin(), __n, __val); }
williamr@4
   316
williamr@4
   317
#if defined (_STLP_MEMBER_TEMPLATES)
williamr@4
   318
  // We don't need any dispatching tricks here, because insert does all of
williamr@4
   319
  // that anyway.
williamr@4
   320
  template <class _InputIterator>
williamr@4
   321
  list(_InputIterator __first, _InputIterator __last,
williamr@4
   322
       const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL)
williamr@4
   323
    : _STLP_PRIV _List_base<_Tp, _Alloc>(__a)
williamr@4
   324
  { _M_insert(begin(), __first, __last); }
williamr@4
   325
williamr@4
   326
#  if defined (_STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS)
williamr@4
   327
  template <class _InputIterator>
williamr@4
   328
  list(_InputIterator __first, _InputIterator __last)
williamr@4
   329
    : _STLP_PRIV _List_base<_Tp, _Alloc>(allocator_type())
williamr@4
   330
  { _M_insert(begin(), __first, __last); }
williamr@4
   331
#  endif
williamr@4
   332
#else /* _STLP_MEMBER_TEMPLATES */
williamr@4
   333
  list(const value_type* __first, const value_type* __last,
williamr@4
   334
       const allocator_type& __a = allocator_type())
williamr@4
   335
    : _STLP_PRIV _List_base<_Tp, _Alloc>(__a)
williamr@4
   336
    { _M_insert(begin(), __first, __last); }
williamr@4
   337
  list(const_iterator __first, const_iterator __last,
williamr@4
   338
       const allocator_type& __a = allocator_type())
williamr@4
   339
    : _STLP_PRIV _List_base<_Tp, _Alloc>(__a)
williamr@4
   340
    { _M_insert(begin(), __first, __last); }
williamr@4
   341
#endif /* _STLP_MEMBER_TEMPLATES */
williamr@4
   342
williamr@4
   343
#if !defined (_STLP_DONT_SUP_DFLT_PARAM)
williamr@4
   344
  explicit list(const allocator_type& __a = allocator_type())
williamr@4
   345
#else
williamr@4
   346
  list()
williamr@4
   347
    : _STLP_PRIV _List_base<_Tp, _Alloc>(allocator_type()) {}
williamr@4
   348
  list(const allocator_type& __a)
williamr@4
   349
#endif
williamr@4
   350
    : _STLP_PRIV _List_base<_Tp, _Alloc>(__a) {}
williamr@4
   351
williamr@4
   352
  list(const _Self& __x) : _STLP_PRIV _List_base<_Tp, _Alloc>(__x.get_allocator())
williamr@4
   353
  { _M_insert(begin(), __x.begin(), __x.end()); }
williamr@4
   354
williamr@4
   355
  list(__move_source<_Self> src)
williamr@4
   356
    : _STLP_PRIV _List_base<_Tp, _Alloc>(__move_source<_Base>(src.get())) {}
williamr@4
   357
williamr@4
   358
  ~list() {}
williamr@4
   359
williamr@4
   360
  _Self& operator = (const _Self& __x);
williamr@4
   361
williamr@4
   362
  iterator begin()                      { return iterator(this->_M_node._M_data._M_next); }
williamr@4
   363
  const_iterator begin() const          { return const_iterator(this->_M_node._M_data._M_next); }
williamr@4
   364
williamr@4
   365
  iterator end()                        { return iterator(&this->_M_node._M_data); }
williamr@4
   366
  const_iterator end() const            { return const_iterator(__CONST_CAST(_Node_base*, &this->_M_node._M_data)); }
williamr@4
   367
williamr@4
   368
  reverse_iterator rbegin()             { return reverse_iterator(end()); }
williamr@4
   369
  const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); }
williamr@4
   370
williamr@4
   371
  reverse_iterator rend()               { return reverse_iterator(begin()); }
williamr@4
   372
  const_reverse_iterator rend() const   { return const_reverse_iterator(begin()); }
williamr@4
   373
williamr@4
   374
  size_type size() const {
williamr@4
   375
    size_type __result = distance(begin(), end());
williamr@4
   376
    return __result;
williamr@4
   377
  }
williamr@4
   378
  size_type max_size() const { return size_type(-1); }
williamr@4
   379
williamr@4
   380
  reference front()             { return *begin(); }
williamr@4
   381
  const_reference front() const { return *begin(); }
williamr@4
   382
  reference back()              { return *(--end()); }
williamr@4
   383
  const_reference back() const  { return *(--end()); }
williamr@4
   384
williamr@4
   385
private:
williamr@4
   386
  void _M_swap_aux(_Self& __x) {
williamr@4
   387
    __x._M_node._M_swap_alloc(this->_M_node);
williamr@4
   388
    __x._M_node._M_data._M_next = this->_M_node._M_data._M_next;
williamr@4
   389
    __x._M_node._M_data._M_next->_M_prev = &__x._M_node._M_data;
williamr@4
   390
    __x._M_node._M_data._M_prev = this->_M_node._M_data._M_prev;
williamr@4
   391
    __x._M_node._M_data._M_prev->_M_next = &__x._M_node._M_data;
williamr@4
   392
    this->_M_empty_initialize();
williamr@4
   393
  }
williamr@4
   394
williamr@4
   395
public:
williamr@4
   396
  void swap(_Self& __x) {
williamr@4
   397
    if (__x.empty()) {
williamr@4
   398
      if (this->empty()) {
williamr@4
   399
        return;
williamr@4
   400
      }
williamr@4
   401
      this->_M_swap_aux(__x);
williamr@4
   402
    } else if (this->empty()) {
williamr@4
   403
      __x._M_swap_aux(*this);
williamr@4
   404
    } else {
williamr@4
   405
      this->_M_node.swap(__x._M_node);
williamr@4
   406
      _STLP_STD::swap(this->_M_node._M_data._M_prev->_M_next, __x._M_node._M_data._M_prev->_M_next);
williamr@4
   407
      _STLP_STD::swap(this->_M_node._M_data._M_next->_M_prev, __x._M_node._M_data._M_next->_M_prev);
williamr@4
   408
    }
williamr@4
   409
  }
williamr@4
   410
williamr@4
   411
#if !defined(_STLP_DONT_SUP_DFLT_PARAM) && !defined(_STLP_NO_ANACHRONISMS)
williamr@4
   412
  iterator insert(iterator __pos, const_reference __x = value_type()) {
williamr@4
   413
#else
williamr@4
   414
  iterator insert(iterator __pos, const_reference __x) {
williamr@4
   415
#endif /*!_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/
williamr@4
   416
    _Node_base* __tmp = _M_create_node(__x);
williamr@4
   417
    _Node_base* __n = __pos._M_node;
williamr@4
   418
    _Node_base* __p = __n->_M_prev;
williamr@4
   419
    __tmp->_M_next = __n;
williamr@4
   420
    __tmp->_M_prev = __p;
williamr@4
   421
    __p->_M_next = __tmp;
williamr@4
   422
    __n->_M_prev = __tmp;
williamr@4
   423
    return iterator(__tmp);
williamr@4
   424
  }
williamr@4
   425
williamr@4
   426
private:
williamr@4
   427
#if defined (_STLP_MEMBER_TEMPLATES)
williamr@4
   428
  template <class _InputIterator>
williamr@4
   429
  void _M_insert(iterator __pos, _InputIterator __first, _InputIterator __last) {
williamr@4
   430
    typedef typename _IsIntegral<_InputIterator>::_Ret _Integral;
williamr@4
   431
    _M_insert_dispatch(__pos, __first, __last, _Integral());
williamr@4
   432
  }
williamr@4
   433
williamr@4
   434
  // Check whether it's an integral type.  If so, it's not an iterator.
williamr@4
   435
  template<class _Integer>
williamr@4
   436
  void _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __x,
williamr@4
   437
                          const __true_type& /*_IsIntegral*/) {
williamr@4
   438
    _M_fill_insert(__pos, __n, __x);
williamr@4
   439
  }
williamr@4
   440
  template <class _InputIter>
williamr@4
   441
  void _M_insert_dispatch(iterator __pos,
williamr@4
   442
                          _InputIter __first, _InputIter __last,
williamr@4
   443
                          const __false_type& /*_IsIntegral*/) {
williamr@4
   444
#else /* _STLP_MEMBER_TEMPLATES */
williamr@4
   445
  void _M_insert(iterator __pos, const value_type* __first, const value_type* __last) {
williamr@4
   446
    for (; __first != __last; ++__first)
williamr@4
   447
      insert(__pos, *__first);
williamr@4
   448
  }
williamr@4
   449
  void _M_insert(iterator __pos, const_iterator __first, const_iterator __last) {
williamr@4
   450
#endif /* _STLP_MEMBER_TEMPLATES */
williamr@4
   451
    //We use a temporary list to avoid the auto reference troubles (infinite loop)
williamr@4
   452
    for (; __first != __last; ++__first)
williamr@4
   453
      insert(__pos, *__first);
williamr@4
   454
  }
williamr@4
   455
williamr@4
   456
public:
williamr@4
   457
#if defined (_STLP_MEMBER_TEMPLATES)
williamr@4
   458
  template <class _InputIterator>
williamr@4
   459
  void insert(iterator __pos, _InputIterator __first, _InputIterator __last) {
williamr@4
   460
    typedef typename _IsIntegral<_InputIterator>::_Ret _Integral;
williamr@4
   461
    _M_splice_insert_dispatch(__pos, __first, __last, _Integral());
williamr@4
   462
  }
williamr@4
   463
williamr@4
   464
private:
williamr@4
   465
  // Check whether it's an integral type.  If so, it's not an iterator.
williamr@4
   466
  template<class _Integer>
williamr@4
   467
  void _M_splice_insert_dispatch(iterator __pos, _Integer __n, _Integer __x,
williamr@4
   468
                          const __true_type& /*_IsIntegral*/) {
williamr@4
   469
    _M_fill_insert(__pos, __n, __x);
williamr@4
   470
  }
williamr@4
   471
  template <class _InputIter>
williamr@4
   472
  void _M_splice_insert_dispatch(iterator __pos,
williamr@4
   473
                          _InputIter __first, _InputIter __last,
williamr@4
   474
                          const __false_type& /*_IsIntegral*/) {
williamr@4
   475
#else /* _STLP_MEMBER_TEMPLATES */
williamr@4
   476
  void insert(iterator __pos, const value_type* __first, const value_type* __last) {
williamr@4
   477
    _Self __tmp(__first, __last, this->get_allocator());
williamr@4
   478
    splice(__pos, __tmp);
williamr@4
   479
  }
williamr@4
   480
  void insert(iterator __pos, const_iterator __first, const_iterator __last) {
williamr@4
   481
#endif /* _STLP_MEMBER_TEMPLATES */
williamr@4
   482
    //We use a temporary list to avoid the auto reference troubles (infinite loop)
williamr@4
   483
    _Self __tmp(__first, __last, this->get_allocator());
williamr@4
   484
    splice(__pos, __tmp);
williamr@4
   485
  }
williamr@4
   486
williamr@4
   487
public:
williamr@4
   488
  void insert(iterator __pos, size_type __n, const_reference __x)
williamr@4
   489
  { _M_fill_insert(__pos, __n, __x); }
williamr@4
   490
williamr@4
   491
private:
williamr@4
   492
  void _M_fill_insert(iterator __pos, size_type __n, const_reference __x) {
williamr@4
   493
    for ( ; __n > 0; --__n)
williamr@4
   494
      insert(__pos, __x);
williamr@4
   495
  }
williamr@4
   496
williamr@4
   497
public:
williamr@4
   498
  void push_front(const_reference __x) { insert(begin(), __x); }
williamr@4
   499
  void push_back (const_reference __x) { insert(end(), __x); }
williamr@4
   500
williamr@4
   501
#if defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
williamr@4
   502
  iterator insert(iterator __pos)
williamr@4
   503
  { return insert(__pos, _STLP_DEFAULT_CONSTRUCTED(value_type)); }
williamr@4
   504
  void push_front() {insert(begin());}
williamr@4
   505
  void push_back() {insert(end());}
williamr@4
   506
# endif /*_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/
williamr@4
   507
williamr@4
   508
  iterator erase(iterator __pos) {
williamr@4
   509
    _Node_base* __next_node = __pos._M_node->_M_next;
williamr@4
   510
    _Node_base* __prev_node = __pos._M_node->_M_prev;
williamr@4
   511
    _Node* __n = __STATIC_CAST(_Node*, __pos._M_node);
williamr@4
   512
    __prev_node->_M_next = __next_node;
williamr@4
   513
    __next_node->_M_prev = __prev_node;
williamr@4
   514
    _STLP_STD::_Destroy(&__n->_M_data);
williamr@4
   515
    this->_M_node.deallocate(__n, 1);
williamr@4
   516
    return iterator(__next_node);
williamr@4
   517
  }
williamr@4
   518
williamr@4
   519
  iterator erase(iterator __first, iterator __last) {
williamr@4
   520
    while (__first != __last)
williamr@4
   521
      erase(__first++);
williamr@4
   522
    return __last;
williamr@4
   523
  }
williamr@4
   524
williamr@4
   525
#if !defined (_STLP_DONT_SUP_DFLT_PARAM)
williamr@4
   526
  void resize(size_type __new_size, const_reference __x = value_type());
williamr@4
   527
#else
williamr@4
   528
  void resize(size_type __new_size, const_reference __x);
williamr@4
   529
  void resize(size_type __new_size)
williamr@4
   530
  { this->resize(__new_size, _STLP_DEFAULT_CONSTRUCTED(value_type)); }
williamr@4
   531
#endif /*!_STLP_DONT_SUP_DFLT_PARAM*/
williamr@4
   532
williamr@4
   533
  void pop_front() { erase(begin()); }
williamr@4
   534
  void pop_back() {
williamr@4
   535
    iterator __tmp = end();
williamr@4
   536
    erase(--__tmp);
williamr@4
   537
  }
williamr@4
   538
williamr@4
   539
public:
williamr@4
   540
  // assign(), a generalized assignment member function.  Two
williamr@4
   541
  // versions: one that takes a count, and one that takes a range.
williamr@4
   542
  // The range version is a member template, so we dispatch on whether
williamr@4
   543
  // or not the type is an integer.
williamr@4
   544
williamr@4
   545
  void assign(size_type __n, const_reference __val) { _M_fill_assign(__n, __val); }
williamr@4
   546
williamr@4
   547
  void _M_fill_assign(size_type __n, const_reference __val);
williamr@4
   548
williamr@4
   549
#if defined (_STLP_MEMBER_TEMPLATES)
williamr@4
   550
  template <class _InputIterator>
williamr@4
   551
  void assign(_InputIterator __first, _InputIterator __last) {
williamr@4
   552
    typedef typename _IsIntegral<_InputIterator>::_Ret _Integral;
williamr@4
   553
    _M_assign_dispatch(__first, __last, _Integral());
williamr@4
   554
  }
williamr@4
   555
williamr@4
   556
  template <class _Integer>
williamr@4
   557
  void _M_assign_dispatch(_Integer __n, _Integer __val,
williamr@4
   558
                          const __true_type& /*_IsIntegral*/) {
williamr@4
   559
    _M_fill_assign(__n, __val);
williamr@4
   560
  }
williamr@4
   561
williamr@4
   562
  template <class _InputIterator>
williamr@4
   563
  void _M_assign_dispatch(_InputIterator __first2, _InputIterator __last2,
williamr@4
   564
                          const __false_type& /*_IsIntegral*/) {
williamr@4
   565
#else
williamr@4
   566
  void assign(const value_type *__first2, const value_type *__last2) {
williamr@4
   567
    iterator __first1 = begin();
williamr@4
   568
    iterator __last1 = end();
williamr@4
   569
    for ( ; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2)
williamr@4
   570
      *__first1 = *__first2;
williamr@4
   571
    if (__first2 == __last2)
williamr@4
   572
      erase(__first1, __last1);
williamr@4
   573
    else
williamr@4
   574
      insert(__last1, __first2, __last2);
williamr@4
   575
  }
williamr@4
   576
  void assign(const_iterator __first2, const_iterator __last2) {
williamr@4
   577
#endif /* _STLP_MEMBER_TEMPLATES */
williamr@4
   578
    iterator __first1 = begin();
williamr@4
   579
    iterator __last1 = end();
williamr@4
   580
    for ( ; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2)
williamr@4
   581
      *__first1 = *__first2;
williamr@4
   582
    if (__first2 == __last2)
williamr@4
   583
      erase(__first1, __last1);
williamr@4
   584
    else
williamr@4
   585
      insert(__last1, __first2, __last2);
williamr@4
   586
  }
williamr@4
   587
williamr@4
   588
public:
williamr@4
   589
  void splice(iterator __pos, _Self& __x) {
williamr@4
   590
    if (!__x.empty()) {
williamr@4
   591
      if (this->get_allocator() == __x.get_allocator()) {
williamr@4
   592
        _STLP_PRIV _List_global_inst::_Transfer(__pos._M_node, __x.begin()._M_node, __x.end()._M_node);
williamr@4
   593
      }
williamr@4
   594
      else {
williamr@4
   595
        insert(__pos, __x.begin(), __x.end());
williamr@4
   596
        __x.clear();
williamr@4
   597
      }
williamr@4
   598
    }
williamr@4
   599
  }
williamr@4
   600
  void splice(iterator __pos, _Self& __x, iterator __i) {
williamr@4
   601
    iterator __j = __i;
williamr@4
   602
    ++__j;
williamr@4
   603
    if (__pos == __i || __pos == __j) return;
williamr@4
   604
    if (this->get_allocator() == __x.get_allocator()) {
williamr@4
   605
      _STLP_PRIV _List_global_inst::_Transfer(__pos._M_node, __i._M_node, __j._M_node);
williamr@4
   606
    }
williamr@4
   607
    else {
williamr@4
   608
      insert(__pos, *__i);
williamr@4
   609
      __x.erase(__i);
williamr@4
   610
    }
williamr@4
   611
  }
williamr@4
   612
  void splice(iterator __pos, _Self& __x, iterator __first, iterator __last) {
williamr@4
   613
    if (__first != __last) {
williamr@4
   614
      if (this->get_allocator() == __x.get_allocator()) {
williamr@4
   615
        _STLP_PRIV _List_global_inst::_Transfer(__pos._M_node, __first._M_node, __last._M_node);
williamr@4
   616
      }
williamr@4
   617
      else {
williamr@4
   618
        insert(__pos, __first, __last);
williamr@4
   619
        __x.erase(__first, __last);
williamr@4
   620
      }
williamr@4
   621
    }
williamr@4
   622
  }
williamr@4
   623
williamr@4
   624
  void remove(const_reference __val) {
williamr@4
   625
    iterator __first = begin();
williamr@4
   626
    iterator __last = end();
williamr@4
   627
    while (__first != __last) {
williamr@4
   628
      iterator __next = __first;
williamr@4
   629
      ++__next;
williamr@4
   630
      if (__val == *__first) erase(__first);
williamr@4
   631
      __first = __next;
williamr@4
   632
    }
williamr@4
   633
  }
williamr@4
   634
williamr@4
   635
  void unique()
williamr@4
   636
  { _STLP_PRIV _S_unique(*this, equal_to<value_type>()); }
williamr@4
   637
williamr@4
   638
  void merge(_Self& __x)
williamr@4
   639
  { _STLP_PRIV _S_merge(*this, __x, less<value_type>()); }
williamr@4
   640
williamr@4
   641
  void reverse() {
williamr@4
   642
    _Node_base* __p = &this->_M_node._M_data;
williamr@4
   643
    _Node_base* __tmp = __p;
williamr@4
   644
    do {
williamr@4
   645
      _STLP_STD::swap(__tmp->_M_next, __tmp->_M_prev);
williamr@4
   646
      __tmp = __tmp->_M_prev;     // Old next node is now prev.
williamr@4
   647
    } while (__tmp != __p);
williamr@4
   648
  }
williamr@4
   649
williamr@4
   650
  void sort()
williamr@4
   651
  { _STLP_PRIV _S_sort(*this, less<value_type>()); }
williamr@4
   652
williamr@4
   653
#if defined (_STLP_MEMBER_TEMPLATES)
williamr@4
   654
  template <class _Predicate>
williamr@4
   655
  void remove_if(_Predicate __pred)
williamr@4
   656
  { _STLP_PRIV _S_remove_if(*this, __pred); }
williamr@4
   657
  template <class _BinaryPredicate>
williamr@4
   658
  void unique(_BinaryPredicate __binary_pred)
williamr@4
   659
  { _STLP_PRIV _S_unique(*this, __binary_pred); }
williamr@4
   660
williamr@4
   661
  template <class _StrictWeakOrdering>
williamr@4
   662
  void merge(_Self& __x,
williamr@4
   663
             _StrictWeakOrdering __comp) {
williamr@4
   664
    _STLP_PRIV _S_merge(*this, __x, __comp);
williamr@4
   665
  }
williamr@4
   666
williamr@4
   667
  template <class _StrictWeakOrdering>
williamr@4
   668
  void sort(_StrictWeakOrdering __comp)
williamr@4
   669
  { _STLP_PRIV _S_sort(*this, __comp); }
williamr@4
   670
#endif /* _STLP_MEMBER_TEMPLATES */
williamr@4
   671
};
williamr@4
   672
williamr@4
   673
#if defined (list)
williamr@4
   674
#  undef list
williamr@4
   675
_STLP_MOVE_TO_STD_NAMESPACE
williamr@4
   676
#endif
williamr@4
   677
williamr@4
   678
_STLP_END_NAMESPACE
williamr@4
   679
williamr@4
   680
#if !defined (_STLP_LINK_TIME_INSTANTIATION)
williamr@4
   681
#  include <stl/_list.c>
williamr@4
   682
#endif
williamr@4
   683
williamr@4
   684
#if defined (_STLP_USE_PTR_SPECIALIZATIONS)
williamr@4
   685
#  include <stl/pointers/_list.h>
williamr@4
   686
#endif
williamr@4
   687
williamr@4
   688
#if defined (_STLP_DEBUG)
williamr@4
   689
#  include <stl/debug/_list.h>
williamr@4
   690
#endif
williamr@4
   691
williamr@4
   692
_STLP_BEGIN_NAMESPACE
williamr@4
   693
williamr@4
   694
template <class _Tp, class _Alloc>
williamr@4
   695
_STLP_INLINE_LOOP bool  _STLP_CALL
williamr@4
   696
operator==(const list<_Tp,_Alloc>& __x, const list<_Tp,_Alloc>& __y) {
williamr@4
   697
  typedef typename list<_Tp,_Alloc>::const_iterator const_iterator;
williamr@4
   698
  const_iterator __end1 = __x.end();
williamr@4
   699
  const_iterator __end2 = __y.end();
williamr@4
   700
williamr@4
   701
  const_iterator __i1 = __x.begin();
williamr@4
   702
  const_iterator __i2 = __y.begin();
williamr@4
   703
  while (__i1 != __end1 && __i2 != __end2 && *__i1 == *__i2) {
williamr@4
   704
    ++__i1;
williamr@4
   705
    ++__i2;
williamr@4
   706
  }
williamr@4
   707
  return __i1 == __end1 && __i2 == __end2;
williamr@4
   708
}
williamr@4
   709
williamr@4
   710
#define _STLP_EQUAL_OPERATOR_SPECIALIZED
williamr@4
   711
#define _STLP_TEMPLATE_HEADER    template <class _Tp, class _Alloc>
williamr@4
   712
#define _STLP_TEMPLATE_CONTAINER list<_Tp, _Alloc>
williamr@4
   713
#include <stl/_relops_cont.h>
williamr@4
   714
#undef _STLP_TEMPLATE_CONTAINER
williamr@4
   715
#undef _STLP_TEMPLATE_HEADER
williamr@4
   716
#undef _STLP_EQUAL_OPERATOR_SPECIALIZED
williamr@4
   717
williamr@4
   718
#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
williamr@4
   719
template <class _Tp, class _Alloc>
williamr@4
   720
struct __move_traits<list<_Tp, _Alloc> > {
williamr@4
   721
  typedef __stlp_movable implemented;
williamr@4
   722
  typedef typename __move_traits<_Alloc>::complete complete;
williamr@4
   723
};
williamr@4
   724
#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
williamr@4
   725
williamr@4
   726
_STLP_END_NAMESPACE
williamr@4
   727
williamr@4
   728
#endif /* _STLP_INTERNAL_LIST_IMPL_H */
williamr@4
   729
williamr@4
   730
// Local Variables:
williamr@4
   731
// mode:C++
williamr@4
   732
// End: