Skip to content

Commit 1c589b7

Browse files
author
Clar Charr
committed
TrustedRandomAccess specialisation for Cloned.
This verifies that TrustedRandomAccess has no side effects when the iterator item implements Copy. This also implements TrustedLen and TrustedRandomAccess for str::Bytes.
1 parent 7f8aef9 commit 1c589b7

File tree

2 files changed

+26
-2
lines changed

2 files changed

+26
-2
lines changed

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>,

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)