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"); |
