diff options
Diffstat (limited to '')
-rw-r--r-- | src/list.h | 106 | ||||
-rw-r--r-- | src/tests/list.cpp | 19 |
2 files changed, 75 insertions, 50 deletions
@@ -149,19 +149,24 @@ namespace Bu | |||
149 | friend class List<value, valuealloc, linkalloc>; | 149 | friend class List<value, valuealloc, linkalloc>; |
150 | private: | 150 | private: |
151 | Link *pLink; | 151 | Link *pLink; |
152 | iterator() : | 152 | MyType &rList; |
153 | pLink( NULL ) | 153 | bool bOffFront; |
154 | iterator( MyType &rList ) : | ||
155 | pLink( NULL ), | ||
156 | rList( rList ) | ||
154 | { | 157 | { |
155 | } | 158 | } |
156 | 159 | ||
157 | iterator( Link *pLink ) : | 160 | iterator( Link *pLink, MyType &rList ) : |
158 | pLink( pLink ) | 161 | pLink( pLink ), |
162 | rList( rList ) | ||
159 | { | 163 | { |
160 | } | 164 | } |
161 | 165 | ||
162 | public: | 166 | public: |
163 | iterator( const iterator &i ) : | 167 | iterator( const iterator &i ) : |
164 | pLink( i.pLink ) | 168 | pLink( i.pLink ), |
169 | rList( i.rList ) | ||
165 | { | 170 | { |
166 | } | 171 | } |
167 | 172 | ||
@@ -223,43 +228,43 @@ namespace Bu | |||
223 | return pLink->pValue; | 228 | return pLink->pValue; |
224 | } | 229 | } |
225 | 230 | ||
226 | /** | ||
227 | * Increment operator. | ||
228 | */ | ||
229 | iterator &operator++() | 231 | iterator &operator++() |
230 | { | 232 | { |
231 | if( pLink != NULL ) | 233 | if( pLink == NULL ) |
234 | pLink = (bOffFront)?(rList.pFirst):(NULL); | ||
235 | else | ||
232 | pLink = pLink->pNext; | 236 | pLink = pLink->pNext; |
237 | bOffFront = false; | ||
233 | return *this; | 238 | return *this; |
234 | } | 239 | } |
235 | 240 | ||
236 | /** | ||
237 | * Decrement operator. | ||
238 | */ | ||
239 | iterator &operator--() | 241 | iterator &operator--() |
240 | { | 242 | { |
241 | if( pLink != NULL ) | 243 | if( pLink == NULL ) |
244 | pLink = (bOffFront)?(NULL):(rList.pLast); | ||
245 | else | ||
242 | pLink = pLink->pPrev; | 246 | pLink = pLink->pPrev; |
247 | bOffFront = true; | ||
243 | return *this; | 248 | return *this; |
244 | } | 249 | } |
245 | 250 | ||
246 | /** | ||
247 | * Increment operator. | ||
248 | */ | ||
249 | iterator &operator++( int ) | 251 | iterator &operator++( int ) |
250 | { | 252 | { |
251 | if( pLink != NULL ) | 253 | if( pLink == NULL ) |
254 | pLink = (bOffFront)?(rList.pFirst):(NULL); | ||
255 | else | ||
252 | pLink = pLink->pNext; | 256 | pLink = pLink->pNext; |
257 | bOffFront = false; | ||
253 | return *this; | 258 | return *this; |
254 | } | 259 | } |
255 | 260 | ||
256 | /** | ||
257 | * Decrement operator. | ||
258 | */ | ||
259 | iterator &operator--( int ) | 261 | iterator &operator--( int ) |
260 | { | 262 | { |
261 | if( pLink != NULL ) | 263 | if( pLink == NULL ) |
264 | pLink = (bOffFront)?(NULL):(rList.pLast); | ||
265 | else | ||
262 | pLink = pLink->pPrev; | 266 | pLink = pLink->pPrev; |
267 | bOffFront = true; | ||
263 | return *this; | 268 | return *this; |
264 | } | 269 | } |
265 | 270 | ||
@@ -283,19 +288,24 @@ namespace Bu | |||
283 | friend class List<value, valuealloc, linkalloc>; | 288 | friend class List<value, valuealloc, linkalloc>; |
284 | private: | 289 | private: |
285 | Link *pLink; | 290 | Link *pLink; |
286 | const_iterator() : | 291 | const MyType &rList; |
287 | pLink( NULL ) | 292 | bool bOffFront; |
293 | const_iterator( const MyType &rList ) : | ||
294 | pLink( NULL ), | ||
295 | rList( rList ) | ||
288 | { | 296 | { |
289 | } | 297 | } |
290 | 298 | ||
291 | const_iterator( Link *pLink ) : | 299 | const_iterator( Link *pLink, const MyType &rList ) : |
292 | pLink( pLink ) | 300 | pLink( pLink ), |
301 | rList( rList ) | ||
293 | { | 302 | { |
294 | } | 303 | } |
295 | 304 | ||
296 | public: | 305 | public: |
297 | const_iterator( const iterator &i ) : | 306 | const_iterator( const iterator &i ) : |
298 | pLink( i.pLink ) | 307 | pLink( i.pLink ), |
308 | rList( i.rList ) | ||
299 | { | 309 | { |
300 | } | 310 | } |
301 | 311 | ||
@@ -331,29 +341,41 @@ namespace Bu | |||
331 | 341 | ||
332 | const_iterator &operator++() | 342 | const_iterator &operator++() |
333 | { | 343 | { |
334 | if( pLink != NULL ) | 344 | if( pLink == NULL ) |
345 | pLink = (bOffFront)?(rList.pFirst):(NULL); | ||
346 | else | ||
335 | pLink = pLink->pNext; | 347 | pLink = pLink->pNext; |
348 | bOffFront = false; | ||
336 | return *this; | 349 | return *this; |
337 | } | 350 | } |
338 | 351 | ||
339 | const_iterator &operator--() | 352 | const_iterator &operator--() |
340 | { | 353 | { |
341 | if( pLink != NULL ) | 354 | if( pLink == NULL ) |
355 | pLink = (bOffFront)?(NULL):(rList.pLast); | ||
356 | else | ||
342 | pLink = pLink->pPrev; | 357 | pLink = pLink->pPrev; |
358 | bOffFront = true; | ||
343 | return *this; | 359 | return *this; |
344 | } | 360 | } |
345 | 361 | ||
346 | const_iterator &operator++( int ) | 362 | const_iterator &operator++( int ) |
347 | { | 363 | { |
348 | if( pLink != NULL ) | 364 | if( pLink == NULL ) |
365 | pLink = (bOffFront)?(rList.pFirst):(NULL); | ||
366 | else | ||
349 | pLink = pLink->pNext; | 367 | pLink = pLink->pNext; |
368 | bOffFront = false; | ||
350 | return *this; | 369 | return *this; |
351 | } | 370 | } |
352 | 371 | ||
353 | const_iterator &operator--( int ) | 372 | const_iterator &operator--( int ) |
354 | { | 373 | { |
355 | if( pLink != NULL ) | 374 | if( pLink == NULL ) |
375 | pLink = (bOffFront)?(NULL):(rList.pLast); | ||
376 | else | ||
356 | pLink = pLink->pPrev; | 377 | pLink = pLink->pPrev; |
378 | bOffFront = true; | ||
357 | return *this; | 379 | return *this; |
358 | } | 380 | } |
359 | 381 | ||
@@ -376,16 +398,16 @@ namespace Bu | |||
376 | */ | 398 | */ |
377 | iterator begin() | 399 | iterator begin() |
378 | { | 400 | { |
379 | return iterator( pFirst ); | 401 | return iterator( pFirst, *this ); |
380 | } | 402 | } |
381 | 403 | ||
382 | /** | 404 | /** |
383 | * Get a const iterator pointing to the first item in the list. | 405 | * Get a const iterator pointing to the first item in the list. |
384 | *@returns (const const_iterator) | 406 | *@returns (const const_iterator) |
385 | */ | 407 | */ |
386 | const const_iterator begin() const | 408 | const_iterator begin() const |
387 | { | 409 | { |
388 | return const_iterator( pFirst ); | 410 | return const_iterator( pFirst, *this ); |
389 | } | 411 | } |
390 | 412 | ||
391 | /** | 413 | /** |
@@ -399,27 +421,13 @@ namespace Bu | |||
399 | } | 421 | } |
400 | 422 | ||
401 | /** | 423 | /** |
402 | * Erase an item from the list. After erasing the iterator will point | 424 | * Erase an item from the list. |
403 | * to an invalid location and should be ignored. To erase an item from | ||
404 | * a list in a loop you should create a backup iterator. | ||
405 | *@code | ||
406 | for( List<>::iterator i = l.begin(); i != l.end(); i++ ) | ||
407 | { | ||
408 | if( ...(needs delete)... ) | ||
409 | { | ||
410 | List<>::iterator prev = i; | ||
411 | prev--; | ||
412 | l.erase( i ); | ||
413 | i = prev; | ||
414 | continue; | ||
415 | } | ||
416 | } | ||
417 | @endcode | ||
418 | *@param i (iterator) The item to erase. | 425 | *@param i (iterator) The item to erase. |
419 | */ | 426 | */ |
420 | void erase( iterator i ) | 427 | void erase( iterator i ) |
421 | { | 428 | { |
422 | Link *pCur = i.pLink; | 429 | Link *pCur = i.pLink; |
430 | if( pCur == NULL ) return; | ||
423 | Link *pPrev = pCur->pPrev; | 431 | Link *pPrev = pCur->pPrev; |
424 | if( pPrev == NULL ) | 432 | if( pPrev == NULL ) |
425 | { | 433 | { |
diff --git a/src/tests/list.cpp b/src/tests/list.cpp index 12807a5..edbe288 100644 --- a/src/tests/list.cpp +++ b/src/tests/list.cpp | |||
@@ -18,6 +18,21 @@ int main() | |||
18 | l.prepend( -j ); | 18 | l.prepend( -j ); |
19 | } | 19 | } |
20 | 20 | ||
21 | { | ||
22 | Bu::List<int>::iterator i = l.begin(); | ||
23 | Bu::List<int>::iterator j = i; | ||
24 | int a, b; | ||
25 | a = *j; | ||
26 | printf("end: %s\n", (j != l.end())?"no":"yes"); | ||
27 | j--; | ||
28 | printf("end: %s\n", (j != l.end())?"no":"yes"); | ||
29 | j++; | ||
30 | printf("end: %s\n", (j != l.end())?"no":"yes"); | ||
31 | i = j; | ||
32 | b = *i; | ||
33 | printf("%d -> %d\n", a, b ); | ||
34 | } | ||
35 | |||
21 | for( Bu::List<int>::iterator i = l.begin(); i != l.end(); i++ ) | 36 | for( Bu::List<int>::iterator i = l.begin(); i != l.end(); i++ ) |
22 | { | 37 | { |
23 | printf("%d ", *i ); | 38 | printf("%d ", *i ); |
@@ -25,9 +40,11 @@ int main() | |||
25 | printf("\n"); | 40 | printf("\n"); |
26 | for( Bu::List<int>::iterator i = l.begin(); i != l.end(); i++ ) | 41 | for( Bu::List<int>::iterator i = l.begin(); i != l.end(); i++ ) |
27 | { | 42 | { |
43 | Bu::List<int>::iterator j = i; j--; | ||
28 | l.erase( i ); | 44 | l.erase( i ); |
45 | i = j; | ||
29 | if( i != l.end() ) | 46 | if( i != l.end() ) |
30 | printf("%d ", *i ); | 47 | printf("!%d ", *i ); |
31 | } | 48 | } |
32 | 49 | ||
33 | printf("\n\n"); | 50 | printf("\n\n"); |