diff options
| author | bors <bors@rust-lang.org> | 2013-07-14 12:01:22 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2013-07-14 12:01:22 -0700 |
| commit | 0cb1ac0f9f7bf98ea8ab5ccbd6ef319decc41a72 (patch) | |
| tree | 273268a2048fe1c4c1e41750f8fac87d1d7810f1 /src/libextra | |
| parent | 1c35ab322ff2f26962a3550fffc2fa4154224b64 (diff) | |
| parent | bbe03da9c6bad23d8e09077461c1616872e1aca0 (diff) | |
| download | rust-0cb1ac0f9f7bf98ea8ab5ccbd6ef319decc41a72.tar.gz rust-0cb1ac0f9f7bf98ea8ab5ccbd6ef319decc41a72.zip | |
auto merge of #7788 : MarkJr94/rust/from_iter, r=cmr
Added Iterators for HashMap/Set, TreeMap/Set, TrieMap/Set, and PriorityQueue as per Issue #7626
Diffstat (limited to 'src/libextra')
| -rw-r--r-- | src/libextra/priority_queue.rs | 27 | ||||
| -rw-r--r-- | src/libextra/treemap.rs | 47 |
2 files changed, 74 insertions, 0 deletions
diff --git a/src/libextra/priority_queue.rs b/src/libextra/priority_queue.rs index 1f7ba9f6530..58bf4ba9247 100644 --- a/src/libextra/priority_queue.rs +++ b/src/libextra/priority_queue.rs @@ -16,6 +16,7 @@ use std::unstable::intrinsics::{move_val_init, init}; use std::util::{replace, swap}; use std::vec; +use std::iterator::FromIterator; /// A priority queue implemented with a binary heap pub struct PriorityQueue<T> { @@ -191,6 +192,21 @@ impl<'self, T> Iterator<&'self T> for PriorityQueueIterator<'self, T> { fn size_hint(&self) -> (uint, Option<uint>) { self.iter.size_hint() } } +impl<T: Ord, Iter: Iterator<T>> FromIterator<T, Iter> for PriorityQueue<T> { + pub fn from_iterator(iter: &mut Iter) -> PriorityQueue<T> { + let (lower, _) = iter.size_hint(); + + let mut q = PriorityQueue::new(); + q.reserve_at_least(lower); + + for iter.advance |elem| { + q.push(elem); + } + + q + } +} + #[cfg(test)] mod tests { use sort::merge_sort; @@ -341,4 +357,15 @@ mod tests { #[should_fail] #[ignore(cfg(windows))] fn test_empty_replace() { let mut heap = PriorityQueue::new(); heap.replace(5); } + + #[test] + fn test_from_iter() { + let xs = ~[9u, 8, 7, 6, 5, 4, 3, 2, 1]; + + let mut q: PriorityQueue<uint> = xs.rev_iter().transform(|&x| x).collect(); + + for xs.iter().advance |&x| { + assert_eq!(q.pop(), x); + } + } } diff --git a/src/libextra/treemap.rs b/src/libextra/treemap.rs index 05a941b4925..f1fe7acb00f 100644 --- a/src/libextra/treemap.rs +++ b/src/libextra/treemap.rs @@ -15,6 +15,7 @@ use std::num; use std::util::{swap, replace}; +use std::iterator::FromIterator; // This is implemented as an AA tree, which is a simplified variation of // a red-black tree where red (horizontal) nodes can only be added @@ -699,6 +700,30 @@ fn remove<K: TotalOrd, V>(node: &mut Option<~TreeNode<K, V>>, }; } +impl<K: TotalOrd, V, T: Iterator<(K, V)>> FromIterator<(K, V), T> for TreeMap<K, V> { + pub fn from_iterator(iter: &mut T) -> TreeMap<K, V> { + let mut map = TreeMap::new(); + + for iter.advance |(k, v)| { + map.insert(k, v); + } + + map + } +} + +impl<T: TotalOrd, Iter: Iterator<T>> FromIterator<T, Iter> for TreeSet<T> { + pub fn from_iterator(iter: &mut Iter) -> TreeSet<T> { + let mut set = TreeSet::new(); + + for iter.advance |elem| { + set.insert(elem); + } + + set + } +} + #[cfg(test)] mod test_treemap { @@ -1017,6 +1042,17 @@ mod test_treemap { i += 1; } } + + #[test] + fn test_from_iter() { + let xs = ~[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)]; + + let map: TreeMap<int, int> = xs.iter().transform(|&x| x).collect(); + + for xs.iter().advance |&(k, v)| { + assert_eq!(map.find(&k), Some(&v)); + } + } } #[cfg(test)] @@ -1244,4 +1280,15 @@ mod test_set { assert_eq!(m.pop(&1), Some(2)); assert_eq!(m.pop(&1), None); } + + #[test] + fn test_from_iter() { + let xs = ~[1, 2, 3, 4, 5, 6, 7, 8, 9]; + + let set: TreeSet<int> = xs.iter().transform(|&x| x).collect(); + + for xs.iter().advance |x: &int| { + assert!(set.contains(x)); + } + } } |
