Skip to content

Commit 9376da6

Browse files
authored
Auto merge of #35559 - frewsxcv:slice-iter-as-ref, r=alexcrichton
Implement `AsRef<[T]>` for `std::slice::Iter`. `AsRef` is designed for conversions that are "cheap" (as per the API docs). It is the case that retrieving the underlying data of `std::slice::Iter` is cheap. In my opinion, there's no ambiguity about what slice data will be returned, otherwise, I would be more cautious about implementing `AsRef`.
2 parents 1bf5fa3 + dc22186 commit 9376da6

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

src/libcollectionstest/slice.rs

+18
Original file line numberDiff line numberDiff line change
@@ -645,6 +645,24 @@ fn test_iter_size_hints() {
645645
assert_eq!(xs.iter_mut().size_hint(), (5, Some(5)));
646646
}
647647

648+
#[test]
649+
fn test_iter_as_slice() {
650+
let xs = [1, 2, 5, 10, 11];
651+
let mut iter = xs.iter();
652+
assert_eq!(iter.as_slice(), &[1, 2, 5, 10, 11]);
653+
iter.next();
654+
assert_eq!(iter.as_slice(), &[2, 5, 10, 11]);
655+
}
656+
657+
#[test]
658+
fn test_iter_as_ref() {
659+
let xs = [1, 2, 5, 10, 11];
660+
let mut iter = xs.iter();
661+
assert_eq!(iter.as_ref(), &[1, 2, 5, 10, 11]);
662+
iter.next();
663+
assert_eq!(iter.as_ref(), &[2, 5, 10, 11]);
664+
}
665+
648666
#[test]
649667
fn test_iter_clone() {
650668
let xs = [1, 2, 5];

src/libcore/slice.rs

+8
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ use clone::Clone;
3737
use cmp::{Ordering, PartialEq, PartialOrd, Eq, Ord};
3838
use cmp::Ordering::{Less, Equal, Greater};
3939
use cmp;
40+
use convert::AsRef;
4041
use default::Default;
4142
use fmt;
4243
use intrinsics::assume;
@@ -996,6 +997,13 @@ impl<'a, T> Clone for Iter<'a, T> {
996997
fn clone(&self) -> Iter<'a, T> { Iter { ptr: self.ptr, end: self.end, _marker: self._marker } }
997998
}
998999

1000+
#[stable(feature = "slice_iter_as_ref", since = "1.12.0")]
1001+
impl<'a, T> AsRef<[T]> for Iter<'a, T> {
1002+
fn as_ref(&self) -> &[T] {
1003+
self.as_slice()
1004+
}
1005+
}
1006+
9991007
/// Mutable slice iterator.
10001008
///
10011009
/// This struct is created by the [`iter_mut`] method on [slices].

0 commit comments

Comments
 (0)