epoc32/include/stdapis/stlport/stl/_list.h
author William Roberts <williamr@symbian.org>
Tue, 16 Mar 2010 16:12:26 +0000
branchSymbian2
changeset 2 2fe1408b6811
parent 0 061f57f2323e
permissions -rw-r--r--
Final list of Symbian^2 public API header files
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_LIST_H
williamr@2
    31
#define _STLP_INTERNAL_LIST_H
williamr@2
    32
williamr@2
    33
# ifndef _STLP_INTERNAL_ALGOBASE_H
williamr@2
    34
#  include <stl/_algobase.h>
williamr@2
    35
# endif
williamr@2
    36
williamr@2
    37
# ifndef _STLP_INTERNAL_ALLOC_H
williamr@2
    38
#  include <stl/_alloc.h>
williamr@2
    39
# endif
williamr@2
    40
williamr@2
    41
# ifndef _STLP_INTERNAL_ITERATOR_H
williamr@2
    42
#  include <stl/_iterator.h>
williamr@2
    43
# endif
williamr@2
    44
williamr@2
    45
# ifndef _STLP_INTERNAL_CONSTRUCT_H
williamr@2
    46
#  include <stl/_construct.h>
williamr@2
    47
# endif
williamr@2
    48
williamr@2
    49
# ifndef _STLP_INTERNAL_FUNCTION_BASE_H
williamr@2
    50
#  include <stl/_function_base.h>
williamr@2
    51
# endif
williamr@2
    52
williamr@2
    53
_STLP_BEGIN_NAMESPACE
williamr@2
    54
williamr@2
    55
# undef list
williamr@2
    56
# define  list  __WORKAROUND_DBG_RENAME(list)
williamr@2
    57
williamr@2
    58
struct _List_node_base {
williamr@2
    59
  _List_node_base* _M_next;
williamr@2
    60
  _List_node_base* _M_prev;
williamr@2
    61
};
williamr@2
    62
williamr@2
    63
template <class _Dummy>
williamr@2
    64
class _List_global {
williamr@2
    65
public:
williamr@2
    66
  typedef _List_node_base _Node;
williamr@2
    67
  static void  _STLP_CALL _Transfer(_List_node_base* __position, 
williamr@2
    68
                                    _List_node_base* __first, _List_node_base* __last);
williamr@2
    69
};
williamr@2
    70
williamr@2
    71
# if defined (_STLP_USE_TEMPLATE_EXPORT) 
williamr@2
    72
_STLP_EXPORT_TEMPLATE_CLASS _List_global<bool>;
williamr@2
    73
# endif
williamr@2
    74
typedef _List_global<bool> _List_global_inst;
williamr@2
    75
williamr@2
    76
template <class _Tp>
williamr@2
    77
struct _List_node : public _List_node_base {
williamr@2
    78
  _Tp _M_data;
williamr@2
    79
  __TRIVIAL_STUFF(_List_node)
williamr@2
    80
williamr@2
    81
#ifdef __DMC__
williamr@2
    82
  // for some reason, Digital Mars C++ needs a constructor...
williamr@2
    83
 private:
williamr@2
    84
  _List_node();
williamr@2
    85
#endif
williamr@2
    86
};
williamr@2
    87
williamr@2
    88
struct _List_iterator_base {
williamr@2
    89
  typedef size_t                     size_type;
williamr@2
    90
  typedef ptrdiff_t                  difference_type;
williamr@2
    91
  typedef bidirectional_iterator_tag iterator_category;
williamr@2
    92
williamr@2
    93
  _List_node_base* _M_node;
williamr@2
    94
williamr@2
    95
  _List_iterator_base(_List_node_base* __x) : _M_node(__x) {}
williamr@2
    96
  _List_iterator_base() {}
williamr@2
    97
williamr@2
    98
  void _M_incr() { _M_node = _M_node->_M_next; }
williamr@2
    99
  void _M_decr() { _M_node = _M_node->_M_prev; }
williamr@2
   100
  bool operator==(const _List_iterator_base& __y ) const { 
williamr@2
   101
    return _M_node == __y._M_node; 
williamr@2
   102
  }
williamr@2
   103
  bool operator!=(const _List_iterator_base& __y ) const { 
williamr@2
   104
    return _M_node != __y._M_node; 
williamr@2
   105
  }
williamr@2
   106
};  
williamr@2
   107
williamr@2
   108
williamr@2
   109
williamr@2
   110
williamr@2
   111
template<class _Tp, class _Traits>
williamr@2
   112
struct _List_iterator : public _List_iterator_base {
williamr@2
   113
  typedef _Tp value_type;
williamr@2
   114
  typedef typename _Traits::pointer    pointer;
williamr@2
   115
  typedef typename _Traits::reference  reference;
williamr@2
   116
williamr@2
   117
  typedef _List_iterator<_Tp, _Nonconst_traits<_Tp> > iterator;
williamr@2
   118
  typedef _List_iterator<_Tp, _Const_traits<_Tp> >    const_iterator;
williamr@2
   119
  typedef _List_iterator<_Tp, _Traits>                       _Self;
williamr@2
   120
williamr@2
   121
  typedef bidirectional_iterator_tag iterator_category;
williamr@2
   122
  typedef _List_node<_Tp> _Node;
williamr@2
   123
  typedef size_t size_type;
williamr@2
   124
  typedef ptrdiff_t difference_type;
williamr@2
   125
williamr@2
   126
  _List_iterator(_Node* __x) : _List_iterator_base(__x) {}
williamr@2
   127
  _List_iterator() {}
williamr@2
   128
  _List_iterator(const iterator& __x) :  _List_iterator_base(__x._M_node) {}
williamr@2
   129
williamr@2
   130
  reference operator*() const { return ((_Node*)_M_node)->_M_data; }
williamr@2
   131
williamr@2
   132
  _STLP_DEFINE_ARROW_OPERATOR
williamr@2
   133
williamr@2
   134
  _Self& operator++() { 
williamr@2
   135
    this->_M_incr();
williamr@2
   136
    return *this;
williamr@2
   137
  }
williamr@2
   138
  _Self operator++(int) { 
williamr@2
   139
    _Self __tmp = *this;
williamr@2
   140
    this->_M_incr();
williamr@2
   141
    return __tmp;
williamr@2
   142
  }
williamr@2
   143
  _Self& operator--() { 
williamr@2
   144
    this->_M_decr();
williamr@2
   145
    return *this;
williamr@2
   146
  }
williamr@2
   147
  _Self operator--(int) { 
williamr@2
   148
    _Self __tmp = *this;
williamr@2
   149
    this->_M_decr();
williamr@2
   150
    return __tmp;
williamr@2
   151
  }
williamr@2
   152
};
williamr@2
   153
williamr@2
   154
williamr@2
   155
#ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
williamr@2
   156
template <class _Tp, class _Traits>
williamr@2
   157
inline _Tp* value_type(const _List_iterator<_Tp, _Traits>&) { return 0; }
williamr@2
   158
inline bidirectional_iterator_tag iterator_category(const _List_iterator_base&) { return bidirectional_iterator_tag();}
williamr@2
   159
inline ptrdiff_t* distance_type(const _List_iterator_base&) { return 0; }
williamr@2
   160
#endif
williamr@2
   161
williamr@2
   162
williamr@2
   163
// Base class that encapsulates details of allocators and helps 
williamr@2
   164
// to simplify EH
williamr@2
   165
williamr@2
   166
template <class _Tp, class _Alloc>
williamr@2
   167
class _List_base 
williamr@2
   168
{
williamr@2
   169
protected:
williamr@2
   170
  _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
williamr@2
   171
  typedef _List_node<_Tp> _Node;
williamr@2
   172
  typedef typename _Alloc_traits<_Node, _Alloc>::allocator_type
williamr@2
   173
           _Node_allocator_type;
williamr@2
   174
public:
williamr@2
   175
  typedef typename _Alloc_traits<_Tp, _Alloc>::allocator_type
williamr@2
   176
          allocator_type;
williamr@2
   177
williamr@2
   178
  allocator_type get_allocator() const { 
williamr@2
   179
    return _STLP_CONVERT_ALLOCATOR((const _Node_allocator_type&)_M_node, _Tp);
williamr@2
   180
  }
williamr@2
   181
williamr@2
   182
  _List_base(const allocator_type& __a) : _M_node(_STLP_CONVERT_ALLOCATOR(__a, _Node), (_Node*)0) {
williamr@2
   183
    _Node* __n = _M_node.allocate(1);
williamr@2
   184
    __n->_M_next = __n;
williamr@2
   185
    __n->_M_prev = __n;
williamr@2
   186
    _M_node._M_data = __n;
williamr@2
   187
  }
williamr@2
   188
  ~_List_base() {
williamr@2
   189
    clear();
williamr@2
   190
    _M_node.deallocate(_M_node._M_data, 1);
williamr@2
   191
  }
williamr@2
   192
williamr@2
   193
  void clear();
williamr@2
   194
williamr@2
   195
public:
williamr@2
   196
  _STLP_alloc_proxy<_Node*, _Node, _Node_allocator_type>  _M_node;
williamr@2
   197
};
williamr@2
   198
williamr@2
   199
template <class _Tp, _STLP_DEFAULT_ALLOCATOR_SELECT(_Tp) >
williamr@2
   200
class list;
williamr@2
   201
williamr@2
   202
// helper functions to reduce code duplication
williamr@2
   203
template <class _Tp, class _Alloc, class _Predicate> 
williamr@2
   204
void _S_remove_if(list<_Tp, _Alloc>& __that, _Predicate __pred);
williamr@2
   205
williamr@2
   206
template <class _Tp, class _Alloc, class _BinaryPredicate>
williamr@2
   207
void _S_unique(list<_Tp, _Alloc>& __that, _BinaryPredicate __binary_pred);
williamr@2
   208
williamr@2
   209
template <class _Tp, class _Alloc, class _StrictWeakOrdering>
williamr@2
   210
void _S_merge(list<_Tp, _Alloc>& __that, list<_Tp, _Alloc>& __x,
williamr@2
   211
	      _StrictWeakOrdering __comp);
williamr@2
   212
williamr@2
   213
template <class _Tp, class _Alloc, class _StrictWeakOrdering>
williamr@2
   214
void _S_sort(list<_Tp, _Alloc>& __that, _StrictWeakOrdering __comp);
williamr@2
   215
williamr@2
   216
template <class _Tp, class _Alloc>
williamr@2
   217
class list : public _List_base<_Tp, _Alloc> {
williamr@2
   218
  typedef _List_base<_Tp, _Alloc> _Base;
williamr@2
   219
  typedef list<_Tp, _Alloc> _Self;
williamr@2
   220
public:      
williamr@2
   221
  typedef _Tp value_type;
williamr@2
   222
  typedef value_type* pointer;
williamr@2
   223
  typedef const value_type* const_pointer;
williamr@2
   224
  typedef value_type& reference;
williamr@2
   225
  typedef const value_type& const_reference;
williamr@2
   226
  typedef _List_node<_Tp> _Node;
williamr@2
   227
  typedef size_t size_type;
williamr@2
   228
  typedef ptrdiff_t difference_type;
williamr@2
   229
  _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
williamr@2
   230
  typedef typename _Base::allocator_type allocator_type;
williamr@2
   231
  typedef bidirectional_iterator_tag _Iterator_category;
williamr@2
   232
williamr@2
   233
public:
williamr@2
   234
  typedef _List_iterator<_Tp, _Nonconst_traits<_Tp> > iterator;
williamr@2
   235
  typedef _List_iterator<_Tp, _Const_traits<_Tp> >    const_iterator;
williamr@2
   236
  _STLP_DECLARE_BIDIRECTIONAL_REVERSE_ITERATORS;
williamr@2
   237
williamr@2
   238
protected:
williamr@2
   239
  _Node* _M_create_node(const _Tp& __x)
williamr@2
   240
  {
williamr@2
   241
    _Node* __p = this->_M_node.allocate(1);
williamr@2
   242
    _STLP_TRY {
williamr@2
   243
      _Construct(&__p->_M_data, __x);
williamr@2
   244
    }
williamr@2
   245
    _STLP_UNWIND(this->_M_node.deallocate(__p, 1));
williamr@2
   246
    return __p;
williamr@2
   247
  }
williamr@2
   248
williamr@2
   249
  _Node* _M_create_node()
williamr@2
   250
  {
williamr@2
   251
    _Node* __p = this->_M_node.allocate(1);
williamr@2
   252
    _STLP_TRY {
williamr@2
   253
      _Construct(&__p->_M_data);
williamr@2
   254
    }
williamr@2
   255
    _STLP_UNWIND(this->_M_node.deallocate(__p, 1));
williamr@2
   256
    return __p;
williamr@2
   257
  }
williamr@2
   258
williamr@2
   259
public:
williamr@2
   260
# if !(defined(__MRC__)||(defined(__SC__) && !defined(__DMC__)))
williamr@2
   261
  explicit
williamr@2
   262
# endif
williamr@2
   263
  list(const allocator_type& __a = allocator_type()) :
williamr@2
   264
    _List_base<_Tp, _Alloc>(__a) {
williamr@2
   265
    _STLP_POP_IF_CHECK
williamr@2
   266
  }
williamr@2
   267
williamr@2
   268
  iterator begin()             { return iterator((_Node*)(this->_M_node._M_data->_M_next)); }
williamr@2
   269
  const_iterator begin() const { return const_iterator((_Node*)(this->_M_node._M_data->_M_next)); }
williamr@2
   270
williamr@2
   271
  iterator end()             { return this->_M_node._M_data; }
williamr@2
   272
  const_iterator end() const { return this->_M_node._M_data; }
williamr@2
   273
williamr@2
   274
  reverse_iterator rbegin() 
williamr@2
   275
    { return reverse_iterator(end()); }
williamr@2
   276
  const_reverse_iterator rbegin() const 
williamr@2
   277
    { return const_reverse_iterator(end()); }
williamr@2
   278
williamr@2
   279
  reverse_iterator rend()
williamr@2
   280
    { return reverse_iterator(begin()); }
williamr@2
   281
  const_reverse_iterator rend() const
williamr@2
   282
    { return const_reverse_iterator(begin()); }
williamr@2
   283
williamr@2
   284
  bool empty() const { return this->_M_node._M_data->_M_next == this->_M_node._M_data; }
williamr@2
   285
  size_type size() const {
williamr@2
   286
    size_type __result = distance(begin(), end());
williamr@2
   287
    return __result;
williamr@2
   288
  }
williamr@2
   289
  size_type max_size() const { return size_type(-1); }
williamr@2
   290
williamr@2
   291
  reference front() { return *begin(); }
williamr@2
   292
  const_reference front() const { return *begin(); }
williamr@2
   293
  reference back() { return *(--end()); }
williamr@2
   294
  const_reference back() const { return *(--end()); }
williamr@2
   295
williamr@2
   296
  void swap(list<_Tp, _Alloc>& __x) {
williamr@2
   297
    _STLP_STD::swap(this->_M_node, __x._M_node); 
williamr@2
   298
  }
williamr@2
   299
williamr@2
   300
  iterator insert(iterator __position, const _Tp& __x) {
williamr@2
   301
williamr@2
   302
    _Node* __tmp = _M_create_node(__x);
williamr@2
   303
    _List_node_base* __n = __position._M_node;
williamr@2
   304
    _List_node_base* __p = __n->_M_prev;
williamr@2
   305
    __tmp->_M_next = __n;
williamr@2
   306
    __tmp->_M_prev = __p;
williamr@2
   307
    __p->_M_next = __tmp;
williamr@2
   308
    __n->_M_prev = __tmp;
williamr@2
   309
    return __tmp;
williamr@2
   310
  }
williamr@2
   311
williamr@2
   312
#ifdef _STLP_MEMBER_TEMPLATES
williamr@2
   313
  template <class _InputIterator>
williamr@2
   314
  void insert(iterator __pos, _InputIterator __first, _InputIterator __last) {
williamr@2
   315
    typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
williamr@2
   316
    _M_insert_dispatch(__pos, __first, __last, _Integral());
williamr@2
   317
  }
williamr@2
   318
  // Check whether it's an integral type.  If so, it's not an iterator.
williamr@2
   319
  template<class _Integer>
williamr@2
   320
  void _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __x,
williamr@2
   321
                          const __true_type&) {
williamr@2
   322
    _M_fill_insert(__pos, (size_type) __n, (_Tp) __x);
williamr@2
   323
  }
williamr@2
   324
  template <class _InputIter>
williamr@2
   325
  void 
williamr@2
   326
  _M_insert_dispatch(iterator __position,
williamr@2
   327
		     _InputIter __first, _InputIter __last,
williamr@2
   328
		     const __false_type&) 
williamr@2
   329
#else /* _STLP_MEMBER_TEMPLATES */
williamr@2
   330
  void insert(iterator __position, const _Tp* __first, const _Tp* __last) {
williamr@2
   331
    for ( ; __first != __last; ++__first)
williamr@2
   332
      insert(__position, *__first);
williamr@2
   333
  }
williamr@2
   334
  void insert(iterator __position, const_iterator __first, const_iterator __last)
williamr@2
   335
#endif /* _STLP_MEMBER_TEMPLATES */
williamr@2
   336
  {
williamr@2
   337
    for ( ; __first != __last; ++__first)
williamr@2
   338
      insert(__position, *__first);
williamr@2
   339
  }
williamr@2
   340
  void insert(iterator __pos, size_type __n, const _Tp& __x) { _M_fill_insert(__pos, __n, __x); }
williamr@2
   341
  
williamr@2
   342
  void _M_fill_insert(iterator __pos, size_type __n, const _Tp& __x) {
williamr@2
   343
    for ( ; __n > 0; --__n)
williamr@2
   344
      insert(__pos, __x);
williamr@2
   345
  } 
williamr@2
   346
  void push_front(const _Tp& __x) { insert(begin(), __x); }
williamr@2
   347
  void push_back(const _Tp& __x) { insert(end(), __x); }
williamr@2
   348
williamr@2
   349
# ifndef _STLP_NO_ANACHRONISMS
williamr@2
   350
  iterator insert(iterator __position) { return insert(__position, _Tp()); }
williamr@2
   351
  void push_front() {insert(begin());}
williamr@2
   352
  void push_back() {insert(end());}
williamr@2
   353
# endif
williamr@2
   354
williamr@2
   355
  iterator erase(iterator __position) {
williamr@2
   356
    _List_node_base* __next_node = __position._M_node->_M_next;
williamr@2
   357
    _List_node_base* __prev_node = __position._M_node->_M_prev;
williamr@2
   358
    _Node* __n = (_Node*) __position._M_node;
williamr@2
   359
    __prev_node->_M_next = __next_node;
williamr@2
   360
    __next_node->_M_prev = __prev_node;
williamr@2
   361
    _STLP_STD::_Destroy(&__n->_M_data);
williamr@2
   362
    this->_M_node.deallocate(__n, 1);
williamr@2
   363
    return iterator((_Node*)__next_node);
williamr@2
   364
    }
williamr@2
   365
  
williamr@2
   366
  iterator erase(iterator __first, iterator __last) {
williamr@2
   367
    while (__first != __last)
williamr@2
   368
      erase(__first++);
williamr@2
   369
    return __last;
williamr@2
   370
  }
williamr@2
   371
williamr@2
   372
  void resize(size_type __new_size, _Tp __x);
williamr@2
   373
  void resize(size_type __new_size) { this->resize(__new_size, _Tp()); }
williamr@2
   374
williamr@2
   375
  void pop_front() { erase(begin()); }
williamr@2
   376
  void pop_back() { 
williamr@2
   377
    iterator __tmp = end();
williamr@2
   378
    erase(--__tmp);
williamr@2
   379
  }
williamr@2
   380
  list(size_type __n, const _Tp& __val,
williamr@2
   381
       const allocator_type& __a = allocator_type())
williamr@2
   382
    : _List_base<_Tp, _Alloc>(__a)
williamr@2
   383
    { 
williamr@2
   384
      _STLP_PUSH_CLEANUP_ITEM(_Base, this) 
williamr@2
   385
	this->insert(begin(), __n, __val); 
williamr@2
   386
      _STLP_POP_CLEANUP_ITEM 
williamr@2
   387
    }
williamr@2
   388
  explicit list(size_type __n)
williamr@2
   389
    : _List_base<_Tp, _Alloc>(allocator_type())
williamr@2
   390
    { 
williamr@2
   391
# ifdef _STLP_USE_TRAP_LEAVE
williamr@2
   392
      _STLP_PUSH_CLEANUP_ITEM(_Base, this) 
williamr@2
   393
      _Tp __p;
williamr@2
   394
      _STLP_PUSH_CLEANUP_ITEM(_Tp, &__p) 
williamr@2
   395
      this->insert(begin(), __n, __p); 
williamr@2
   396
      // unconditional for __p
williamr@2
   397
      CleanupStack::Pop();
williamr@2
   398
      _STLP_POP_CLEANUP_ITEM
williamr@2
   399
# else
williamr@2
   400
      this->insert(begin(), __n, _Tp()); 
williamr@2
   401
# endif
williamr@2
   402
    }
williamr@2
   403
williamr@2
   404
#ifdef _STLP_MEMBER_TEMPLATES
williamr@2
   405
  // We don't need any dispatching tricks here, because insert does all of
williamr@2
   406
  // that anyway.
williamr@2
   407
# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
williamr@2
   408
  template <class _InputIterator>
williamr@2
   409
  list(_InputIterator __first, _InputIterator __last)
williamr@2
   410
    : _List_base<_Tp, _Alloc>(allocator_type())
williamr@2
   411
  { 
williamr@2
   412
    _STLP_PUSH_CLEANUP_ITEM(_Base, this)
williamr@2
   413
    insert(begin(), __first, __last); 
williamr@2
   414
    _STLP_POP_CLEANUP_ITEM
williamr@2
   415
  }
williamr@2
   416
# endif  
williamr@2
   417
williamr@2
   418
  template <class _InputIterator>
williamr@2
   419
  list(_InputIterator __first, _InputIterator __last,
williamr@2
   420
       const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL)
williamr@2
   421
    : _List_base<_Tp, _Alloc>(__a)
williamr@2
   422
  { 
williamr@2
   423
    _STLP_PUSH_CLEANUP_ITEM(_Base, this)
williamr@2
   424
    insert(begin(), __first, __last); 
williamr@2
   425
    _STLP_POP_CLEANUP_ITEM
williamr@2
   426
  }
williamr@2
   427
  
williamr@2
   428
#else /* _STLP_MEMBER_TEMPLATES */
williamr@2
   429
williamr@2
   430
  list(const _Tp* __first, const _Tp* __last,
williamr@2
   431
       const allocator_type& __a = allocator_type())
williamr@2
   432
    : _List_base<_Tp, _Alloc>(__a)
williamr@2
   433
  { 
williamr@2
   434
    _STLP_PUSH_CLEANUP_ITEM(_Base, this)
williamr@2
   435
    insert(begin(), __first, __last); 
williamr@2
   436
    _STLP_POP_CLEANUP_ITEM
williamr@2
   437
  }
williamr@2
   438
  list(const_iterator __first, const_iterator __last,
williamr@2
   439
       const allocator_type& __a = allocator_type())
williamr@2
   440
    : _List_base<_Tp, _Alloc>(__a)
williamr@2
   441
    { 
williamr@2
   442
      _STLP_PUSH_CLEANUP_ITEM(_Base, this)
williamr@2
   443
      insert(begin(), __first, __last); 
williamr@2
   444
      _STLP_POP_CLEANUP_ITEM
williamr@2
   445
    }
williamr@2
   446
williamr@2
   447
#endif /* _STLP_MEMBER_TEMPLATES */
williamr@2
   448
  list(const list<_Tp, _Alloc>& __x) : _List_base<_Tp, _Alloc>(__x.get_allocator())
williamr@2
   449
    {
williamr@2
   450
      _STLP_PUSH_CLEANUP_ITEM(_Base, this)
williamr@2
   451
      insert(begin(), __x.begin(), __x.end()); 
williamr@2
   452
      _STLP_POP_CLEANUP_ITEM
williamr@2
   453
    }
williamr@2
   454
williamr@2
   455
  ~list() { }
williamr@2
   456
williamr@2
   457
  list<_Tp, _Alloc>& operator=(const list<_Tp, _Alloc>& __x);
williamr@2
   458
williamr@2
   459
public:
williamr@2
   460
  // assign(), a generalized assignment member function.  Two
williamr@2
   461
  // versions: one that takes a count, and one that takes a range.
williamr@2
   462
  // The range version is a member template, so we dispatch on whether
williamr@2
   463
  // or not the type is an integer.
williamr@2
   464
williamr@2
   465
  void assign(size_type __n, const _Tp& __val) { _M_fill_assign(__n, __val); }
williamr@2
   466
williamr@2
   467
  void _M_fill_assign(size_type __n, const _Tp& __val);
williamr@2
   468
williamr@2
   469
#ifdef _STLP_MEMBER_TEMPLATES
williamr@2
   470
williamr@2
   471
  template <class _InputIterator>
williamr@2
   472
  void assign(_InputIterator __first, _InputIterator __last) {
williamr@2
   473
    typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
williamr@2
   474
    _M_assign_dispatch(__first, __last, _Integral());
williamr@2
   475
  }
williamr@2
   476
williamr@2
   477
  template <class _Integer>
williamr@2
   478
  void _M_assign_dispatch(_Integer __n, _Integer __val, const __true_type&)
williamr@2
   479
    { assign((size_type) __n, (_Tp) __val); }
williamr@2
   480
williamr@2
   481
  template <class _InputIterator>
williamr@2
   482
  void _M_assign_dispatch(_InputIterator __first2, _InputIterator __last2,
williamr@2
   483
                          const __false_type&) {
williamr@2
   484
    iterator __first1 = begin();
williamr@2
   485
    iterator __last1 = end();
williamr@2
   486
    for ( ; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2)
williamr@2
   487
      *__first1 = *__first2;
williamr@2
   488
    if (__first2 == __last2)
williamr@2
   489
      erase(__first1, __last1);
williamr@2
   490
    else
williamr@2
   491
      insert(__last1, __first2, __last2);
williamr@2
   492
  }
williamr@2
   493
williamr@2
   494
#endif /* _STLP_MEMBER_TEMPLATES */
williamr@2
   495
williamr@2
   496
public:
williamr@2
   497
  void splice(iterator __position, _Self& __x) {
williamr@2
   498
    if (!__x.empty()) 
williamr@2
   499
      _List_global_inst::_Transfer(__position._M_node, __x.begin()._M_node, __x.end()._M_node);
williamr@2
   500
  }
williamr@2
   501
  void splice(iterator __position, _Self&, iterator __i) {
williamr@2
   502
    iterator __j = __i;
williamr@2
   503
    ++__j;
williamr@2
   504
    if (__position == __i || __position == __j) return;
williamr@2
   505
    _List_global_inst::_Transfer(__position._M_node, __i._M_node, __j._M_node);
williamr@2
   506
  }
williamr@2
   507
  void splice(iterator __position, _Self&, iterator __first, iterator __last) {
williamr@2
   508
    if (__first != __last) 
williamr@2
   509
      _List_global_inst::_Transfer(__position._M_node, __first._M_node, __last._M_node);
williamr@2
   510
  }
williamr@2
   511
williamr@2
   512
  void remove(const _Tp& __val) {
williamr@2
   513
    iterator __first = begin();
williamr@2
   514
    iterator __last = end();
williamr@2
   515
    while (__first != __last) {
williamr@2
   516
      iterator __next = __first;
williamr@2
   517
      ++__next;
williamr@2
   518
      if (__val == *__first) erase(__first);
williamr@2
   519
      __first = __next;
williamr@2
   520
    }
williamr@2
   521
  }
williamr@2
   522
  
williamr@2
   523
  void unique() {
williamr@2
   524
    _S_unique(*this, equal_to<_Tp>());
williamr@2
   525
  }
williamr@2
   526
  
williamr@2
   527
  void merge(_Self& __x) {
williamr@2
   528
    _S_merge(*this, __x, less<_Tp>());
williamr@2
   529
  }
williamr@2
   530
williamr@2
   531
  void reverse() {
williamr@2
   532
    _List_node_base* __p = this->_M_node._M_data;
williamr@2
   533
    _List_node_base* __tmp = __p;
williamr@2
   534
    do {
williamr@2
   535
      _STLP_STD::swap(__tmp->_M_next, __tmp->_M_prev);
williamr@2
   536
      __tmp = __tmp->_M_prev;     // Old next node is now prev.
williamr@2
   537
    } while (__tmp != __p);
williamr@2
   538
  }    
williamr@2
   539
  
williamr@2
   540
  void sort() {
williamr@2
   541
    _S_sort(*this, less<_Tp>());
williamr@2
   542
  }
williamr@2
   543
williamr@2
   544
#ifdef _STLP_MEMBER_TEMPLATES
williamr@2
   545
  template <class _Predicate> void remove_if(_Predicate __pred)  {
williamr@2
   546
    _S_remove_if(*this, __pred);
williamr@2
   547
  }
williamr@2
   548
  template <class _BinaryPredicate>
williamr@2
   549
    void unique(_BinaryPredicate __binary_pred) {
williamr@2
   550
    _S_unique(*this, __binary_pred);
williamr@2
   551
  }
williamr@2
   552
williamr@2
   553
  template <class _StrictWeakOrdering>
williamr@2
   554
    void merge(list<_Tp, _Alloc>& __x,
williamr@2
   555
	  _StrictWeakOrdering __comp) {
williamr@2
   556
    _S_merge(*this, __x, __comp);
williamr@2
   557
  }
williamr@2
   558
williamr@2
   559
  template <class _StrictWeakOrdering>
williamr@2
   560
    void sort(_StrictWeakOrdering __comp) {
williamr@2
   561
    _S_sort(*this, __comp);
williamr@2
   562
  }
williamr@2
   563
#endif /* _STLP_MEMBER_TEMPLATES */
williamr@2
   564
williamr@2
   565
#ifdef _STLP_USE_TRAP_LEAVE
williamr@2
   566
public:
williamr@2
   567
  static void* operator new (size_t __n, TLeave) { return _STLP_StackHelper<bool>::_NewLC(__n); }
williamr@2
   568
  static void* operator new (size_t __n) { return _STLP_StackHelper<bool>::_NewLC(__n); }
williamr@2
   569
#endif
williamr@2
   570
williamr@2
   571
};
williamr@2
   572
williamr@2
   573
template <class _Tp, class _Alloc>
williamr@2
   574
_STLP_INLINE_LOOP bool  _STLP_CALL
williamr@2
   575
operator==(const list<_Tp,_Alloc>& __x, const list<_Tp,_Alloc>& __y)
williamr@2
   576
{
williamr@2
   577
  typedef typename list<_Tp,_Alloc>::const_iterator const_iterator;
williamr@2
   578
  const_iterator __end1 = __x.end();
williamr@2
   579
  const_iterator __end2 = __y.end();
williamr@2
   580
williamr@2
   581
  const_iterator __i1 = __x.begin();
williamr@2
   582
  const_iterator __i2 = __y.begin();
williamr@2
   583
  while (__i1 != __end1 && __i2 != __end2 && *__i1 == *__i2) {
williamr@2
   584
    ++__i1;
williamr@2
   585
    ++__i2;
williamr@2
   586
  }
williamr@2
   587
  return __i1 == __end1 && __i2 == __end2;
williamr@2
   588
}
williamr@2
   589
williamr@2
   590
# define _STLP_EQUAL_OPERATOR_SPECIALIZED
williamr@2
   591
# define _STLP_TEMPLATE_HEADER    template <class _Tp, class _Alloc>
williamr@2
   592
# define _STLP_TEMPLATE_CONTAINER list<_Tp, _Alloc>
williamr@2
   593
# include <stl/_relops_cont.h>
williamr@2
   594
# undef _STLP_TEMPLATE_CONTAINER
williamr@2
   595
# undef _STLP_TEMPLATE_HEADER
williamr@2
   596
# undef _STLP_EQUAL_OPERATOR_SPECIALIZED
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/_list.c>
williamr@2
   602
# endif
williamr@2
   603
williamr@2
   604
// do a cleanup
williamr@2
   605
# undef list
williamr@2
   606
# define __list__ __FULL_NAME(list)
williamr@2
   607
williamr@2
   608
#if defined (_STLP_DEBUG)
williamr@2
   609
# include <stl/debug/_list.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/_list.h>
williamr@2
   614
#endif
williamr@2
   615
williamr@2
   616
#endif /* _STLP_INTERNAL_LIST_H */
williamr@2
   617
williamr@2
   618
// Local Variables:
williamr@2
   619
// mode:C++
williamr@2
   620
// End: