total_order_multi_map/
iter.rs1use std::hash::Hash;
3use std::cmp::Eq;
4use std::slice;
5use std::fmt::{ self, Debug };
6use std::ops::DerefMut;
7use std::iter::ExactSizeIterator;
8
9use stable_deref_trait::StableDeref;
10
11use super::TotalOrderMultiMap;
12
13impl<K, V> TotalOrderMultiMap<K, V>
14 where K: Hash + Eq + Copy,
15 V: StableDeref + DerefMut,
16{
17 pub fn iter(&self) -> Iter<K, V> {
21 Iter {
22 vec_iter: self.vec_data.iter()
23 }
24 }
25
26}
27
28pub struct Iter<'a, K: 'a, V: 'a> {
30 vec_iter: slice::Iter<'a, (K, V)>
31}
32
33impl<'a, K, V> Clone for Iter<'a, K, V> {
34 fn clone(&self) -> Self {
35 Iter { vec_iter: self.vec_iter.clone() }
36 }
37}
38
39impl<'a, K, V> Debug for Iter<'a, K, V>
40 where K: Hash + Eq + Copy + Debug,
41 V: StableDeref + DerefMut,
42 V::Target: Debug
43{
44 fn fmt(&self, fter: &mut fmt::Formatter) -> fmt::Result {
45 fter.debug_list().entries(self.clone()).finish()
46 }
47}
48
49impl<'a, K, V> Iterator for Iter<'a, K,V>
50 where K: Hash + Eq + Copy,
51 V: StableDeref + DerefMut
52{
53 type Item = (K, &'a V::Target);
54
55 fn next(&mut self) -> Option<Self::Item> {
56 self.vec_iter.next()
57 .map( |&(ref key, ref value)| {
58 (*key, &**value)
59 } )
60 }
61
62 fn size_hint(&self) -> (usize, Option<usize>) {
63 self.vec_iter.size_hint()
64 }
65}
66
67impl<'a, K, V> ExactSizeIterator for Iter<'a, K, V>
68 where K: Hash + Eq + Copy,
69 V: StableDeref + DerefMut
70{
71 fn len(&self) -> usize {
72 self.vec_iter.len()
73 }
74}
75
76
77impl<K, V> TotalOrderMultiMap<K, V>
78 where K: Hash + Eq + Copy,
79 V: StableDeref + DerefMut
80{
81 pub fn iter_mut(&mut self) -> IterMut<K, V> {
82 IterMut {
83 vec_iter: self.vec_data.iter_mut()
84 }
85 }
86}
87
88pub struct IterMut<'a, K: 'a, V: 'a> {
89 vec_iter: slice::IterMut<'a, (K, V)>
90}
91
92impl<'a, K: 'a, V: 'a> From<IterMut<'a, K, V>> for Iter<'a, K, V> {
93 fn from(valsmut: IterMut<'a, K, V>) -> Self {
94 let IterMut { vec_iter } = valsmut;
95 let as_slice = vec_iter.into_slice();
96 let vec_iter = as_slice.iter();
97 Iter { vec_iter }
98 }
99}
100
101impl<'a, K, V> Iterator for IterMut<'a, K, V>
102 where K: Hash + Eq + Copy,
103 V: StableDeref + DerefMut
104{
105 type Item = (K, &'a mut V::Target);
106
107 fn next(&mut self) -> Option<Self::Item> {
108 self.vec_iter.next()
109 .map(|&mut (ref key, ref mut value)| {
110 (*key, &mut **value)
111 })
112 }
113
114 fn size_hint(&self) -> (usize, Option<usize>) {
115 self.vec_iter.size_hint()
116 }
117}
118
119impl<'a, K, V> ExactSizeIterator for IterMut<'a, K, V>
120 where K: Hash + Eq + Copy,
121 V: StableDeref + DerefMut
122{
123 fn len(&self) -> usize {
124 self.vec_iter.len()
125 }
126}
127
128impl<'a, K, V> Debug for IterMut<'a, K, V>
129 where K: Hash + Eq + Copy + Debug,
130 V: StableDeref + DerefMut+ DerefMut,
131 V::Target: Debug
132{
133 fn fmt(&self, fter: &mut fmt::Formatter) -> fmt::Result {
134 fter.write_str("IterMut { .. }")
135 }
136}
137
138#[cfg(test)]
139mod tests {
140 use super::*;
141
142 #[test]
143 fn convert_iter_mut_to_non_mut() {
144 let mut map = TotalOrderMultiMap::new();
145 map.add("k1", "v1".to_owned());
146 let iter: Iter<_,_> = map.iter_mut().into();
147 assert_eq!(
148 vec![("k1", "v1")],
149 iter.collect::<Vec<_>>()
150 )
151 }
152
153}