about summary refs log tree commit diff
path: root/src/libcollections
diff options
context:
space:
mode:
authornham <hamann.nick@gmail.com>2014-07-25 01:14:49 -0400
committernham <hamann.nick@gmail.com>2014-07-25 01:14:49 -0400
commit74b1aed0ec31d9719e585f82f76e8167c26d0c6f (patch)
tree55c24717a926381275f53d23cd3fc10efe8aa7b5 /src/libcollections
parent0b339e09ab5e6b6eb47adef1d82944dc620ac7d3 (diff)
downloadrust-74b1aed0ec31d9719e585f82f76e8167c26d0c6f.tar.gz
rust-74b1aed0ec31d9719e585f82f76e8167c26d0c6f.zip
Add methods for obtaining iterators over the keys and values of a TrieMap
Diffstat (limited to 'src/libcollections')
-rw-r--r--src/libcollections/trie.rs43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/libcollections/trie.rs b/src/libcollections/trie.rs
index 5c17dd91225..14ab122f0a4 100644
--- a/src/libcollections/trie.rs
+++ b/src/libcollections/trie.rs
@@ -18,6 +18,7 @@ use core::default::Default;
 use core::mem::zeroed;
 use core::mem;
 use core::uint;
+use core::iter;
 use std::hash::{Writer, Hash};
 
 use {Collection, Mutable, Map, MutableMap, Set, MutableSet};
@@ -196,6 +197,18 @@ impl<T> TrieMap<T> {
         self.root.each_reverse(f)
     }
 
+    /// Get an iterator visiting all keys in ascending order by the keys.
+    /// Iterator element type is `uint`.
+    pub fn keys<'r>(&'r self) -> Keys<'r, T> {
+        self.iter().map(|(k, _v)| k)
+    }
+
+    /// Get an iterator visiting all values in ascending order by the keys.
+    /// Iterator element type is `&'r T`.
+    pub fn values<'r>(&'r self) -> Values<'r, T> {
+        self.iter().map(|(_k, v)| v)
+    }
+
     /// Get an iterator over the key-value pairs in the map, ordered by keys.
     ///
     /// # Example
@@ -783,6 +796,14 @@ pub struct MutEntries<'a, T> {
     remaining_max: uint
 }
 
+/// Forward iterator over the keys of a map
+pub type Keys<'a, T> =
+    iter::Map<'static, (uint, &'a T), uint, Entries<'a, T>>;
+
+/// Forward iterator over the values of a map
+pub type Values<'a, T> =
+    iter::Map<'static, (uint, &'a T), &'a T, Entries<'a, T>>;
+
 // FIXME #5846: see `addr!` above.
 macro_rules! item { ($i:item) => {$i}}
 
@@ -1071,6 +1092,28 @@ mod test_map {
     }
 
     #[test]
+    fn test_keys() {
+        let vec = vec![(1, 'a'), (2, 'b'), (3, 'c')];
+        let map = vec.move_iter().collect::<TrieMap<char>>();
+        let keys = map.keys().collect::<Vec<uint>>();
+        assert_eq!(keys.len(), 3);
+        assert!(keys.contains(&1));
+        assert!(keys.contains(&2));
+        assert!(keys.contains(&3));
+    }
+
+    #[test]
+    fn test_values() {
+        let vec = vec![(1, 'a'), (2, 'b'), (3, 'c')];
+        let map = vec.move_iter().collect::<TrieMap<char>>();
+        let values = map.values().map(|&v| v).collect::<Vec<char>>();
+        assert_eq!(values.len(), 3);
+        assert!(values.contains(&'a'));
+        assert!(values.contains(&'b'));
+        assert!(values.contains(&'c'));
+    }
+
+    #[test]
     fn test_iteration() {
         let empty_map : TrieMap<uint> = TrieMap::new();
         assert_eq!(empty_map.iter().next(), None);