Skip to content

Commit

Permalink
std: Implement Iterator::size_hint method for Option iterators
Browse files Browse the repository at this point in the history
  • Loading branch information
apasel422 authored and thestinger committed Jul 9, 2013
1 parent a4af096 commit f2bd441
Showing 1 changed file with 50 additions and 0 deletions.
50 changes: 50 additions & 0 deletions src/libstd/option.rs
Expand Up @@ -379,6 +379,13 @@ impl<'self, A> Iterator<&'self A> for OptionIterator<'self, A> {
fn next(&mut self) -> Option<&'self A> {
util::replace(&mut self.opt, None)
}

fn size_hint(&self) -> (uint, Option<uint>) {
match self.opt {
Some(_) => (1, Some(1)),
None => (0, Some(0)),
}
}
}

/// Mutable iterator over an `Option<A>`
Expand All @@ -390,6 +397,13 @@ impl<'self, A> Iterator<&'self mut A> for OptionMutIterator<'self, A> {
fn next(&mut self) -> Option<&'self mut A> {
util::replace(&mut self.opt, None)
}

fn size_hint(&self) -> (uint, Option<uint>) {
match self.opt {
Some(_) => (1, Some(1)),
None => (0, Some(0)),
}
}
}

#[test]
Expand Down Expand Up @@ -487,3 +501,39 @@ fn test_filtered() {
assert_eq!(some_stuff.get(), 42);
assert!(modified_stuff.is_none());
}

#[test]
fn test_iter() {
let val = 5;

let x = Some(val);
let mut it = x.iter();

assert_eq!(it.size_hint(), (1, Some(1)));
assert_eq!(it.next(), Some(&val));
assert_eq!(it.size_hint(), (0, Some(0)));
assert!(it.next().is_none());
}

#[test]
fn test_mut_iter() {
let val = 5;
let new_val = 11;

let mut x = Some(val);
let mut it = x.mut_iter();

assert_eq!(it.size_hint(), (1, Some(1)));

match it.next() {
Some(interior) => {
assert_eq!(*interior, val);
*interior = new_val;
assert_eq!(x, Some(new_val));
}
None => assert!(false),
}

assert_eq!(it.size_hint(), (0, Some(0)));
assert!(it.next().is_none());
}

0 comments on commit f2bd441

Please sign in to comment.