From ce682cb45ff6f899d478358d7517fa83b215ac3c Mon Sep 17 00:00:00 2001 From: blake2-ppc Date: Sat, 3 Aug 2013 19:40:20 +0200 Subject: [PATCH] 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. --- src/libstd/option.rs | 42 +++++++++++++++--------------------------- 1 file changed, 15 insertions(+), 27 deletions(-) diff --git a/src/libstd/option.rs b/src/libstd/option.rs index 3a4a9220ee1..40a3944b7e0 100644 --- a/src/libstd/option.rs +++ b/src/libstd/option.rs @@ -116,7 +116,7 @@ impl ToStr for Option { impl Option { /// Return an iterator over the possibly contained value #[inline] - pub fn iter<'r>(&'r self) -> OptionIterator<'r, T> { + pub fn iter<'r>(&'r self) -> OptionIterator<&'r T> { match *self { Some(ref x) => OptionIterator{opt: Some(x)}, None => OptionIterator{opt: None} @@ -125,13 +125,19 @@ impl Option { /// Return a mutable iterator over the possibly contained value #[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 { - Some(ref mut x) => OptionMutIterator{opt: Some(x)}, - None => OptionMutIterator{opt: None} + Some(ref mut x) => OptionIterator{opt: Some(x)}, + None => OptionIterator{opt: None} } } + /// Return a consuming iterator over the possibly contained value + #[inline] + pub fn consume_iter(self) -> OptionIterator { + OptionIterator{opt: self} + } + /// Returns true if the option equals `None` #[inline] pub fn is_none(&self) -> bool { @@ -404,31 +410,13 @@ impl Zero for Option { fn is_zero(&self) -> bool { self.is_none() } } -/// Immutable iterator over an `Option` -pub struct OptionIterator<'self, A> { - priv opt: Option<&'self A> +/// Immutable iterator over an Option +pub struct OptionIterator { + priv opt: Option } -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) { - match self.opt { - Some(_) => (1, Some(1)), - None => (0, Some(0)), - } - } -} - -/// Mutable iterator over an `Option` -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> { +impl Iterator for OptionIterator { + fn next(&mut self) -> Option { util::replace(&mut self.opt, None) }