periodic/map/
into_iter.rs

1use 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}