Rollup merge of #83990 - the8472:take-trusted-len, r=dtolnay
implement `TrustedRandomAccess` for `Take` iterator adapter `TrustedRandomAccess` requires the iterator length to fit within `usize`. `take(n)` only constrains the upper bound of an iterator. So if the inner is `TrustedRandomAccess` (which already implies a finite length) then so can be `Take`. ```````@rustbot``````` label T-libs-impl
This commit is contained in:
commit
c00439f682
@ -1,5 +1,8 @@
|
|||||||
use crate::cmp;
|
use crate::cmp;
|
||||||
use crate::iter::{adapters::SourceIter, FusedIterator, InPlaceIterable, TrustedLen};
|
use crate::iter::{
|
||||||
|
adapters::zip::try_get_unchecked, adapters::SourceIter, FusedIterator, InPlaceIterable,
|
||||||
|
TrustedLen, TrustedRandomAccess,
|
||||||
|
};
|
||||||
use crate::ops::{ControlFlow, Try};
|
use crate::ops::{ControlFlow, Try};
|
||||||
|
|
||||||
/// An iterator that only iterates over the first `n` iterations of `iter`.
|
/// An iterator that only iterates over the first `n` iterations of `iter`.
|
||||||
@ -111,6 +114,15 @@ fn ok<B, T>(mut f: impl FnMut(B, T) -> B) -> impl FnMut(B, T) -> Result<B, !> {
|
|||||||
|
|
||||||
self.try_fold(init, ok(fold)).unwrap()
|
self.try_fold(init, ok(fold)).unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsafe fn __iterator_get_unchecked(&mut self, idx: usize) -> <I as Iterator>::Item
|
||||||
|
where
|
||||||
|
Self: TrustedRandomAccess,
|
||||||
|
{
|
||||||
|
// SAFETY: the caller must uphold the contract for
|
||||||
|
// `Iterator::__iterator_get_unchecked`.
|
||||||
|
unsafe { try_get_unchecked(&mut self.iter, idx) }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[unstable(issue = "none", feature = "inplace_iteration")]
|
#[unstable(issue = "none", feature = "inplace_iteration")]
|
||||||
@ -207,3 +219,12 @@ impl<I> FusedIterator for Take<I> where I: FusedIterator {}
|
|||||||
|
|
||||||
#[unstable(feature = "trusted_len", issue = "37572")]
|
#[unstable(feature = "trusted_len", issue = "37572")]
|
||||||
unsafe impl<I: TrustedLen> TrustedLen for Take<I> {}
|
unsafe impl<I: TrustedLen> TrustedLen for Take<I> {}
|
||||||
|
|
||||||
|
#[doc(hidden)]
|
||||||
|
#[unstable(feature = "trusted_random_access", issue = "none")]
|
||||||
|
unsafe impl<I> TrustedRandomAccess for Take<I>
|
||||||
|
where
|
||||||
|
I: TrustedRandomAccess,
|
||||||
|
{
|
||||||
|
const MAY_HAVE_SIDE_EFFECT: bool = I::MAY_HAVE_SIDE_EFFECT;
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user