epoc32/include/stdapis/stlportv5/stl/_slist.c
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:27:01 +0100
branchSymbian2
changeset 3 e1b950c65cb4
parent 2 epoc32/include/stdapis/stlport/stl/_slist.c@2fe1408b6811
child 4 837f303aceeb
permissions -rw-r--r--
Attempt to represent the S^2->S^3 header reorganisation as a series of "hg rename" operations
williamr@2
     1
/*
williamr@2
     2
 *
williamr@2
     3
 * Copyright (c) 1996,1997
williamr@2
     4
 * Silicon Graphics Computer Systems, Inc.
williamr@2
     5
 *
williamr@2
     6
 * Copyright (c) 1999 
williamr@2
     7
 * Boris Fomitchev
williamr@2
     8
 *
williamr@2
     9
 * This material is provided "as is", with absolutely no warranty expressed
williamr@2
    10
 * or implied. Any use is at your own risk.
williamr@2
    11
 *
williamr@2
    12
 * Permission to use or copy this software for any purpose is hereby granted 
williamr@2
    13
 * without fee, provided the above notices are retained on all copies.
williamr@2
    14
 * Permission to modify the code and to distribute modified code is granted,
williamr@2
    15
 * provided the above notices are retained, and a notice that the code was
williamr@2
    16
 * modified is included with the above copyright notice.
williamr@2
    17
 *
williamr@2
    18
 */
williamr@2
    19
#ifndef _STLP_SLIST_C
williamr@2
    20
#define _STLP_SLIST_C
williamr@2
    21
williamr@2
    22
#ifndef _STLP_INTERNAL_SLIST_H
williamr@2
    23
# include <stl/_slist.h>
williamr@2
    24
#endif
williamr@2
    25
williamr@2
    26
# undef slist
williamr@2
    27
# define  slist  __WORKAROUND_DBG_RENAME(slist)
williamr@2
    28
# if defined (_STLP_NESTED_TYPE_PARAM_BUG) 
williamr@2
    29
#  define size_type          size_t
williamr@2
    30
# endif
williamr@2
    31
williamr@2
    32
_STLP_BEGIN_NAMESPACE
williamr@2
    33
williamr@2
    34
template <class _Tp, class _Alloc> 
williamr@2
    35
_Slist_node_base*
williamr@2
    36
_Slist_base<_Tp,_Alloc>::_M_erase_after(_Slist_node_base* __before_first,
williamr@2
    37
                                        _Slist_node_base* __last_node) {
williamr@2
    38
  _Slist_node<_Tp>* __cur = (_Slist_node<_Tp>*) (__before_first->_M_next);
williamr@2
    39
  while (__cur != __last_node) {
williamr@2
    40
    _Slist_node<_Tp>* __tmp = __cur;
williamr@2
    41
    __cur = (_Slist_node<_Tp>*) __cur->_M_next;
williamr@2
    42
    _STLP_STD::_Destroy(&__tmp->_M_data);
williamr@2
    43
    _M_head.deallocate(__tmp,1);
williamr@2
    44
  }
williamr@2
    45
  __before_first->_M_next = __last_node;
williamr@2
    46
  return __last_node;
williamr@2
    47
}
williamr@2
    48
williamr@2
    49
template <class _Tp, class _Alloc>
williamr@2
    50
slist<_Tp,_Alloc>& slist<_Tp,_Alloc>::operator=(const slist<_Tp,_Alloc>& __x)
williamr@2
    51
{
williamr@2
    52
  if (&__x != this) {
williamr@2
    53
    _Node_base* __p1 = &this->_M_head._M_data;
williamr@2
    54
    _Node* __n1 = (_Node*) this->_M_head._M_data._M_next;
williamr@2
    55
    const _Node* __n2 = (const _Node*) __x._M_head._M_data._M_next;
williamr@2
    56
    while (__n1 && __n2) {
williamr@2
    57
      __n1->_M_data = __n2->_M_data;
williamr@2
    58
      __p1 = __n1;
williamr@2
    59
      __n1 = (_Node*) __n1->_M_next;
williamr@2
    60
      __n2 = (const _Node*) __n2->_M_next;
williamr@2
    61
    }
williamr@2
    62
    if (__n2 == 0)
williamr@2
    63
      this->_M_erase_after(__p1, 0);
williamr@2
    64
    else
williamr@2
    65
      _M_insert_after_range(__p1, const_iterator((_Node*)__n2), 
williamr@2
    66
                                  const_iterator(0));
williamr@2
    67
  }
williamr@2
    68
  return *this;
williamr@2
    69
}
williamr@2
    70
williamr@2
    71
template <class _Tp, class _Alloc>
williamr@2
    72
void slist<_Tp, _Alloc>::_M_fill_assign(size_type __n, const _Tp& __val) {
williamr@2
    73
  _Node_base* __prev = &this->_M_head._M_data;
williamr@2
    74
  _Node* __node = (_Node*) this->_M_head._M_data._M_next;
williamr@2
    75
  for ( ; __node != 0 && __n > 0 ; --__n) {
williamr@2
    76
    __node->_M_data = __val;
williamr@2
    77
    __prev = __node;
williamr@2
    78
    __node = (_Node*) __node->_M_next;
williamr@2
    79
  }
williamr@2
    80
  if (__n > 0)
williamr@2
    81
    _M_insert_after_fill(__prev, __n, __val);
williamr@2
    82
  else
williamr@2
    83
    this->_M_erase_after(__prev, 0);
williamr@2
    84
}
williamr@2
    85
williamr@2
    86
williamr@2
    87
template <class _Tp, class _Alloc>
williamr@2
    88
void slist<_Tp,_Alloc>::resize(size_type __len, const _Tp& __x)
williamr@2
    89
{
williamr@2
    90
  _Node_base* __cur = &this->_M_head._M_data;
williamr@2
    91
  while (__cur->_M_next != 0 && __len > 0) {
williamr@2
    92
    --__len;
williamr@2
    93
    __cur = __cur->_M_next;
williamr@2
    94
  }
williamr@2
    95
  if (__cur->_M_next) 
williamr@2
    96
    this->_M_erase_after(__cur, 0);
williamr@2
    97
  else
williamr@2
    98
    _M_insert_after_fill(__cur, __len, __x);
williamr@2
    99
}
williamr@2
   100
williamr@2
   101
template <class _Tp, class _Alloc>
williamr@2
   102
void slist<_Tp,_Alloc>::remove(const _Tp& __val)
williamr@2
   103
{
williamr@2
   104
  _Node_base* __cur = &this->_M_head._M_data;
williamr@2
   105
  while (__cur && __cur->_M_next) {
williamr@2
   106
    if (((_Node*) __cur->_M_next)->_M_data == __val)
williamr@2
   107
      this->_M_erase_after(__cur);
williamr@2
   108
    else
williamr@2
   109
      __cur = __cur->_M_next;
williamr@2
   110
  }
williamr@2
   111
}
williamr@2
   112
williamr@2
   113
template <class _Tp, class _Alloc> 
williamr@2
   114
void slist<_Tp,_Alloc>::unique()
williamr@2
   115
{
williamr@2
   116
  _Node_base* __cur = this->_M_head._M_data._M_next;
williamr@2
   117
  if (__cur) {
williamr@2
   118
    while (__cur->_M_next) {
williamr@2
   119
      if (((_Node*)__cur)->_M_data == 
williamr@2
   120
          ((_Node*)(__cur->_M_next))->_M_data)
williamr@2
   121
        this->_M_erase_after(__cur);
williamr@2
   122
      else
williamr@2
   123
        __cur = __cur->_M_next;
williamr@2
   124
    }
williamr@2
   125
  }
williamr@2
   126
}
williamr@2
   127
williamr@2
   128
template <class _Tp, class _Alloc>
williamr@2
   129
void slist<_Tp,_Alloc>::merge(slist<_Tp,_Alloc>& __x)
williamr@2
   130
{
williamr@2
   131
  _Node_base* __n1 = &this->_M_head._M_data;
williamr@2
   132
  while (__n1->_M_next && __x._M_head._M_data._M_next) {
williamr@2
   133
    if (((_Node*) __x._M_head._M_data._M_next)->_M_data < 
williamr@2
   134
        ((_Node*)       __n1->_M_next)->_M_data) 
williamr@2
   135
      _Sl_global_inst::__splice_after(__n1, &__x._M_head._M_data, __x._M_head._M_data._M_next);
williamr@2
   136
    __n1 = __n1->_M_next;
williamr@2
   137
  }
williamr@2
   138
  if (__x._M_head._M_data._M_next) {
williamr@2
   139
    __n1->_M_next = __x._M_head._M_data._M_next;
williamr@2
   140
    __x._M_head._M_data._M_next = 0;
williamr@2
   141
  }
williamr@2
   142
}
williamr@2
   143
williamr@2
   144
template <class _Tp, class _Alloc>
williamr@2
   145
void slist<_Tp,_Alloc>::sort()
williamr@2
   146
{
williamr@2
   147
  if (this->_M_head._M_data._M_next && this->_M_head._M_data._M_next->_M_next) {
williamr@2
   148
    _Self __carry;
williamr@2
   149
    _Self __counter[64];
williamr@2
   150
    int __fill = 0;
williamr@2
   151
    while (!empty()) {
williamr@2
   152
      _Sl_global_inst::__splice_after(&__carry._M_head._M_data, &this->_M_head._M_data, this->_M_head._M_data._M_next);
williamr@2
   153
      int __i = 0;
williamr@2
   154
      while (__i < __fill && !__counter[__i].empty()) {
williamr@2
   155
        __counter[__i].merge(__carry);
williamr@2
   156
        __carry.swap(__counter[__i]);
williamr@2
   157
        ++__i;
williamr@2
   158
      }
williamr@2
   159
      __carry.swap(__counter[__i]);
williamr@2
   160
      if (__i == __fill)
williamr@2
   161
        ++__fill;
williamr@2
   162
    }
williamr@2
   163
williamr@2
   164
    for (int __i = 1; __i < __fill; ++__i)
williamr@2
   165
      __counter[__i].merge(__counter[__i-1]);
williamr@2
   166
    this->swap(__counter[__fill-1]);
williamr@2
   167
  }
williamr@2
   168
}
williamr@2
   169
williamr@2
   170
# undef slist
williamr@2
   171
# undef size_type
williamr@2
   172
williamr@2
   173
_STLP_END_NAMESPACE
williamr@2
   174
williamr@2
   175
#endif /*  _STLP_SLIST_C */
williamr@2
   176
williamr@2
   177
// Local Variables:
williamr@2
   178
// mode:C++
williamr@2
   179
// End: