std: Add .consume_iter() for Option, to make it reusable
Let Option be a base for a widely useful one- or zero- item iterator. Refactor OptionIterator to support any generic element type, so the same iterator impl can be used for both &T, &mut T and T iterators.
This commit is contained in:
parent
bbda3fa938
commit
ce682cb45f
@ -116,7 +116,7 @@ impl<T: ToStr> ToStr for Option<T> {
|
|||||||
impl<T> Option<T> {
|
impl<T> Option<T> {
|
||||||
/// Return an iterator over the possibly contained value
|
/// Return an iterator over the possibly contained value
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn iter<'r>(&'r self) -> OptionIterator<'r, T> {
|
pub fn iter<'r>(&'r self) -> OptionIterator<&'r T> {
|
||||||
match *self {
|
match *self {
|
||||||
Some(ref x) => OptionIterator{opt: Some(x)},
|
Some(ref x) => OptionIterator{opt: Some(x)},
|
||||||
None => OptionIterator{opt: None}
|
None => OptionIterator{opt: None}
|
||||||
@ -125,13 +125,19 @@ impl<T> Option<T> {
|
|||||||
|
|
||||||
/// Return a mutable iterator over the possibly contained value
|
/// Return a mutable iterator over the possibly contained value
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn mut_iter<'r>(&'r mut self) -> OptionMutIterator<'r, T> {
|
pub fn mut_iter<'r>(&'r mut self) -> OptionIterator<&'r mut T> {
|
||||||
match *self {
|
match *self {
|
||||||
Some(ref mut x) => OptionMutIterator{opt: Some(x)},
|
Some(ref mut x) => OptionIterator{opt: Some(x)},
|
||||||
None => OptionMutIterator{opt: None}
|
None => OptionIterator{opt: None}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Return a consuming iterator over the possibly contained value
|
||||||
|
#[inline]
|
||||||
|
pub fn consume_iter(self) -> OptionIterator<T> {
|
||||||
|
OptionIterator{opt: self}
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns true if the option equals `None`
|
/// Returns true if the option equals `None`
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn is_none(&self) -> bool {
|
pub fn is_none(&self) -> bool {
|
||||||
@ -404,31 +410,13 @@ impl<T> Zero for Option<T> {
|
|||||||
fn is_zero(&self) -> bool { self.is_none() }
|
fn is_zero(&self) -> bool { self.is_none() }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Immutable iterator over an `Option<A>`
|
/// Immutable iterator over an Option
|
||||||
pub struct OptionIterator<'self, A> {
|
pub struct OptionIterator<A> {
|
||||||
priv opt: Option<&'self A>
|
priv opt: Option<A>
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'self, A> Iterator<&'self A> for OptionIterator<'self, A> {
|
impl<A> Iterator<A> for OptionIterator<A> {
|
||||||
fn next(&mut self) -> Option<&'self A> {
|
fn next(&mut self) -> Option<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>`
|
|
||||||
pub struct OptionMutIterator<'self, A> {
|
|
||||||
priv opt: Option<&'self mut A>
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
util::replace(&mut self.opt, None)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user