From a7313a0b891fb5fa62357527409bafde63aa44aa Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Thu, 27 Aug 2015 08:37:40 +0200 Subject: [PATCH] core: Implement IntoIterator for Option and Result references Fixes #27996. --- src/libcore/option.rs | 20 ++++++++++++++++++++ src/libcore/result.rs | 20 ++++++++++++++++++++ src/libcoretest/option.rs | 9 ++++++++- src/libcoretest/result.rs | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 81 insertions(+), 1 deletion(-) diff --git a/src/libcore/option.rs b/src/libcore/option.rs index e64048c82d8..a36a120689c 100644 --- a/src/libcore/option.rs +++ b/src/libcore/option.rs @@ -779,6 +779,26 @@ impl IntoIterator for Option { } } +#[stable(since = "1.4.0", feature = "option_iter")] +impl<'a, T> IntoIterator for &'a Option { + type Item = &'a T; + type IntoIter = Iter<'a, T>; + + fn into_iter(self) -> Iter<'a, T> { + self.iter() + } +} + +#[stable(since = "1.4.0", feature = "option_iter")] +impl<'a, T> IntoIterator for &'a mut Option { + type Item = &'a mut T; + type IntoIter = IterMut<'a, T>; + + fn into_iter(mut self) -> IterMut<'a, T> { + self.iter_mut() + } +} + ///////////////////////////////////////////////////////////////////////////// // The Option Iterators ///////////////////////////////////////////////////////////////////////////// diff --git a/src/libcore/result.rs b/src/libcore/result.rs index 8300faa5a16..2546d9cd63d 100644 --- a/src/libcore/result.rs +++ b/src/libcore/result.rs @@ -815,6 +815,26 @@ impl IntoIterator for Result { } } +#[stable(since = "1.4.0", feature = "result_iter")] +impl<'a, T, E> IntoIterator for &'a Result { + type Item = &'a T; + type IntoIter = Iter<'a, T>; + + fn into_iter(self) -> Iter<'a, T> { + self.iter() + } +} + +#[stable(since = "1.4.0", feature = "result_iter")] +impl<'a, T, E> IntoIterator for &'a mut Result { + type Item = &'a mut T; + type IntoIter = IterMut<'a, T>; + + fn into_iter(mut self) -> IterMut<'a, T> { + self.iter_mut() + } +} + ///////////////////////////////////////////////////////////////////////////// // The Result Iterators ///////////////////////////////////////////////////////////////////////////// diff --git a/src/libcoretest/option.rs b/src/libcoretest/option.rs index 04271ed5dd1..3e564cf1970 100644 --- a/src/libcoretest/option.rs +++ b/src/libcoretest/option.rs @@ -180,11 +180,14 @@ fn test_iter() { assert_eq!(it.next(), Some(&val)); assert_eq!(it.size_hint(), (0, Some(0))); assert!(it.next().is_none()); + + let mut it = (&x).into_iter(); + assert_eq!(it.next(), Some(&val)); } #[test] fn test_mut_iter() { - let val = 5; + let mut val = 5; let new_val = 11; let mut x = Some(val); @@ -205,6 +208,10 @@ fn test_mut_iter() { assert!(it.next().is_none()); } assert_eq!(x, Some(new_val)); + + let mut y = Some(val); + let mut it = (&mut y).into_iter(); + assert_eq!(it.next(), Some(&mut val)); } #[test] diff --git a/src/libcoretest/result.rs b/src/libcoretest/result.rs index 02ea6b10e6e..6e9f653dcd8 100644 --- a/src/libcoretest/result.rs +++ b/src/libcoretest/result.rs @@ -150,3 +150,36 @@ pub fn test_expect_err() { let err: Result = Err("All good"); err.expect("Got expected error"); } + +#[test] +pub fn test_iter() { + let ok: Result = Ok(100); + let mut it = ok.iter(); + assert_eq!(it.size_hint(), (1, Some(1))); + assert_eq!(it.next(), Some(&100)); + assert_eq!(it.size_hint(), (0, Some(0))); + assert!(it.next().is_none()); + assert_eq!((&ok).into_iter().next(), Some(&100)); + + let err: Result = Err("error"); + assert_eq!(err.iter().next(), None); +} + +#[test] +pub fn test_iter_mut() { + let mut ok: Result = Ok(100); + for loc in ok.iter_mut() { + *loc = 200; + } + assert_eq!(ok, Ok(200)); + for loc in &mut ok { + *loc = 300; + } + assert_eq!(ok, Ok(300)); + + let mut err: Result = Err("error"); + for loc in err.iter_mut() { + *loc = 200; + } + assert_eq!(err, Err("error")); +}