]> git.lizzy.rs Git - rust.git/commitdiff
Implement size_hint() on all remaining Iterators
authorKevin Ballard <kevin@sb.org>
Wed, 3 Jul 2013 18:30:12 +0000 (11:30 -0700)
committerKevin Ballard <kevin@sb.org>
Sat, 6 Jul 2013 21:14:45 +0000 (14:14 -0700)
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.

src/libextra/priority_queue.rs
src/libextra/treemap.rs
src/libsyntax/opt_vec.rs

index 3d1ca4a9818b61572568b195464f9b104cec37e9..1f7ba9f65303c824814e7a6ee2d5379ab9e8ba87 100644 (file)
@@ -186,6 +186,9 @@ pub struct PriorityQueueIterator <'self, T> {
 impl<'self, T> Iterator<&'self T> for PriorityQueueIterator<'self, T> {
     #[inline]
     fn next(&mut self) -> Option<(&'self T)> { self.iter.next() }
+
+    #[inline]
+    fn size_hint(&self) -> (uint, Option<uint>) { self.iter.size_hint() }
 }
 
 #[cfg(test)]
index 5e898f8e59d9d450973b5b205f98fed5ea6d16a3..b7df27c0e49758ff447d9361746d17ff184408f3 100644 (file)
@@ -196,14 +196,15 @@ pub fn each_value_reverse(&self, f: &fn(&V) -> bool) -> bool {
     /// Get a lazy iterator over the key-value pairs in the map.
     /// Requires that it be frozen (immutable).
     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
 pub struct TreeMapIterator<'self, 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> {
@@ -220,12 +221,18 @@ fn next(&mut self) -> Option<(&'self K, &'self V)> {
               None => {
                 let res = self.stack.pop();
                 self.node = &res.right;
+                self.remaining -= 1;
                 return Some((&res.key, &res.value));
               }
             }
         }
         None
     }
+
+    #[inline]
+    fn size_hint(&self) -> (uint, Option<uint>) {
+        (self.remaining, Some(self.remaining))
+    }
 }
 
 impl<'self, T> Iterator<&'self T> for TreeSetIterator<'self, T> {
index bf8c5ae462bf0284d5f42e5682eb9d080150602c..8e2da3d6eb1aab48bf78d0a6b082e9a5cf511138 100644 (file)
@@ -146,4 +146,12 @@ fn next(&mut self) -> Option<&'self T> {
             None => None
         }
     }
+
+    #[inline]
+    fn size_hint(&self) -> (uint, Option<uint>) {
+        match self.iter {
+            Some(ref x) => x.size_hint(),
+            None => (0, Some(0))
+        }
+    }
 }