1use std::collections::hash_map;
2use std::slice;
3use std::hash::Hash;
4use std::cmp::Eq;
5use std::ops::DerefMut;
6use std::fmt::{self, Debug};
7use std::iter::{Iterator, ExactSizeIterator};
8
9use stable_deref_trait::StableDeref;
10
11
12use super::TotalOrderMultiMap;
13
14
15impl<K, V> TotalOrderMultiMap<K, V>
16 where K: Hash+Eq+Copy,
17 V: StableDeref + DerefMut
18{
19 pub fn keys(&self) -> Keys<K, V::Target> {
24 Keys { inner_iter: self.map_access.keys() }
25 }
26
27 pub fn group_iter(&self) -> GroupedValues<K, V::Target> {
29 GroupedValues { inner_iter: self.map_access.iter() }
30 }
31
32 pub fn group_iter_mut(&mut self) -> GroupedValuesMut<K, V::Target> {
34 GroupedValuesMut { inner_iter: self.map_access.iter_mut() }
35 }
36
37 pub fn values(&self) -> Values<K, V> {
42 Values { inner_iter: self.vec_data.iter() }
43 }
44
45
46 pub fn values_mut(&mut self) -> ValuesMut<K, V> {
48 ValuesMut { inner_iter: self.vec_data.iter_mut() }
49 }
50}
51
52#[derive(Clone)]
53pub struct Keys<'a, K: 'a, T: ?Sized + 'a> {
54 inner_iter: hash_map::Keys<'a, K, Vec<*mut T>>
55}
56
57impl<'a, K: Debug+'a, T: 'a> Debug for Keys<'a, K, T> {
58 fn fmt(&self, fter: &mut fmt::Formatter) -> fmt::Result {
59 self.inner_iter.fmt(fter)
60 }
61}
62
63impl<'a, K: 'a, T: 'a> Iterator for Keys<'a, K, T>
64 where K: Copy
65{
66 type Item = K;
67
68 #[inline]
69 fn next(&mut self) -> Option<Self::Item> {
70 self.inner_iter.next().map(|&k|k)
71 }
72
73 #[inline]
74 fn size_hint(&self) -> (usize, Option<usize>) {
75 self.inner_iter.size_hint()
76 }
77}
78
79impl<'a, K, T> ExactSizeIterator for Keys<'a, K, T>
80 where K: Copy + 'a, T: 'a
81{
82 #[inline]
83 fn len(&self) -> usize {
84 self.inner_iter.len()
85 }
86}
87
88pub struct Group<'a, K, T>
94 where K: Copy + 'a,
95 T: ?Sized + 'a,
96{
97 inner_iter: slice::Iter<'a, *mut T>,
99 key: K
100}
101
102impl<'a, K, T> Clone for Group<'a, K, T>
103 where K: Copy + 'a,
104 T: ?Sized + 'a,
105{
106 fn clone(&self) -> Self {
107 Group {
108 key: self.key.clone(),
109 inner_iter: self.inner_iter.clone(),
110 }
111 }
112}
113
114impl<'a, K, T> Group<'a, K, T>
115 where K: Copy + 'a,
116 T: ?Sized + 'a,
117{
118 pub fn key(&self) -> K {
119 self.key
120 }
121}
122
123impl<'a, K, T> Iterator for Group<'a, K, T>
124 where K: Copy + 'a,
125 T: ?Sized + 'a
126{
127 type Item = &'a T;
128
129 #[inline]
130 fn next(&mut self) -> Option<Self::Item> {
131 self.inner_iter.next().map(|&ptr| unsafe { &*ptr } )
133 }
134
135 #[inline]
136 fn size_hint(&self) -> (usize, Option<usize>) {
137 self.inner_iter.size_hint()
138 }
139}
140
141pub struct GroupMut<'a, K, T>
146 where K: Copy + 'a,
147 T: ?Sized + 'a,
148{
149 inner_iter: slice::IterMut<'a, *mut T>,
151 key: K
152}
153
154impl<'a, K, T> GroupMut<'a, K, T>
155 where K: Copy + 'a,
156 T: ?Sized + 'a,
157{
158 pub fn key(&self) -> K {
159 self.key
160 }
161}
162
163impl<'a, K, T> Iterator for GroupMut<'a, K, T>
164 where K: Copy + 'a,
165 T: ?Sized + 'a
166{
167 type Item = &'a mut T;
168
169 #[inline]
170 fn next(&mut self) -> Option<Self::Item> {
171 self.inner_iter.next().map(|&mut ptr| unsafe { &mut *ptr } )
173 }
174
175 #[inline]
176 fn size_hint(&self) -> (usize, Option<usize>) {
177 self.inner_iter.size_hint()
178 }
179}
180
181
182impl<'a, K, T> ExactSizeIterator for GroupMut<'a, K, T>
183 where K: Copy + 'a,
184 T: ?Sized + 'a,
185{
186 #[inline]
187 fn len(&self) -> usize {
188 self.inner_iter.len()
189 }
190}
191
192impl<'a, K, T> Debug for Group<'a, K, T>
193 where K: Debug + Copy + 'a,
194 T: Debug + ?Sized + 'a,
195{
196 fn fmt(&self, fter: &mut fmt::Formatter) -> fmt::Result {
197 fter.write_str("Group { .. }")
198 }
199}
200
201
202pub struct GroupedValues<
204 'a,
205 K: Copy + 'a,
206 T: ?Sized + 'a,
207> {
208 inner_iter: hash_map::Iter<'a, K, Vec<*mut T>>
210}
211
212impl<'a, K, T> Clone for GroupedValues<'a, K, T>
213 where K: Copy + 'a,
214 T: ?Sized + 'a,
215{
216 #[inline]
217 fn clone(&self) -> Self {
218 GroupedValues { inner_iter: self.inner_iter.clone() }
219 }
220
221}
222
223impl<'a, K, T> Debug for GroupedValues<'a, K, T>
224 where K: Copy + 'a,
225 T: Debug + ?Sized + 'a,
226{
227 fn fmt(&self, fter: &mut fmt::Formatter) -> fmt::Result {
228 fter.debug_list()
229 .entry(&self.clone())
230 .finish()
231 }
232}
233
234impl<'a, K, T> Iterator for GroupedValues<'a, K, T>
235 where K: Copy + 'a,
236 T: ?Sized + 'a,
237{
238 type Item = Group<'a, K, T>;
239
240 #[inline]
241 fn next(&mut self) -> Option<Self::Item> {
242 self.inner_iter.next().map(|(k, values)| {
243 Group {
244 inner_iter: values.iter(),
245 key: *k,
246 }
247 })
248 }
249}
250
251pub struct GroupedValuesMut<
253 'a,
254 K: Copy + 'a,
255 T: ?Sized + 'a,
256> {
257 inner_iter: hash_map::IterMut<'a, K, Vec<*mut T>>
258}
259
260impl<'a, K, T> Debug for GroupedValuesMut<'a, K, T>
261 where K: Copy + 'a,
262 T: Debug + ?Sized + 'a,
263{
264 fn fmt(&self, fter: &mut fmt::Formatter) -> fmt::Result {
265 fter.write_str("GroupedValuesMut { .. }")
266 }
267}
268
269impl<'a, K, T> Iterator for GroupedValuesMut<'a, K, T>
270 where K: Copy + 'a,
271 T: ?Sized + 'a,
272{
273 type Item = GroupMut<'a, K, T>;
274
275 #[inline]
276 fn next(&mut self) -> Option<Self::Item> {
277 self.inner_iter.next().map(|(k, values)| {
278 GroupMut {
279 inner_iter: values.iter_mut(),
280 key: *k,
281 }
282 })
283 }
284}
285
286
287
288pub struct Values<'a, K: 'a, V: 'a> {
289 inner_iter: slice::Iter<'a, (K, V)>
290}
291
292pub struct ValuesMut<'a, K: 'a, V: 'a> {
293 inner_iter: slice::IterMut<'a, (K, V)>
294}
295
296impl<'a, K: 'a, V: 'a> From<ValuesMut<'a, K, V>> for Values<'a, K, V> {
297 fn from(valsmut: ValuesMut<'a, K, V>) -> Self {
298 let ValuesMut { inner_iter } = valsmut;
299 let as_slice = inner_iter.into_slice();
300 let inner_iter = as_slice.iter();
301 Values { inner_iter }
302 }
303}
304
305impl<'a, K: 'a, V: 'a> Clone for Values<'a, K, V> {
306 fn clone(&self) -> Self {
307 Values { inner_iter: self.inner_iter.clone() }
308 }
309}
310
311impl<'a, K: 'a, V: 'a> Iterator for Values<'a, K, V>
312 where V: StableDeref + DerefMut
313{
314 type Item = &'a V::Target;
315
316 #[inline]
317 fn next(&mut self) -> Option<Self::Item> {
318 self.inner_iter.next()
319 .map(|&(_, ref v)| &**v)
320 }
321
322 #[inline]
323 fn size_hint(&self) -> (usize, Option<usize>) {
324 self.inner_iter.size_hint()
325 }
326}
327
328impl<'a, K: 'a, V: 'a> ExactSizeIterator for Values<'a, K, V>
329 where V: StableDeref + DerefMut
330{
331 fn len(&self) -> usize {
332 self.inner_iter.len()
333 }
334}
335
336impl<'a, K: 'a, V: 'a> Debug for Values<'a, K, V>
337 where V: StableDeref + DerefMut, V::Target: Debug
338{
339 fn fmt(&self, fter: &mut fmt::Formatter) -> fmt::Result {
340 fter.debug_list().entries(self.clone()).finish()
341 }
342}
343
344
345impl<'a, K: 'a, V: 'a> Iterator for ValuesMut<'a, K, V>
346 where V: StableDeref + DerefMut
347{
348 type Item = &'a mut V::Target;
349
350 #[inline]
351 fn next(&mut self) -> Option<Self::Item> {
352 self.inner_iter.next().map(|&mut (_, ref mut v)| {
353 &mut **v
354 })
355 }
356
357 #[inline]
358 fn size_hint(&self) -> (usize, Option<usize>) {
359 self.inner_iter.size_hint()
360 }
361
362}
363
364impl<'a, K: 'a, V: 'a> ExactSizeIterator for ValuesMut<'a, K, V>
365 where V: StableDeref + DerefMut
366{
367 fn len(&self) -> usize {
368 self.inner_iter.len()
369 }
370}
371
372impl<'a, K: 'a, V: 'a> Debug for ValuesMut<'a, K, V>
373 where V: StableDeref + DerefMut, V::Target: Debug
374{
375 fn fmt(&self, fter: &mut fmt::Formatter) -> fmt::Result {
376 fter.write_str("ValuesMut { .. }")
377 }
378}
379
380#[cfg(test)]
381mod tests {
382 use super::*;
383
384 #[test]
385 fn convert_mut_values_to_non_mut() {
386 let mut map = TotalOrderMultiMap::new();
387 map.add("k1", "v1".to_owned());
388 map.add("k0", "v2".to_owned());
389
390 let iter: Values<_, _> = map.values_mut().into();
391 assert_eq!(
392 vec!["v1", "v2"],
393 iter.collect::<Vec<_>>()
394 )
395 }
396}