@@ -3,9 +3,11 @@ use num::Wrapping;
3
3
4
4
mod iterator;
5
5
mod double_ended;
6
+ mod exact_size;
6
7
7
8
pub use self :: iterator:: Iterator ;
8
9
pub use self :: double_ended:: DoubleEndedIterator ;
10
+ pub use self :: exact_size:: ExactSizeIterator ;
9
11
10
12
/// Conversion from an `Iterator`.
11
13
///
@@ -357,149 +359,6 @@ impl Extend<()> for () {
357
359
}
358
360
}
359
361
360
- /// An iterator that knows its exact length.
361
- ///
362
- /// Many [`Iterator`]s don't know how many times they will iterate, but some do.
363
- /// If an iterator knows how many times it can iterate, providing access to
364
- /// that information can be useful. For example, if you want to iterate
365
- /// backwards, a good start is to know where the end is.
366
- ///
367
- /// When implementing an `ExactSizeIterator`, you must also implement
368
- /// [`Iterator`]. When doing so, the implementation of [`size_hint`] *must*
369
- /// return the exact size of the iterator.
370
- ///
371
- /// [`Iterator`]: trait.Iterator.html
372
- /// [`size_hint`]: trait.Iterator.html#method.size_hint
373
- ///
374
- /// The [`len`] method has a default implementation, so you usually shouldn't
375
- /// implement it. However, you may be able to provide a more performant
376
- /// implementation than the default, so overriding it in this case makes sense.
377
- ///
378
- /// [`len`]: #method.len
379
- ///
380
- /// # Examples
381
- ///
382
- /// Basic usage:
383
- ///
384
- /// ```
385
- /// // a finite range knows exactly how many times it will iterate
386
- /// let five = 0..5;
387
- ///
388
- /// assert_eq!(5, five.len());
389
- /// ```
390
- ///
391
- /// In the [module level docs][moddocs], we implemented an [`Iterator`],
392
- /// `Counter`. Let's implement `ExactSizeIterator` for it as well:
393
- ///
394
- /// [moddocs]: index.html
395
- ///
396
- /// ```
397
- /// # struct Counter {
398
- /// # count: usize,
399
- /// # }
400
- /// # impl Counter {
401
- /// # fn new() -> Counter {
402
- /// # Counter { count: 0 }
403
- /// # }
404
- /// # }
405
- /// # impl Iterator for Counter {
406
- /// # type Item = usize;
407
- /// # fn next(&mut self) -> Option<usize> {
408
- /// # self.count += 1;
409
- /// # if self.count < 6 {
410
- /// # Some(self.count)
411
- /// # } else {
412
- /// # None
413
- /// # }
414
- /// # }
415
- /// # }
416
- /// impl ExactSizeIterator for Counter {
417
- /// // We can easily calculate the remaining number of iterations.
418
- /// fn len(&self) -> usize {
419
- /// 5 - self.count
420
- /// }
421
- /// }
422
- ///
423
- /// // And now we can use it!
424
- ///
425
- /// let counter = Counter::new();
426
- ///
427
- /// assert_eq!(5, counter.len());
428
- /// ```
429
- #[ stable( feature = "rust1" , since = "1.0.0" ) ]
430
- pub trait ExactSizeIterator : Iterator {
431
- /// Returns the exact number of times the iterator will iterate.
432
- ///
433
- /// This method has a default implementation, so you usually should not
434
- /// implement it directly. However, if you can provide a more efficient
435
- /// implementation, you can do so. See the [trait-level] docs for an
436
- /// example.
437
- ///
438
- /// This function has the same safety guarantees as the [`size_hint`]
439
- /// function.
440
- ///
441
- /// [trait-level]: trait.ExactSizeIterator.html
442
- /// [`size_hint`]: trait.Iterator.html#method.size_hint
443
- ///
444
- /// # Examples
445
- ///
446
- /// Basic usage:
447
- ///
448
- /// ```
449
- /// // a finite range knows exactly how many times it will iterate
450
- /// let five = 0..5;
451
- ///
452
- /// assert_eq!(5, five.len());
453
- /// ```
454
- #[ inline]
455
- #[ stable( feature = "rust1" , since = "1.0.0" ) ]
456
- fn len ( & self ) -> usize {
457
- let ( lower, upper) = self . size_hint ( ) ;
458
- // Note: This assertion is overly defensive, but it checks the invariant
459
- // guaranteed by the trait. If this trait were rust-internal,
460
- // we could use debug_assert!; assert_eq! will check all Rust user
461
- // implementations too.
462
- assert_eq ! ( upper, Some ( lower) ) ;
463
- lower
464
- }
465
-
466
- /// Returns whether the iterator is empty.
467
- ///
468
- /// This method has a default implementation using `self.len()`, so you
469
- /// don't need to implement it yourself.
470
- ///
471
- /// # Examples
472
- ///
473
- /// Basic usage:
474
- ///
475
- /// ```
476
- /// #![feature(exact_size_is_empty)]
477
- ///
478
- /// let mut one_element = std::iter::once(0);
479
- /// assert!(!one_element.is_empty());
480
- ///
481
- /// assert_eq!(one_element.next(), Some(0));
482
- /// assert!(one_element.is_empty());
483
- ///
484
- /// assert_eq!(one_element.next(), None);
485
- /// ```
486
- #[ inline]
487
- #[ unstable( feature = "exact_size_is_empty" , issue = "35428" ) ]
488
- fn is_empty ( & self ) -> bool {
489
- self . len ( ) == 0
490
- }
491
- }
492
-
493
- #[ stable( feature = "rust1" , since = "1.0.0" ) ]
494
- impl < I : ExactSizeIterator + ?Sized > ExactSizeIterator for & mut I {
495
- fn len ( & self ) -> usize {
496
- ( * * self ) . len ( )
497
- }
498
- fn is_empty ( & self ) -> bool {
499
- ( * * self ) . is_empty ( )
500
- }
501
- }
502
-
503
362
/// Trait to represent types that can be created by summing up an iterator.
504
363
///
505
364
/// This trait is used to implement the [`sum`] method on iterators. Types which
0 commit comments