Skip to content

Commit 51cc430

Browse files
committed
Rollup merge of rust-lang#28039 - birkenfeld:option_result_ref_intoiter, r=alexcrichton
Fixes rust-lang#27996. Does this need any `#[stable]`/`#[unstable]` attributes?
2 parents 4d975c9 + a7313a0 commit 51cc430

File tree

4 files changed

+81
-1
lines changed

4 files changed

+81
-1
lines changed

src/libcore/option.rs

+20
Original file line numberDiff line numberDiff line change
@@ -779,6 +779,26 @@ impl<T> IntoIterator for Option<T> {
779779
}
780780
}
781781

782+
#[stable(since = "1.4.0", feature = "option_iter")]
783+
impl<'a, T> IntoIterator for &'a Option<T> {
784+
type Item = &'a T;
785+
type IntoIter = Iter<'a, T>;
786+
787+
fn into_iter(self) -> Iter<'a, T> {
788+
self.iter()
789+
}
790+
}
791+
792+
#[stable(since = "1.4.0", feature = "option_iter")]
793+
impl<'a, T> IntoIterator for &'a mut Option<T> {
794+
type Item = &'a mut T;
795+
type IntoIter = IterMut<'a, T>;
796+
797+
fn into_iter(mut self) -> IterMut<'a, T> {
798+
self.iter_mut()
799+
}
800+
}
801+
782802
/////////////////////////////////////////////////////////////////////////////
783803
// The Option Iterators
784804
/////////////////////////////////////////////////////////////////////////////

src/libcore/result.rs

+20
Original file line numberDiff line numberDiff line change
@@ -815,6 +815,26 @@ impl<T, E> IntoIterator for Result<T, E> {
815815
}
816816
}
817817

818+
#[stable(since = "1.4.0", feature = "result_iter")]
819+
impl<'a, T, E> IntoIterator for &'a Result<T, E> {
820+
type Item = &'a T;
821+
type IntoIter = Iter<'a, T>;
822+
823+
fn into_iter(self) -> Iter<'a, T> {
824+
self.iter()
825+
}
826+
}
827+
828+
#[stable(since = "1.4.0", feature = "result_iter")]
829+
impl<'a, T, E> IntoIterator for &'a mut Result<T, E> {
830+
type Item = &'a mut T;
831+
type IntoIter = IterMut<'a, T>;
832+
833+
fn into_iter(mut self) -> IterMut<'a, T> {
834+
self.iter_mut()
835+
}
836+
}
837+
818838
/////////////////////////////////////////////////////////////////////////////
819839
// The Result Iterators
820840
/////////////////////////////////////////////////////////////////////////////

src/libcoretest/option.rs

+8-1
Original file line numberDiff line numberDiff line change
@@ -180,11 +180,14 @@ fn test_iter() {
180180
assert_eq!(it.next(), Some(&val));
181181
assert_eq!(it.size_hint(), (0, Some(0)));
182182
assert!(it.next().is_none());
183+
184+
let mut it = (&x).into_iter();
185+
assert_eq!(it.next(), Some(&val));
183186
}
184187

185188
#[test]
186189
fn test_mut_iter() {
187-
let val = 5;
190+
let mut val = 5;
188191
let new_val = 11;
189192

190193
let mut x = Some(val);
@@ -205,6 +208,10 @@ fn test_mut_iter() {
205208
assert!(it.next().is_none());
206209
}
207210
assert_eq!(x, Some(new_val));
211+
212+
let mut y = Some(val);
213+
let mut it = (&mut y).into_iter();
214+
assert_eq!(it.next(), Some(&mut val));
208215
}
209216

210217
#[test]

src/libcoretest/result.rs

+33
Original file line numberDiff line numberDiff line change
@@ -150,3 +150,36 @@ pub fn test_expect_err() {
150150
let err: Result<isize, &'static str> = Err("All good");
151151
err.expect("Got expected error");
152152
}
153+
154+
#[test]
155+
pub fn test_iter() {
156+
let ok: Result<isize, &'static str> = Ok(100);
157+
let mut it = ok.iter();
158+
assert_eq!(it.size_hint(), (1, Some(1)));
159+
assert_eq!(it.next(), Some(&100));
160+
assert_eq!(it.size_hint(), (0, Some(0)));
161+
assert!(it.next().is_none());
162+
assert_eq!((&ok).into_iter().next(), Some(&100));
163+
164+
let err: Result<isize, &'static str> = Err("error");
165+
assert_eq!(err.iter().next(), None);
166+
}
167+
168+
#[test]
169+
pub fn test_iter_mut() {
170+
let mut ok: Result<isize, &'static str> = Ok(100);
171+
for loc in ok.iter_mut() {
172+
*loc = 200;
173+
}
174+
assert_eq!(ok, Ok(200));
175+
for loc in &mut ok {
176+
*loc = 300;
177+
}
178+
assert_eq!(ok, Ok(300));
179+
180+
let mut err: Result<isize, &'static str> = Err("error");
181+
for loc in err.iter_mut() {
182+
*loc = 200;
183+
}
184+
assert_eq!(err, Err("error"));
185+
}

0 commit comments

Comments
 (0)