Implement size_hint() on all remaining Iterators
Add size_hint() to the Iterators in libextra and the Iterator in libsyntax. Skip deque for the moment, as it's being worked on elsewhere.
This commit is contained in:
parent
20016b92c8
commit
e6f9b08610
3 changed files with 20 additions and 2 deletions
|
@ -186,6 +186,9 @@ pub struct PriorityQueueIterator <'self, T> {
|
||||||
impl<'self, T> Iterator<&'self T> for PriorityQueueIterator<'self, T> {
|
impl<'self, T> Iterator<&'self T> for PriorityQueueIterator<'self, T> {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn next(&mut self) -> Option<(&'self T)> { self.iter.next() }
|
fn next(&mut self) -> Option<(&'self T)> { self.iter.next() }
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn size_hint(&self) -> (uint, Option<uint>) { self.iter.size_hint() }
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|
|
@ -196,14 +196,15 @@ impl<K: TotalOrd, V> TreeMap<K, V> {
|
||||||
/// Get a lazy iterator over the key-value pairs in the map.
|
/// Get a lazy iterator over the key-value pairs in the map.
|
||||||
/// Requires that it be frozen (immutable).
|
/// Requires that it be frozen (immutable).
|
||||||
pub fn iter<'a>(&'a self) -> TreeMapIterator<'a, K, V> {
|
pub fn iter<'a>(&'a self) -> TreeMapIterator<'a, K, V> {
|
||||||
TreeMapIterator{stack: ~[], node: &self.root}
|
TreeMapIterator{stack: ~[], node: &self.root, remaining: self.length}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Lazy forward iterator over a map
|
/// Lazy forward iterator over a map
|
||||||
pub struct TreeMapIterator<'self, K, V> {
|
pub struct TreeMapIterator<'self, K, V> {
|
||||||
priv stack: ~[&'self ~TreeNode<K, V>],
|
priv stack: ~[&'self ~TreeNode<K, V>],
|
||||||
priv node: &'self Option<~TreeNode<K, V>>
|
priv node: &'self Option<~TreeNode<K, V>>,
|
||||||
|
priv remaining: uint
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'self, K, V> Iterator<(&'self K, &'self V)> for TreeMapIterator<'self, K, V> {
|
impl<'self, K, V> Iterator<(&'self K, &'self V)> for TreeMapIterator<'self, K, V> {
|
||||||
|
@ -220,12 +221,18 @@ impl<'self, K, V> Iterator<(&'self K, &'self V)> for TreeMapIterator<'self, K, V
|
||||||
None => {
|
None => {
|
||||||
let res = self.stack.pop();
|
let res = self.stack.pop();
|
||||||
self.node = &res.right;
|
self.node = &res.right;
|
||||||
|
self.remaining -= 1;
|
||||||
return Some((&res.key, &res.value));
|
return Some((&res.key, &res.value));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn size_hint(&self) -> (uint, Option<uint>) {
|
||||||
|
(self.remaining, Some(self.remaining))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'self, T> Iterator<&'self T> for TreeSetIterator<'self, T> {
|
impl<'self, T> Iterator<&'self T> for TreeSetIterator<'self, T> {
|
||||||
|
|
|
@ -146,4 +146,12 @@ impl<'self, T> Iterator<&'self T> for OptVecIterator<'self, T> {
|
||||||
None => None
|
None => None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn size_hint(&self) -> (uint, Option<uint>) {
|
||||||
|
match self.iter {
|
||||||
|
Some(ref x) => x.size_hint(),
|
||||||
|
None => (0, Some(0))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue