diff options
| author | Ulrik Sverdrup <bluss@users.noreply.github.com> | 2016-10-20 14:07:06 +0200 |
|---|---|---|
| committer | Ulrik Sverdrup <bluss@users.noreply.github.com> | 2016-10-20 14:07:06 +0200 |
| commit | 9ae9930e2fbdb2610843e6dc1ae0fb0759507218 (patch) | |
| tree | 1daf7665067a1389939a8d00396122fb3128761d | |
| parent | 0c429872a32c3005cf2b347025163361218634a4 (diff) | |
| download | rust-9ae9930e2fbdb2610843e6dc1ae0fb0759507218.tar.gz rust-9ae9930e2fbdb2610843e6dc1ae0fb0759507218.zip | |
Introduce iterator trait TrustedLen
| -rw-r--r-- | src/libcore/iter/mod.rs | 33 | ||||
| -rw-r--r-- | src/libcore/iter/range.rs | 5 | ||||
| -rw-r--r-- | src/libcore/iter/traits.rs | 7 | ||||
| -rw-r--r-- | src/libcore/slice.rs | 6 |
4 files changed, 50 insertions, 1 deletions
diff --git a/src/libcore/iter/mod.rs b/src/libcore/iter/mod.rs index 9eeb2608071..9fa950cd94d 100644 --- a/src/libcore/iter/mod.rs +++ b/src/libcore/iter/mod.rs @@ -328,6 +328,8 @@ pub use self::traits::{FromIterator, IntoIterator, DoubleEndedIterator, Extend}; pub use self::traits::{ExactSizeIterator, Sum, Product}; #[unstable(feature = "fused", issue = "35602")] pub use self::traits::FusedIterator; +#[unstable(feature = "trusted_len", issue = "0")] +pub use self::traits::TrustedLen; mod iterator; mod range; @@ -372,6 +374,10 @@ impl<I> ExactSizeIterator for Rev<I> impl<I> FusedIterator for Rev<I> where I: FusedIterator + DoubleEndedIterator {} +#[unstable(feature = "trusted_len", issue = "0")] +unsafe impl<I> TrustedLen for Rev<I> + where I: TrustedLen + DoubleEndedIterator {} + /// An iterator that clones the elements of an underlying iterator. /// /// 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> fn may_have_side_effect() -> bool { true } } +#[unstable(feature = "trusted_len", issue = "0")] +unsafe impl<'a, I, T: 'a> TrustedLen for Cloned<I> + where I: TrustedLen<Item=&'a T>, + T: Clone +{} + /// An iterator that repeats endlessly. /// /// This `struct` is created by the [`cycle()`] method on [`Iterator`]. See its @@ -642,6 +654,11 @@ impl<A, B> FusedIterator for Chain<A, B> B: FusedIterator<Item=A::Item>, {} +#[unstable(feature = "trusted_len", issue = "0")] +unsafe impl<A, B> TrustedLen for Chain<A, B> + where A: TrustedLen, B: TrustedLen<Item=A::Item>, +{} + /// An iterator that iterates two other iterators simultaneously. /// /// 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> impl<A, B> FusedIterator for Zip<A, B> where A: FusedIterator, B: FusedIterator, {} +#[unstable(feature = "trusted_len", issue = "0")] +unsafe impl<A, B> TrustedLen for Zip<A, B> + where A: TrustedLen, B: TrustedLen, +{} + /// An iterator that maps the values of `iter` with `f`. /// /// 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> impl<B, I: FusedIterator, F> FusedIterator for Map<I, F> where F: FnMut(I::Item) -> B {} +#[unstable(feature = "trusted_len", issue = "0")] +unsafe impl<B, I, F> TrustedLen for Map<I, F> + where I: TrustedLen, + F: FnMut(I::Item) -> B {} + #[doc(hidden)] unsafe impl<B, I, F> TrustedRandomAccess for Map<I, F> where I: TrustedRandomAccess, @@ -1195,6 +1222,12 @@ unsafe impl<I> TrustedRandomAccess for Enumerate<I> #[unstable(feature = "fused", issue = "35602")] impl<I> FusedIterator for Enumerate<I> where I: FusedIterator {} +#[unstable(feature = "trusted_len", issue = "0")] +unsafe impl<I> TrustedLen for Enumerate<I> + where I: TrustedLen, +{} + + /// An iterator with a `peek()` that returns an optional reference to the next /// element. /// diff --git a/src/libcore/iter/range.rs b/src/libcore/iter/range.rs index eaa3d50c88a..39da578d549 100644 --- a/src/libcore/iter/range.rs +++ b/src/libcore/iter/range.rs @@ -12,7 +12,7 @@ use mem; use ops::{self, Add, Sub}; use usize; -use super::FusedIterator; +use super::{FusedIterator, TrustedLen}; /// Objects that can be stepped over in both directions. /// @@ -533,6 +533,9 @@ impl<A: Step + Clone> DoubleEndedIterator for ops::Range<A> where impl<A> FusedIterator for ops::Range<A> where A: Step, for<'a> &'a A: Add<&'a A, Output = A> {} +#[unstable(feature = "trusted_len", issue = "0")] +unsafe impl TrustedLen for ops::Range<usize> { } + #[stable(feature = "rust1", since = "1.0.0")] impl<A: Step> Iterator for ops::RangeFrom<A> where for<'a> &'a A: Add<&'a A, Output = A> diff --git a/src/libcore/iter/traits.rs b/src/libcore/iter/traits.rs index b55d6f96af9..da150f1d57a 100644 --- a/src/libcore/iter/traits.rs +++ b/src/libcore/iter/traits.rs @@ -665,3 +665,10 @@ pub trait FusedIterator: Iterator {} #[unstable(feature = "fused", issue = "35602")] impl<'a, I: FusedIterator + ?Sized> FusedIterator for &'a mut I {} + +/// An iterator that has correct length +#[unstable(feature = "trusted_len", issue = "0")] +pub unsafe trait TrustedLen : Iterator {} + +#[unstable(feature = "trusted_len", issue = "0")] +unsafe impl<'a, I: TrustedLen + ?Sized> TrustedLen for &'a mut I {} diff --git a/src/libcore/slice.rs b/src/libcore/slice.rs index 31be404ba90..64d38c54c47 100644 --- a/src/libcore/slice.rs +++ b/src/libcore/slice.rs @@ -988,6 +988,9 @@ impl<'a, T> ExactSizeIterator for Iter<'a, T> {} #[unstable(feature = "fused", issue = "35602")] impl<'a, T> FusedIterator for Iter<'a, T> {} +#[unstable(feature = "trusted_len", issue = "0")] +unsafe impl<'a, T> TrustedLen for Iter<'a, T> {} + #[stable(feature = "rust1", since = "1.0.0")] impl<'a, T> Clone for Iter<'a, T> { 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> {} #[unstable(feature = "fused", issue = "35602")] impl<'a, T> FusedIterator for IterMut<'a, T> {} +#[unstable(feature = "trusted_len", issue = "0")] +unsafe impl<'a, T> TrustedLen for IterMut<'a, T> {} + /// An internal abstraction over the splitting iterators, so that /// splitn, splitn_mut etc can be implemented once. #[doc(hidden)] |
