diff options
| author | =Mark Sinclair <mark.edward.x@gmail.com> | 2013-07-14 12:20:48 -0400 |
|---|---|---|
| committer | =Mark Sinclair <mark.edward.x@gmail.com> | 2013-07-14 12:20:48 -0400 |
| commit | bb6615d43a872d8cd3e2e33be5ff9efebf9cc02e (patch) | |
| tree | 9afe703e797127c50b2304596b8a4a06b20df345 /src/libstd | |
| parent | 4ff7ef434ff5805dc8636fa0bb821feeb0705d22 (diff) | |
| download | rust-bb6615d43a872d8cd3e2e33be5ff9efebf9cc02e.tar.gz rust-bb6615d43a872d8cd3e2e33be5ff9efebf9cc02e.zip | |
Implemented FromIterator for TrieMap and TrieSet
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/hashmap.rs | 25 | ||||
| -rw-r--r-- | src/libstd/trie.rs | 80 |
2 files changed, 91 insertions, 14 deletions
diff --git a/src/libstd/hashmap.rs b/src/libstd/hashmap.rs index d62a445882e..c219886cd03 100644 --- a/src/libstd/hashmap.rs +++ b/src/libstd/hashmap.rs @@ -735,6 +735,20 @@ impl<T:Hash + Eq> HashSet<T> { } } +impl<K: Eq + Hash, T: Iterator<K>> FromIterator<K, T> for HashSet<K> { + pub fn from_iterator(iter: &mut T) -> HashSet<K> { + let (lower, _) = iter.size_hint(); + let mut set = HashSet::with_capacity(lower); + + for iter.advance |k| { + set.insert(k); + } + + set + } +} + + #[cfg(test)] mod test_map { use container::{Container, Map, Set}; @@ -1139,4 +1153,15 @@ mod test_set { } assert_eq!(i, expected.len()); } + + #[test] + fn test_from_iter() { + let xs = ~[1, 2, 3, 4, 5, 6, 7, 8, 9]; + + let set: HashSet<int> = xs.iter().transform(|&x| x).collect(); + + for xs.iter().advance |x: &int| { + assert!(set.contains(x)); + } + } } diff --git a/src/libstd/trie.rs b/src/libstd/trie.rs index 8ce02d59ab1..fd2cfa08b30 100644 --- a/src/libstd/trie.rs +++ b/src/libstd/trie.rs @@ -11,7 +11,7 @@ //! An ordered map and set for integer keys implemented as a radix trie use prelude::*; -use iterator::IteratorUtil; +use iterator::{IteratorUtil, FromIterator}; use uint; use util::{swap, replace}; @@ -171,6 +171,18 @@ impl<T> TrieMap<T> { } } +impl<T, Iter: Iterator<(uint, T)>> FromIterator<(uint, T), Iter> for TrieMap<T> { + pub fn from_iterator(iter: &mut Iter) -> TrieMap<T> { + let mut map = TrieMap::new(); + + for iter.advance |(k, v)| { + map.insert(k, v); + } + + map + } +} + #[allow(missing_doc)] pub struct TrieSet { priv map: TrieMap<()> @@ -230,6 +242,18 @@ impl TrieSet { } } +impl<Iter: Iterator<uint>> FromIterator<uint, Iter> for TrieSet { + pub fn from_iterator(iter: &mut Iter) -> TrieSet { + let mut set = TrieSet::new(); + + for iter.advance |elem| { + set.insert(elem); + } + + set + } +} + struct TrieNode<T> { count: uint, children: [Child<T>, ..SIZE] @@ -382,7 +406,7 @@ pub fn check_integrity<T>(trie: &TrieNode<T>) { } #[cfg(test)] -mod tests { +mod test_map { use super::*; use core::option::{Some, None}; use uint; @@ -511,6 +535,39 @@ mod tests { } #[test] + fn test_swap() { + let mut m = TrieMap::new(); + assert_eq!(m.swap(1, 2), None); + assert_eq!(m.swap(1, 3), Some(2)); + assert_eq!(m.swap(1, 4), Some(3)); + } + + #[test] + fn test_pop() { + let mut m = TrieMap::new(); + m.insert(1, 2); + assert_eq!(m.pop(&1), Some(2)); + assert_eq!(m.pop(&1), None); + } + + #[test] + fn test_from_iter() { + let xs = ~[(1u, 1i), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)]; + + let map: TrieMap<int> = xs.iter().transform(|&x| x).collect(); + + for xs.iter().advance |&(k, v)| { + assert_eq!(map.find(&k), Some(&v)); + } + } +} + +#[cfg(test)] +mod test_set { + use super::*; + use uint; + + #[test] fn test_sane_chunk() { let x = 1; let y = 1 << (uint::bits - 1); @@ -533,18 +590,13 @@ mod tests { } #[test] - fn test_swap() { - let mut m = TrieMap::new(); - assert_eq!(m.swap(1, 2), None); - assert_eq!(m.swap(1, 3), Some(2)); - assert_eq!(m.swap(1, 4), Some(3)); - } + fn test_from_iter() { + let xs = ~[9u, 8, 7, 6, 5, 4, 3, 2, 1]; + + let set: TrieSet = xs.iter().transform(|&x| x).collect(); - #[test] - fn test_pop() { - let mut m = TrieMap::new(); - m.insert(1, 2); - assert_eq!(m.pop(&1), Some(2)); - assert_eq!(m.pop(&1), None); + for xs.iter().advance |x| { + assert!(set.contains(x)); + } } } |
