diff options
| author | nham <hamann.nick@gmail.com> | 2014-07-25 01:14:49 -0400 |
|---|---|---|
| committer | nham <hamann.nick@gmail.com> | 2014-07-25 01:14:49 -0400 |
| commit | 74b1aed0ec31d9719e585f82f76e8167c26d0c6f (patch) | |
| tree | 55c24717a926381275f53d23cd3fc10efe8aa7b5 /src/libcollections | |
| parent | 0b339e09ab5e6b6eb47adef1d82944dc620ac7d3 (diff) | |
| download | rust-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.rs | 43 |
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); |
