Skip to content

Commit 9ae9930

Browse files
committed
Introduce iterator trait TrustedLen
1 parent 0c42987 commit 9ae9930

File tree

4 files changed

+50
-1
lines changed

4 files changed

+50
-1
lines changed

src/libcore/iter/mod.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,8 @@ pub use self::traits::{FromIterator, IntoIterator, DoubleEndedIterator, Extend};
328328
pub use self::traits::{ExactSizeIterator, Sum, Product};
329329
#[unstable(feature = "fused", issue = "35602")]
330330
pub use self::traits::FusedIterator;
331+
#[unstable(feature = "trusted_len", issue = "0")]
332+
pub use self::traits::TrustedLen;
331333

332334
mod iterator;
333335
mod range;
@@ -372,6 +374,10 @@ impl<I> ExactSizeIterator for Rev<I>
372374
impl<I> FusedIterator for Rev<I>
373375
where I: FusedIterator + DoubleEndedIterator {}
374376

377+
#[unstable(feature = "trusted_len", issue = "0")]
378+
unsafe impl<I> TrustedLen for Rev<I>
379+
where I: TrustedLen + DoubleEndedIterator {}
380+
375381
/// An iterator that clones the elements of an underlying iterator.
376382
///
377383
/// This `struct` is created by the [`cloned()`] method on [`Iterator`]. See its
@@ -432,6 +438,12 @@ unsafe impl<'a, I, T: 'a> TrustedRandomAccess for Cloned<I>
432438
fn may_have_side_effect() -> bool { true }
433439
}
434440

441+
#[unstable(feature = "trusted_len", issue = "0")]
442+
unsafe impl<'a, I, T: 'a> TrustedLen for Cloned<I>
443+
where I: TrustedLen<Item=&'a T>,
444+
T: Clone
445+
{}
446+
435447
/// An iterator that repeats endlessly.
436448
///
437449
/// This `struct` is created by the [`cycle()`] method on [`Iterator`]. See its
@@ -642,6 +654,11 @@ impl<A, B> FusedIterator for Chain<A, B>
642654
B: FusedIterator<Item=A::Item>,
643655
{}
644656

657+
#[unstable(feature = "trusted_len", issue = "0")]
658+
unsafe impl<A, B> TrustedLen for Chain<A, B>
659+
where A: TrustedLen, B: TrustedLen<Item=A::Item>,
660+
{}
661+
645662
/// An iterator that iterates two other iterators simultaneously.
646663
///
647664
/// This `struct` is created by the [`zip()`] method on [`Iterator`]. See its
@@ -859,6 +876,11 @@ unsafe impl<A, B> TrustedRandomAccess for Zip<A, B>
859876
impl<A, B> FusedIterator for Zip<A, B>
860877
where A: FusedIterator, B: FusedIterator, {}
861878

879+
#[unstable(feature = "trusted_len", issue = "0")]
880+
unsafe impl<A, B> TrustedLen for Zip<A, B>
881+
where A: TrustedLen, B: TrustedLen,
882+
{}
883+
862884
/// An iterator that maps the values of `iter` with `f`.
863885
///
864886
/// This `struct` is created by the [`map()`] method on [`Iterator`]. See its
@@ -959,6 +981,11 @@ impl<B, I: ExactSizeIterator, F> ExactSizeIterator for Map<I, F>
959981
impl<B, I: FusedIterator, F> FusedIterator for Map<I, F>
960982
where F: FnMut(I::Item) -> B {}
961983

984+
#[unstable(feature = "trusted_len", issue = "0")]
985+
unsafe impl<B, I, F> TrustedLen for Map<I, F>
986+
where I: TrustedLen,
987+
F: FnMut(I::Item) -> B {}
988+
962989
#[doc(hidden)]
963990
unsafe impl<B, I, F> TrustedRandomAccess for Map<I, F>
964991
where I: TrustedRandomAccess,
@@ -1195,6 +1222,12 @@ unsafe impl<I> TrustedRandomAccess for Enumerate<I>
11951222
#[unstable(feature = "fused", issue = "35602")]
11961223
impl<I> FusedIterator for Enumerate<I> where I: FusedIterator {}
11971224

1225+
#[unstable(feature = "trusted_len", issue = "0")]
1226+
unsafe impl<I> TrustedLen for Enumerate<I>
1227+
where I: TrustedLen,
1228+
{}
1229+
1230+
11981231
/// An iterator with a `peek()` that returns an optional reference to the next
11991232
/// element.
12001233
///

src/libcore/iter/range.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use mem;
1212
use ops::{self, Add, Sub};
1313
use usize;
1414

15-
use super::FusedIterator;
15+
use super::{FusedIterator, TrustedLen};
1616

1717
/// Objects that can be stepped over in both directions.
1818
///
@@ -533,6 +533,9 @@ impl<A: Step + Clone> DoubleEndedIterator for ops::Range<A> where
533533
impl<A> FusedIterator for ops::Range<A>
534534
where A: Step, for<'a> &'a A: Add<&'a A, Output = A> {}
535535

536+
#[unstable(feature = "trusted_len", issue = "0")]
537+
unsafe impl TrustedLen for ops::Range<usize> { }
538+
536539
#[stable(feature = "rust1", since = "1.0.0")]
537540
impl<A: Step> Iterator for ops::RangeFrom<A> where
538541
for<'a> &'a A: Add<&'a A, Output = A>

src/libcore/iter/traits.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -665,3 +665,10 @@ pub trait FusedIterator: Iterator {}
665665

666666
#[unstable(feature = "fused", issue = "35602")]
667667
impl<'a, I: FusedIterator + ?Sized> FusedIterator for &'a mut I {}
668+
669+
/// An iterator that has correct length
670+
#[unstable(feature = "trusted_len", issue = "0")]
671+
pub unsafe trait TrustedLen : Iterator {}
672+
673+
#[unstable(feature = "trusted_len", issue = "0")]
674+
unsafe impl<'a, I: TrustedLen + ?Sized> TrustedLen for &'a mut I {}

src/libcore/slice.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -988,6 +988,9 @@ impl<'a, T> ExactSizeIterator for Iter<'a, T> {}
988988
#[unstable(feature = "fused", issue = "35602")]
989989
impl<'a, T> FusedIterator for Iter<'a, T> {}
990990

991+
#[unstable(feature = "trusted_len", issue = "0")]
992+
unsafe impl<'a, T> TrustedLen for Iter<'a, T> {}
993+
991994
#[stable(feature = "rust1", since = "1.0.0")]
992995
impl<'a, T> Clone for Iter<'a, T> {
993996
fn clone(&self) -> Iter<'a, T> { Iter { ptr: self.ptr, end: self.end, _marker: self._marker } }
@@ -1109,6 +1112,9 @@ impl<'a, T> ExactSizeIterator for IterMut<'a, T> {}
11091112
#[unstable(feature = "fused", issue = "35602")]
11101113
impl<'a, T> FusedIterator for IterMut<'a, T> {}
11111114

1115+
#[unstable(feature = "trusted_len", issue = "0")]
1116+
unsafe impl<'a, T> TrustedLen for IterMut<'a, T> {}
1117+
11121118
/// An internal abstraction over the splitting iterators, so that
11131119
/// splitn, splitn_mut etc can be implemented once.
11141120
#[doc(hidden)]

0 commit comments

Comments
 (0)