Skip to content

Commit ca61c6b

Browse files
committed
impl TrustedRandomAccess for vec::IntoIter
1 parent aa0a12b commit ca61c6b

File tree

6 files changed

+47
-10
lines changed

6 files changed

+47
-10
lines changed

src/liballoc/vec.rs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,9 @@ use core::cmp::{self, Ordering};
6161
use core::fmt;
6262
use core::hash::{self, Hash};
6363
use core::intrinsics::{arith_offset, assume};
64-
use core::iter::{FromIterator, FusedIterator, InPlaceIterable, SourceIter, TrustedLen};
64+
use core::iter::{
65+
FromIterator, FusedIterator, InPlaceIterable, SourceIter, TrustedLen, TrustedRandomAccess,
66+
};
6567
use core::marker::PhantomData;
6668
use core::mem;
6769
use core::ops::Bound::{Excluded, Included, Unbounded};
@@ -2795,6 +2797,22 @@ impl<T> FusedIterator for IntoIter<T> {}
27952797
#[unstable(feature = "trusted_len", issue = "37572")]
27962798
unsafe impl<T> TrustedLen for IntoIter<T> {}
27972799

2800+
#[doc(hidden)]
2801+
#[unstable(issue = "0", feature = "std_internals")]
2802+
// T: Copy as approximation for !Drop since get_unchecked does not advance self.ptr
2803+
// and thus we can't implement drop-handling
2804+
unsafe impl<T> TrustedRandomAccess for IntoIter<T>
2805+
where
2806+
T: Copy,
2807+
{
2808+
unsafe fn get_unchecked(&mut self, i: usize) -> Self::Item {
2809+
if mem::size_of::<T>() == 0 { mem::zeroed() } else { ptr::read(self.ptr.add(i)) }
2810+
}
2811+
fn may_have_side_effect() -> bool {
2812+
false
2813+
}
2814+
}
2815+
27982816
#[stable(feature = "vec_into_iter_clone", since = "1.8.0")]
27992817
impl<T: Clone> Clone for IntoIter<T> {
28002818
fn clone(&self) -> IntoIter<T> {

src/libcore/iter/adapters/mod.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@ mod zip;
1616
pub use self::chain::Chain;
1717
#[stable(feature = "rust1", since = "1.0.0")]
1818
pub use self::flatten::{FlatMap, Flatten};
19-
pub(crate) use self::zip::TrustedRandomAccess;
2019
pub use self::zip::Zip;
20+
#[unstable(issue = "0", feature = "std_internals")]
21+
pub use self::zip::TrustedRandomAccess;
2122

2223
/// This trait provides transitive access to source-stages in an interator-adapter pipeline
2324
/// under the conditions that
@@ -318,6 +319,7 @@ where
318319
}
319320

320321
#[doc(hidden)]
322+
#[unstable(issue = "0", feature = "std_internals")]
321323
unsafe impl<'a, I, T: 'a> TrustedRandomAccess for Copied<I>
322324
where
323325
I: TrustedRandomAccess<Item = &'a T>,
@@ -448,6 +450,7 @@ where
448450
}
449451

450452
#[doc(hidden)]
453+
#[unstable(issue = "0", feature = "std_internals")]
451454
unsafe impl<'a, I, T: 'a> TrustedRandomAccess for Cloned<I>
452455
where
453456
I: TrustedRandomAccess<Item = &'a T>,
@@ -464,6 +467,7 @@ where
464467
}
465468

466469
#[doc(hidden)]
470+
#[unstable(issue = "0", feature = "std_internals")]
467471
unsafe impl<'a, I, T: 'a> TrustedRandomAccess for Cloned<I>
468472
where
469473
I: TrustedRandomAccess<Item = &'a T>,
@@ -931,6 +935,7 @@ where
931935
}
932936

933937
#[doc(hidden)]
938+
#[unstable(issue = "0", feature = "std_internals")]
934939
unsafe impl<B, I, F> TrustedRandomAccess for Map<I, F>
935940
where
936941
I: TrustedRandomAccess,
@@ -1446,6 +1451,7 @@ where
14461451
}
14471452

14481453
#[doc(hidden)]
1454+
#[unstable(issue = "0", feature = "std_internals")]
14491455
unsafe impl<I> TrustedRandomAccess for Enumerate<I>
14501456
where
14511457
I: TrustedRandomAccess,
@@ -2638,6 +2644,7 @@ where
26382644
}
26392645
}
26402646

2647+
#[unstable(issue = "0", feature = "std_internals")]
26412648
unsafe impl<I> TrustedRandomAccess for Fuse<I>
26422649
where
26432650
I: TrustedRandomAccess,

src/libcore/iter/adapters/zip.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,7 @@ where
262262
}
263263

264264
#[doc(hidden)]
265+
#[unstable(issue = "0", feature = "std_internals")]
265266
unsafe impl<A, B> TrustedRandomAccess for Zip<A, B>
266267
where
267268
A: TrustedRandomAccess,
@@ -322,7 +323,10 @@ unsafe impl<A: InPlaceIterable, B: Iterator> InPlaceIterable for Zip<A, B> {}
322323
/// .get_unchecked() must return distinct mutable references for distinct
323324
/// indices (if applicable), and must return a valid reference if index is in
324325
/// 0..self.len().
325-
pub(crate) unsafe trait TrustedRandomAccess: ExactSizeIterator {
326+
#[unstable(issue = "0", feature = "std_internals")]
327+
pub unsafe trait TrustedRandomAccess: ExactSizeIterator {
328+
/// Returns item at offset `i` from the current position of the iterator.
329+
/// It does not advance the iterator.
326330
unsafe fn get_unchecked(&mut self, i: usize) -> Self::Item;
327331
/// Returns `true` if getting an iterator element may have
328332
/// side effects. Remember to take inner iterators into account.

src/libcore/iter/mod.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -360,14 +360,16 @@ pub use self::adapters::MapWhile;
360360
pub use self::adapters::SourceIter;
361361
#[stable(feature = "iterator_step_by", since = "1.28.0")]
362362
pub use self::adapters::StepBy;
363+
#[unstable(issue = "0", feature = "std_internals")]
364+
pub use self::adapters::TrustedRandomAccess;
363365
#[stable(feature = "rust1", since = "1.0.0")]
364366
pub use self::adapters::{Chain, Cycle, Enumerate, Filter, FilterMap, Map, Rev, Zip};
365367
#[stable(feature = "rust1", since = "1.0.0")]
366368
pub use self::adapters::{FlatMap, Peekable, Scan, Skip, SkipWhile, Take, TakeWhile};
367369
#[stable(feature = "rust1", since = "1.0.0")]
368370
pub use self::adapters::{Fuse, Inspect};
369371

370-
pub(crate) use self::adapters::{process_results, TrustedRandomAccess};
372+
pub(crate) use self::adapters::process_results;
371373

372374
mod adapters;
373375
mod range;

src/libcore/slice/mod.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4210,6 +4210,7 @@ unsafe impl<T> TrustedLen for Windows<'_, T> {}
42104210
impl<T> FusedIterator for Windows<'_, T> {}
42114211

42124212
#[doc(hidden)]
4213+
#[unstable(issue = "0", feature = "std_internals")]
42134214
unsafe impl<'a, T> TrustedRandomAccess for Windows<'a, T> {
42144215
unsafe fn get_unchecked(&mut self, i: usize) -> &'a [T] {
42154216
from_raw_parts(self.v.as_ptr().add(i), self.size)
@@ -4349,6 +4350,7 @@ unsafe impl<T> TrustedLen for Chunks<'_, T> {}
43494350
impl<T> FusedIterator for Chunks<'_, T> {}
43504351

43514352
#[doc(hidden)]
4353+
#[unstable(issue = "0", feature = "std_internals")]
43524354
unsafe impl<'a, T> TrustedRandomAccess for Chunks<'a, T> {
43534355
unsafe fn get_unchecked(&mut self, i: usize) -> &'a [T] {
43544356
let start = i * self.chunk_size;
@@ -4491,6 +4493,7 @@ unsafe impl<T> TrustedLen for ChunksMut<'_, T> {}
44914493
impl<T> FusedIterator for ChunksMut<'_, T> {}
44924494

44934495
#[doc(hidden)]
4496+
#[unstable(issue = "0", feature = "std_internals")]
44944497
unsafe impl<'a, T> TrustedRandomAccess for ChunksMut<'a, T> {
44954498
unsafe fn get_unchecked(&mut self, i: usize) -> &'a mut [T] {
44964499
let start = i * self.chunk_size;
@@ -4631,7 +4634,7 @@ unsafe impl<T> TrustedLen for ChunksExact<'_, T> {}
46314634
impl<T> FusedIterator for ChunksExact<'_, T> {}
46324635

46334636
#[doc(hidden)]
4634-
#[stable(feature = "chunks_exact", since = "1.31.0")]
4637+
#[unstable(issue = "0", feature = "std_internals")]
46354638
unsafe impl<'a, T> TrustedRandomAccess for ChunksExact<'a, T> {
46364639
unsafe fn get_unchecked(&mut self, i: usize) -> &'a [T] {
46374640
let start = i * self.chunk_size;
@@ -4765,7 +4768,7 @@ unsafe impl<T> TrustedLen for ChunksExactMut<'_, T> {}
47654768
impl<T> FusedIterator for ChunksExactMut<'_, T> {}
47664769

47674770
#[doc(hidden)]
4768-
#[stable(feature = "chunks_exact", since = "1.31.0")]
4771+
#[unstable(issue = "0", feature = "std_internals")]
47694772
unsafe impl<'a, T> TrustedRandomAccess for ChunksExactMut<'a, T> {
47704773
unsafe fn get_unchecked(&mut self, i: usize) -> &'a mut [T] {
47714774
let start = i * self.chunk_size;
@@ -4908,7 +4911,7 @@ unsafe impl<T> TrustedLen for RChunks<'_, T> {}
49084911
impl<T> FusedIterator for RChunks<'_, T> {}
49094912

49104913
#[doc(hidden)]
4911-
#[stable(feature = "rchunks", since = "1.31.0")]
4914+
#[unstable(issue = "0", feature = "std_internals")]
49124915
unsafe impl<'a, T> TrustedRandomAccess for RChunks<'a, T> {
49134916
unsafe fn get_unchecked(&mut self, i: usize) -> &'a [T] {
49144917
let end = self.v.len() - i * self.chunk_size;
@@ -5053,7 +5056,7 @@ unsafe impl<T> TrustedLen for RChunksMut<'_, T> {}
50535056
impl<T> FusedIterator for RChunksMut<'_, T> {}
50545057

50555058
#[doc(hidden)]
5056-
#[stable(feature = "rchunks", since = "1.31.0")]
5059+
#[unstable(issue = "0", feature = "std_internals")]
50575060
unsafe impl<'a, T> TrustedRandomAccess for RChunksMut<'a, T> {
50585061
unsafe fn get_unchecked(&mut self, i: usize) -> &'a mut [T] {
50595062
let end = self.v.len() - i * self.chunk_size;
@@ -5197,7 +5200,7 @@ unsafe impl<T> TrustedLen for RChunksExact<'_, T> {}
51975200
impl<T> FusedIterator for RChunksExact<'_, T> {}
51985201

51995202
#[doc(hidden)]
5200-
#[stable(feature = "rchunks", since = "1.31.0")]
5203+
#[unstable(issue = "0", feature = "std_internals")]
52015204
unsafe impl<'a, T> TrustedRandomAccess for RChunksExact<'a, T> {
52025205
unsafe fn get_unchecked(&mut self, i: usize) -> &'a [T] {
52035206
let end = self.v.len() - i * self.chunk_size;
@@ -5336,7 +5339,7 @@ unsafe impl<T> TrustedLen for RChunksExactMut<'_, T> {}
53365339
impl<T> FusedIterator for RChunksExactMut<'_, T> {}
53375340

53385341
#[doc(hidden)]
5339-
#[stable(feature = "rchunks", since = "1.31.0")]
5342+
#[unstable(issue = "0", feature = "std_internals")]
53405343
unsafe impl<'a, T> TrustedRandomAccess for RChunksExactMut<'a, T> {
53415344
unsafe fn get_unchecked(&mut self, i: usize) -> &'a mut [T] {
53425345
let end = self.v.len() - i * self.chunk_size;
@@ -5683,6 +5686,7 @@ impl_marker_for!(BytewiseEquality,
56835686
u8 i8 u16 i16 u32 i32 u64 i64 u128 i128 usize isize char bool);
56845687

56855688
#[doc(hidden)]
5689+
#[unstable(issue = "0", feature = "std_internals")]
56865690
unsafe impl<'a, T> TrustedRandomAccess for Iter<'a, T> {
56875691
unsafe fn get_unchecked(&mut self, i: usize) -> &'a T {
56885692
&*self.ptr.as_ptr().add(i)
@@ -5693,6 +5697,7 @@ unsafe impl<'a, T> TrustedRandomAccess for Iter<'a, T> {
56935697
}
56945698

56955699
#[doc(hidden)]
5700+
#[unstable(issue = "0", feature = "std_internals")]
56965701
unsafe impl<'a, T> TrustedRandomAccess for IterMut<'a, T> {
56975702
unsafe fn get_unchecked(&mut self, i: usize) -> &'a mut T {
56985703
&mut *self.ptr.as_ptr().add(i)

src/libcore/str/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -863,6 +863,7 @@ impl FusedIterator for Bytes<'_> {}
863863
unsafe impl TrustedLen for Bytes<'_> {}
864864

865865
#[doc(hidden)]
866+
#[unstable(issue = "0", feature = "std_internals")]
866867
unsafe impl TrustedRandomAccess for Bytes<'_> {
867868
unsafe fn get_unchecked(&mut self, i: usize) -> u8 {
868869
self.0.get_unchecked(i)

0 commit comments

Comments
 (0)