diff options
| author | bors <bors@rust-lang.org> | 2021-04-24 04:54:10 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2021-04-24 04:54:10 +0000 |
| commit | e11a9fa52a3f372dadd6db3d3f2ed7dc2621dcc4 (patch) | |
| tree | 72d3be050eb98bab8554561f3673961f7fa47ce0 /library | |
| parent | a7aba58e9684175c5c5dfef8277c95ebc43f904a (diff) | |
| parent | ec61abf9a98eaab0f83f32be70306559bdea511f (diff) | |
| download | rust-e11a9fa52a3f372dadd6db3d3f2ed7dc2621dcc4.tar.gz rust-e11a9fa52a3f372dadd6db3d3f2ed7dc2621dcc4.zip | |
Auto merge of #84501 - JohnTitor:rollup-wxu1thu, r=JohnTitor
Rollup of 10 pull requests Successful merges: - #83990 (implement `TrustedRandomAccess` for `Take` iterator adapter) - #84250 (bootstrap: use bash on illumos to run install scripts) - #84320 (Use details tag for trait implementors.) - #84436 (Make a few functions private) - #84453 (Document From implementations for Waker and RawWaker) - #84458 (Remove unnecessary fields and parameters in rustdoc) - #84485 (Add some associated type bounds tests) - #84489 (Mention FusedIterator case in Iterator::fuse doc) - #84492 (rustdoc: Remove unnecessary dummy span) - #84496 (Add some specialization tests) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
Diffstat (limited to 'library')
| -rw-r--r-- | library/alloc/src/task.rs | 6 | ||||
| -rw-r--r-- | library/core/src/iter/adapters/take.rs | 23 | ||||
| -rw-r--r-- | library/core/src/iter/traits/iterator.rs | 5 |
3 files changed, 33 insertions, 1 deletions
diff --git a/library/alloc/src/task.rs b/library/alloc/src/task.rs index 58a9ae77244..528ee4ff154 100644 --- a/library/alloc/src/task.rs +++ b/library/alloc/src/task.rs @@ -87,6 +87,9 @@ pub trait Wake { #[stable(feature = "wake_trait", since = "1.51.0")] impl<W: Wake + Send + Sync + 'static> From<Arc<W>> for Waker { + /// Use a `Wake`-able type as a `Waker`. + /// + /// No heap allocations or atomic operations are used for this conversion. fn from(waker: Arc<W>) -> Waker { // SAFETY: This is safe because raw_waker safely constructs // a RawWaker from Arc<W>. @@ -96,6 +99,9 @@ impl<W: Wake + Send + Sync + 'static> From<Arc<W>> for Waker { #[stable(feature = "wake_trait", since = "1.51.0")] impl<W: Wake + Send + Sync + 'static> From<Arc<W>> for RawWaker { + /// Use a `Wake`-able type as a `RawWaker`. + /// + /// No heap allocations or atomic operations are used for this conversion. fn from(waker: Arc<W>) -> RawWaker { raw_waker(waker) } diff --git a/library/core/src/iter/adapters/take.rs b/library/core/src/iter/adapters/take.rs index 9efc7a480ae..54a47f1323e 100644 --- a/library/core/src/iter/adapters/take.rs +++ b/library/core/src/iter/adapters/take.rs @@ -1,5 +1,8 @@ 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}; /// An iterator that only iterates over the first `n` iterations of `iter`. @@ -111,6 +114,15 @@ where 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")] @@ -207,3 +219,12 @@ impl<I> FusedIterator for Take<I> where I: FusedIterator {} #[unstable(feature = "trusted_len", issue = "37572")] 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; +} diff --git a/library/core/src/iter/traits/iterator.rs b/library/core/src/iter/traits/iterator.rs index 9b0f9544f8e..7977d599ae7 100644 --- a/library/core/src/iter/traits/iterator.rs +++ b/library/core/src/iter/traits/iterator.rs @@ -1495,7 +1495,12 @@ pub trait Iterator { /// [`Some(T)`] again. `fuse()` adapts an iterator, ensuring that after a /// [`None`] is given, it will always return [`None`] forever. /// + /// Note that the [`Fuse`] wrapper is a no-op on iterators that implement + /// the [`FusedIterator`] trait. `fuse()` may therefore behave incorrectly + /// if the [`FusedIterator`] trait is improperly implemented. + /// /// [`Some(T)`]: Some + /// [`FusedIterator`]: crate::iter::FusedIterator /// /// # Examples /// |
