From 3808dc3560ed15c83f92a0c309d44864f53e968b Mon Sep 17 00:00:00 2001 From: Corey Farwell Date: Tue, 9 Aug 2016 20:49:41 -0400 Subject: [PATCH] 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`. --- src/libcollectionstest/slice.rs | 9 +++++++++ src/libcore/slice.rs | 8 ++++++++ 2 files changed, 17 insertions(+) diff --git a/src/libcollectionstest/slice.rs b/src/libcollectionstest/slice.rs index 71416f2069fa0..cb3579f0680f8 100644 --- a/src/libcollectionstest/slice.rs +++ b/src/libcollectionstest/slice.rs @@ -645,6 +645,15 @@ fn test_iter_size_hints() { assert_eq!(xs.iter_mut().size_hint(), (5, Some(5))); } +#[test] +fn test_iter_as_ref() { + let xs = [1, 2, 5, 10, 11]; + let mut iter = xs.iter(); + assert_eq!(iter.as_ref(), &[1, 2, 5, 10, 11]); + iter.next(); + assert_eq!(iter.as_ref(), &[2, 5, 10, 11]); +} + #[test] fn test_iter_clone() { let xs = [1, 2, 5]; diff --git a/src/libcore/slice.rs b/src/libcore/slice.rs index 3141c289e931c..3a820a14f1214 100644 --- a/src/libcore/slice.rs +++ b/src/libcore/slice.rs @@ -37,6 +37,7 @@ use clone::Clone; use cmp::{Ordering, PartialEq, PartialOrd, Eq, Ord}; use cmp::Ordering::{Less, Equal, Greater}; use cmp; +use convert::AsRef; use default::Default; use fmt; use intrinsics::assume; @@ -996,6 +997,13 @@ impl<'a, T> Clone for Iter<'a, T> { fn clone(&self) -> Iter<'a, T> { Iter { ptr: self.ptr, end: self.end, _marker: self._marker } } } +#[stable(feature = "slice_iter_as_ref", since = "1.12.0")] +impl<'a, T> AsRef<[T]> for Iter<'a, T> { + fn as_ref(&self) -> &[T] { + self.as_slice() + } +} + /// Mutable slice iterator. /// /// This struct is created by the [`iter_mut`] method on [slices].