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:
|