Introduce iterator trait TrustedLen
This commit is contained in:
parent
0c429872a3
commit
9ae9930e2f
4 changed files with 50 additions and 1 deletions
|
|
@ -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.
|
||||
///
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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 {}
|
||||
|
|
|
|||
|
|
@ -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)]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue