diff options
| author | The8472 <git@infinite-source.de> | 2019-11-29 01:11:14 +0100 |
|---|---|---|
| committer | The8472 <git@infinite-source.de> | 2020-09-03 20:59:22 +0200 |
| commit | e85cfa4f2296b6f335d4428c20ce5bec8e59e935 (patch) | |
| tree | e24e877a07f1a1d02aaf016aa8116d0ef2ed72ea | |
| parent | e1151844fae40ce45bb46808e31e58cc7795500d (diff) | |
| download | rust-e85cfa4f2296b6f335d4428c20ce5bec8e59e935.tar.gz rust-e85cfa4f2296b6f335d4428c20ce5bec8e59e935.zip | |
impl TrustedRandomAccess for vec::IntoIter
| -rw-r--r-- | library/alloc/src/vec.rs | 23 | ||||
| -rw-r--r-- | library/core/src/iter/adapters/mod.rs | 4 | ||||
| -rw-r--r-- | library/core/src/iter/mod.rs | 4 |
3 files changed, 28 insertions, 3 deletions
diff --git a/library/alloc/src/vec.rs b/library/alloc/src/vec.rs index 9327cf16c15..27f2440ddc0 100644 --- a/library/alloc/src/vec.rs +++ b/library/alloc/src/vec.rs @@ -58,7 +58,9 @@ use core::cmp::{self, Ordering}; use core::fmt; use core::hash::{Hash, Hasher}; use core::intrinsics::{arith_offset, assume}; -use core::iter::{FromIterator, FusedIterator, InPlaceIterable, SourceIter, TrustedLen}; +use core::iter::{ + FromIterator, FusedIterator, InPlaceIterable, SourceIter, TrustedLen, TrustedRandomAccess, +}; use core::marker::PhantomData; use core::mem::{self, ManuallyDrop, MaybeUninit}; use core::ops::Bound::{Excluded, Included, Unbounded}; @@ -2936,6 +2938,25 @@ impl<T> FusedIterator for IntoIter<T> {} #[unstable(feature = "trusted_len", issue = "37572")] unsafe impl<T> TrustedLen for IntoIter<T> {} +#[doc(hidden)] +#[unstable(issue = "0", feature = "std_internals")] +// T: Copy as approximation for !Drop since get_unchecked does not advance self.ptr +// and thus we can't implement drop-handling +unsafe impl<T> TrustedRandomAccess for IntoIter<T> +where + T: Copy, +{ + unsafe fn get_unchecked(&mut self, i: usize) -> Self::Item { + unsafe { + if mem::size_of::<T>() == 0 { mem::zeroed() } else { ptr::read(self.ptr.add(i)) } + } + } + + fn may_have_side_effect() -> bool { + false + } +} + #[stable(feature = "vec_into_iter_clone", since = "1.8.0")] impl<T: Clone> Clone for IntoIter<T> { fn clone(&self) -> IntoIter<T> { diff --git a/library/core/src/iter/adapters/mod.rs b/library/core/src/iter/adapters/mod.rs index 0ad279c5533..12fdd3f49c3 100644 --- a/library/core/src/iter/adapters/mod.rs +++ b/library/core/src/iter/adapters/mod.rs @@ -18,7 +18,8 @@ pub use self::chain::Chain; pub use self::flatten::{FlatMap, Flatten}; pub use self::fuse::Fuse; use self::zip::try_get_unchecked; -pub(crate) use self::zip::TrustedRandomAccess; +#[unstable(feature = "trusted_random_access", issue = "none")] +pub use self::zip::TrustedRandomAccess; pub use self::zip::Zip; /// This trait provides transitive access to source-stages in an interator-adapter pipeline @@ -480,6 +481,7 @@ where unsafe impl<I> TrustedRandomAccess for Cloned<I> where I: TrustedRandomAccess, + { #[inline] fn may_have_side_effect() -> bool { diff --git a/library/core/src/iter/mod.rs b/library/core/src/iter/mod.rs index f35994560c5..922ffd1e0b5 100644 --- a/library/core/src/iter/mod.rs +++ b/library/core/src/iter/mod.rs @@ -357,6 +357,8 @@ pub use self::adapters::MapWhile; pub use self::adapters::SourceIter; #[stable(feature = "iterator_step_by", since = "1.28.0")] pub use self::adapters::StepBy; +#[unstable(feature = "trusted_random_access", issue = "none")] +pub use self::adapters::TrustedRandomAccess; #[stable(feature = "rust1", since = "1.0.0")] pub use self::adapters::{Chain, Cycle, Enumerate, Filter, FilterMap, Map, Rev, Zip}; #[stable(feature = "rust1", since = "1.0.0")] @@ -364,7 +366,7 @@ pub use self::adapters::{FlatMap, Peekable, Scan, Skip, SkipWhile, Take, TakeWhi #[stable(feature = "rust1", since = "1.0.0")] pub use self::adapters::{Fuse, Inspect}; -pub(crate) use self::adapters::{process_results, TrustedRandomAccess}; +pub(crate) use self::adapters::process_results; mod adapters; mod range; |
