|
18 | 18 |
|
19 | 19 | use std::cmp; |
20 | 20 | use std::container::{Container, Mutable, Map, Set}; |
21 | | -use std::iterator::{Iterator,IteratorUtil,ZipIterator,Counter}; |
| 21 | +use std::iterator::*; |
22 | 22 | use std::uint; |
23 | 23 | use std::util::replace; |
24 | 24 | use std::vec::{VecIterator,VecMutIterator,VecRevIterator,VecMutRevIterator}; |
| 25 | +use std::vec::VecConsumeIterator; |
25 | 26 |
|
26 | 27 | #[allow(missing_doc)] |
27 | 28 | pub struct SmallIntMap<T> { |
@@ -204,6 +205,17 @@ impl<V> SmallIntMap<V> { |
204 | 205 | iter: Counter::new(self.len() as int - 1, -1).zip(self.v.mut_rev_iter()) |
205 | 206 | } |
206 | 207 | } |
| 208 | + |
| 209 | + /// Empties the hash map, moving all values into the specified closure |
| 210 | + pub fn consume(&mut self) |
| 211 | + -> FilterMapIterator<(uint, Option<V>), (uint, V), |
| 212 | + EnumerateIterator<Option<V>, VecConsumeIterator<Option<V>>>> |
| 213 | + { |
| 214 | + let values = replace(&mut self.v, ~[]); |
| 215 | + values.consume_iter().enumerate().filter_map(|(i, v)| { |
| 216 | + v.map_consume(|v| (i, v)) |
| 217 | + }) |
| 218 | + } |
207 | 219 | } |
208 | 220 |
|
209 | 221 | impl<V:Copy> SmallIntMap<V> { |
@@ -625,6 +637,21 @@ mod tests { |
625 | 637 |
|
626 | 638 | assert!(a.iter().all(|(_,v)| *v == 5 )); |
627 | 639 | } |
| 640 | + |
| 641 | + #[test] |
| 642 | + fn test_consume() { |
| 643 | + let mut m = SmallIntMap::new(); |
| 644 | + m.insert(1, ~2); |
| 645 | + let mut called = false; |
| 646 | + for m.consume().advance |(k, v)| { |
| 647 | + assert!(!called); |
| 648 | + called = true; |
| 649 | + assert_eq!(k, 1); |
| 650 | + assert_eq!(v, ~2); |
| 651 | + } |
| 652 | + assert!(called); |
| 653 | + m.insert(2, ~1); |
| 654 | + } |
628 | 655 | } |
629 | 656 |
|
630 | 657 | #[cfg(test)] |
|
0 commit comments