periodic/map/
into_iter.rs1use super::KeyRingIntoIter;
2use super::RingDict;
3use crate::ring::Ratchet;
4use std::hash::Hash;
5use std::iter::{IntoIterator, Iterator};
6
7pub struct IntoIter<K, V>
8where
9 K: Hash + Eq + Clone,
10{
11 dict: RingDict<K, V>,
12 ring: KeyRingIntoIter<K>,
13 left: usize,
14}
15
16impl<K, V> IntoIterator for RingDict<K, V>
17where
18 K: Hash + Eq + Clone,
19{
20 type Item = (K, V);
21 type IntoIter = IntoIter<K, V>;
22
23 fn into_iter(self) -> Self::IntoIter {
24 let cap = self.capacity();
25 let mut ring = self.inner_ring().clone();
26 for _ in 0..(cap - self.inner_map().len()) {
27 ring.next();
28 }
29
30 IntoIter {
31 ring: ring.into_iter(),
32 left: self.capacity(),
33 dict: self,
34 }
35 }
36}
37
38impl<K, V> Iterator for IntoIter<K, V>
39where
40 K: Hash + Eq + Clone,
41{
42 type Item = (K, V);
43
44 fn next(&mut self) -> Option<Self::Item> {
45 if self.left == 0 {
46 None
47 } else {
48 self.ring
49 .next()
50 .and_then(|key| key.map(|k| (k.clone(), self.dict.remove(&k))))
51 .and_then(|(k, value)| {
52 value.map(|v| {
53 self.left -= 1;
54
55 (k.clone(), v)
56 })
57 })
58 }
59 }
60}
61
62#[test]
63fn test_into_iter_0() {
64 let rd0: RingDict<i32, &str> = RingDict::new(3);
65
66 let res0: Vec<(i32, &str)> = rd0.into_iter().collect();
67
68 assert_eq!(Vec::new() as Vec<(i32, &str)>, res0);
69}
70
71#[test]
72fn test_into_iter_1() {
73 let mut rd1: RingDict<i32, &str> = RingDict::new(3);
74
75 rd1.insert(1, "a");
76
77 let res1: Vec<(i32, &str)> = rd1.into_iter().collect();
78
79 assert_eq!(vec![(1, "a")], res1);
80}
81
82#[test]
83fn test_into_iter_2() {
84 let mut rd2: RingDict<i32, &str> = RingDict::new(3);
85
86 rd2.insert(1, "a");
87 rd2.insert(2, "b");
88
89 let res2: Vec<(i32, &str)> = rd2.into_iter().collect();
90
91 assert_eq!(vec![(1, "a"), (2, "b")], res2);
92}
93
94#[test]
95fn test_into_iter_3() {
96 let mut rd3: RingDict<i32, &str> = RingDict::new(3);
97
98 rd3.insert(1, "a");
99 rd3.insert(2, "b");
100 rd3.insert(3, "c");
101
102 let res3: Vec<(i32, &str)> = rd3.into_iter().collect();
103
104 assert_eq!(vec![(1, "a"), (2, "b"), (3, "c")], res3);
105}