Skip to content

Commit f22b9da

Browse files
committed
Auto merge of #44790 - clarcharr:zip_bytes, r=sfackler
TrustedRandomAccess specialisation for Iterator::cloned when Item: Copy. This should fix #44424. It also provides a potential fix for more iterators using `Iterator::cloned`.
2 parents 9cb90f4 + 1c589b7 commit f22b9da

File tree

2 files changed

+26
-2
lines changed

2 files changed

+26
-2
lines changed

Diff for: src/libcore/iter/mod.rs

+13-1
Original file line numberDiff line numberDiff line change
@@ -488,7 +488,7 @@ impl<'a, I, T: 'a> FusedIterator for Cloned<I>
488488
{}
489489

490490
#[doc(hidden)]
491-
unsafe impl<'a, I, T: 'a> TrustedRandomAccess for Cloned<I>
491+
default unsafe impl<'a, I, T: 'a> TrustedRandomAccess for Cloned<I>
492492
where I: TrustedRandomAccess<Item=&'a T>, T: Clone
493493
{
494494
unsafe fn get_unchecked(&mut self, i: usize) -> Self::Item {
@@ -499,6 +499,18 @@ unsafe impl<'a, I, T: 'a> TrustedRandomAccess for Cloned<I>
499499
fn may_have_side_effect() -> bool { true }
500500
}
501501

502+
#[doc(hidden)]
503+
unsafe impl<'a, I, T: 'a> TrustedRandomAccess for Cloned<I>
504+
where I: TrustedRandomAccess<Item=&'a T>, T: Copy
505+
{
506+
unsafe fn get_unchecked(&mut self, i: usize) -> Self::Item {
507+
*self.it.get_unchecked(i)
508+
}
509+
510+
#[inline]
511+
fn may_have_side_effect() -> bool { false }
512+
}
513+
502514
#[unstable(feature = "trusted_len", issue = "37572")]
503515
unsafe impl<'a, I, T: 'a> TrustedLen for Cloned<I>
504516
where I: TrustedLen<Item=&'a T>,

Diff for: src/libcore/str/mod.rs

+13-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ use self::pattern::{Searcher, ReverseSearcher, DoubleEndedSearcher};
2020
use char;
2121
use convert::TryFrom;
2222
use fmt;
23-
use iter::{Map, Cloned, FusedIterator};
23+
use iter::{Map, Cloned, FusedIterator, TrustedLen};
24+
use iter_private::TrustedRandomAccess;
2425
use slice::{self, SliceIndex};
2526
use mem;
2627

@@ -818,6 +819,17 @@ impl<'a> ExactSizeIterator for Bytes<'a> {
818819
#[unstable(feature = "fused", issue = "35602")]
819820
impl<'a> FusedIterator for Bytes<'a> {}
820821

822+
#[unstable(feature = "trusted_len", issue = "37572")]
823+
unsafe impl<'a> TrustedLen for Bytes<'a> {}
824+
825+
#[doc(hidden)]
826+
unsafe impl<'a> TrustedRandomAccess for Bytes<'a> {
827+
unsafe fn get_unchecked(&mut self, i: usize) -> u8 {
828+
self.0.get_unchecked(i)
829+
}
830+
fn may_have_side_effect() -> bool { false }
831+
}
832+
821833
/// This macro generates a Clone impl for string pattern API
822834
/// wrapper types of the form X<'a, P>
823835
macro_rules! derive_pattern_clone {

0 commit comments

Comments
 (0)