|
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