1 : //=============================================================================
2 : // File <$/src/cpp/prod/tool/SList.cpp>
3 : // This file is part of YaOrb : Yet Another Object Request Broker,
4 : // Copyright (c) 2000-2003, Marc Alff.
5 : //
6 : // This program is free software; you can redistribute it and/or
7 : // modify it under the terms of the GNU General Public License
8 : // as published by the Free Software Foundation; either version 2
9 : // of the License, or (at your option) any later version.
10 : //
11 : // This program is distributed in the hope that it will be useful,
12 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : // GNU General Public License for more details.
15 : //
16 : // You should have received a copy of the GNU General Public License
17 : // along with this program; if not, write to the Free Software
18 : // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 : //
20 : //=============================================================================
21 :
22 : #include <stdio.h>
23 :
24 : #include "src/cpp/prod/tool/Assert.h"
25 : #include "src/cpp/prod/tool/SList.h"
26 :
27 0 : SListItem::SListItem()
28 0 : : _next(NULL), _item(NULL)
29 : {
30 : }
31 :
32 46064 : SListItem::SListItem(void *anObj)
33 46064 : : _next(NULL), _item(anObj)
34 : {
35 : }
36 :
37 0 : SListItem::~SListItem()
38 0 : {}
39 :
40 174233 : SList::SList()
41 174233 : : _head(NULL), _tail(NULL), _size(0)
42 : {
43 : }
44 :
45 4865 : SList::SList(void *anObj)
46 4865 : : _head(NULL), _tail(NULL), _size(0)
47 : {
48 4865 : _head = new SListItem(anObj) ;
49 4865 : _tail = _head ;
50 4865 : _size = 1 ;
51 : }
52 :
53 23683 : SList::~SList()
54 : {
55 23683 : clear() ;
56 : }
57 :
58 13621 : int SList::size() const
59 : {
60 : return _size ;
61 : }
62 :
63 3 : bool SList::isEmpty() const
64 : {
65 : return ((_size==0) ? true : false) ;
66 : }
67 :
68 :
69 0 : void SList::addHead(void *anObj)
70 : {
71 : SListItem *newItem ;
72 :
73 0 : newItem = new SListItem(anObj) ;
74 0 : newItem->_next = _head ;
75 :
76 0 : if (_head == NULL)
77 : {
78 0 : _tail = newItem ;
79 : }
80 :
81 0 : _head = newItem ;
82 0 : _size++ ;
83 : }
84 :
85 0 : void SList::appendAndClear(SList& aList)
86 : {
87 0 : if (aList._size == 0)
88 : {
89 : ASSERT(aList._head == NULL) ;
90 : ASSERT(aList._tail == NULL) ;
91 0 : return ;
92 : }
93 :
94 : ASSERT(aList._head != NULL) ;
95 : ASSERT(aList._tail != NULL) ;
96 :
97 0 : if (_size == 0)
98 : {
99 : ASSERT(_head == NULL) ;
100 : ASSERT(_tail == NULL) ;
101 :
102 0 : _head = aList._head ;
103 0 : _tail = aList._tail ;
104 0 : _size = aList._size ;
105 :
106 0 : aList._head = NULL ;
107 0 : aList._tail = NULL ;
108 0 : aList._size = 0 ;
109 :
110 0 : return ;
111 : }
112 :
113 : SListItem *lastOne, *firstSecond ;
114 : lastOne = _tail ;
115 : firstSecond = aList._head ;
116 :
117 0 : lastOne->_next = firstSecond ;
118 :
119 0 : _tail = aList._tail ;
120 0 : _size += aList._size ;
121 :
122 0 : aList._head = NULL ;
123 0 : aList._tail = NULL ;
124 0 : aList._size = 0 ;
125 :
126 : return ;
127 : }
128 :
129 41199 : void SList::addTail(void *anObj)
130 : {
131 : SListItem *newItem ;
132 :
133 41199 : newItem = new SListItem(anObj) ;
134 41199 : newItem->_next = NULL ;
135 :
136 41199 : if (_tail == NULL)
137 : {
138 16331 : _head = newItem ;
139 : }
140 : else
141 : {
142 24868 : _tail->_next = newItem ;
143 : }
144 :
145 41199 : _tail = newItem ;
146 41199 : _size++ ;
147 : }
148 :
149 9356 : void *SList::head() const
150 : {
151 : ASSERT(_head != NULL) ;
152 :
153 : return _head->_item ;
154 : }
155 :
156 0 : void *SList::tail() const
157 : {
158 : ASSERT(_tail != NULL) ;
159 :
160 : return _tail->_item ;
161 : }
162 :
163 1498 : void* SList::removeHead()
164 : {
165 : void *result = NULL ;
166 :
167 1498 : if (_head != NULL)
168 : {
169 : SListItem *cursor = NULL ;
170 :
171 : cursor = _head ;
172 1498 : _head = _head->_next ;
173 1498 : if (_head == NULL)
174 : {
175 1498 : _tail = NULL ;
176 : }
177 :
178 1498 : result = cursor->_item ;
179 1498 : delete cursor ;
180 1498 : _size-- ;
181 : }
182 :
183 : return result ;
184 : }
185 :
186 476 : void SList::removeObject(void *anObj)
187 : {
188 : SListItem *prev = NULL ;
189 : SListItem *cursor = NULL ;
190 : SListItem *next = NULL ;
191 :
192 476 : cursor = _head ;
193 :
194 13714 : while (cursor != NULL)
195 : {
196 13714 : if (cursor->_item == anObj)
197 : {
198 : // Found (Equal by address !)
199 :
200 476 : next = cursor->_next ;
201 :
202 476 : if (prev == NULL)
203 : {
204 107 : _head = next ;
205 : }
206 : else
207 : {
208 369 : prev->_next = next ;
209 : }
210 :
211 476 : if (next == NULL)
212 : {
213 3 : _tail = prev ;
214 : }
215 :
216 : return ;
217 : }
218 : else
219 : {
220 : prev = cursor ;
221 13238 : cursor = cursor->_next ;
222 : }
223 : }
224 : }
225 :
226 46199 : void SList::clear()
227 : {
228 : SListItem *cursor ;
229 :
230 85249 : while (_head != NULL)
231 : {
232 39050 : cursor = _head->_next ;
233 39050 : delete _head ;
234 39050 : _head = cursor ;
235 : }
236 46199 : _size = 0 ;
237 46199 : _tail = NULL ;
238 : }
239 :
240 63 : SList& SList::operator=(const SList& L)
241 : {
242 63 : if (this != &L)
243 : {
244 63 : clear() ;
245 :
246 63 : SListIterator it(L) ;
247 :
248 195 : while (it.GetNext())
249 : {
250 69 : addTail(it.GetItem()) ;
251 0 : }
252 : }
253 :
254 : return *this ;
255 : }
256 :
257 : ////////////////////////////////////////////////////
258 :
259 63348 : SListIterator::SListIterator(const SList& aList)
260 63348 : : _cursor(NULL), _process(aList._head)
261 : {
262 : }
263 :
264 63348 : SListIterator::~SListIterator()
265 0 : {}
266 :
267 801758 : bool SListIterator::GetNext()
268 : {
269 801758 : if (_process == NULL)
270 : {
271 52454 : _cursor = NULL ;
272 52454 : return false ;
273 : }
274 :
275 749304 : _cursor = _process ;
276 749304 : _process = _process->_next ;
277 : return true ;
278 : }
279 :
280 749304 : void *SListIterator::GetItem() const
281 : {
282 : ASSERT(_cursor != NULL) ;
283 :
284 : return _cursor->_item ;
285 : }
286 :
|