1 //! A double-ended iterator over entity references and entities. 2 3 use crate::EntityRef; 4 use alloc::vec; 5 use core::iter::Enumerate; 6 use core::marker::PhantomData; 7 use core::slice; 8 9 /// Iterate over all keys in order. 10 pub struct Iter<'a, K: EntityRef, V> 11 where 12 V: 'a, 13 { 14 enumerate: Enumerate<slice::Iter<'a, V>>, 15 unused: PhantomData<K>, 16 } 17 18 impl<'a, K: EntityRef, V> Iter<'a, K, V> { 19 /// Create an `Iter` iterator that visits the `PrimaryMap` keys and values 20 /// of `iter`. new(iter: slice::Iter<'a, V>) -> Self21 pub fn new(iter: slice::Iter<'a, V>) -> Self { 22 Self { 23 enumerate: iter.enumerate(), 24 unused: PhantomData, 25 } 26 } 27 } 28 29 impl<'a, K: EntityRef, V> Iterator for Iter<'a, K, V> { 30 type Item = (K, &'a V); 31 next(&mut self) -> Option<Self::Item>32 fn next(&mut self) -> Option<Self::Item> { 33 self.enumerate.next().map(|(i, v)| (K::new(i), v)) 34 } 35 size_hint(&self) -> (usize, Option<usize>)36 fn size_hint(&self) -> (usize, Option<usize>) { 37 self.enumerate.size_hint() 38 } 39 } 40 41 impl<'a, K: EntityRef, V> DoubleEndedIterator for Iter<'a, K, V> { next_back(&mut self) -> Option<Self::Item>42 fn next_back(&mut self) -> Option<Self::Item> { 43 self.enumerate.next_back().map(|(i, v)| (K::new(i), v)) 44 } 45 } 46 47 impl<'a, K: EntityRef, V> ExactSizeIterator for Iter<'a, K, V> {} 48 49 /// Iterate over all keys in order. 50 pub struct IterMut<'a, K: EntityRef, V> 51 where 52 V: 'a, 53 { 54 enumerate: Enumerate<slice::IterMut<'a, V>>, 55 unused: PhantomData<K>, 56 } 57 58 impl<'a, K: EntityRef, V> IterMut<'a, K, V> { 59 /// Create an `IterMut` iterator that visits the `PrimaryMap` keys and values 60 /// of `iter`. new(iter: slice::IterMut<'a, V>) -> Self61 pub fn new(iter: slice::IterMut<'a, V>) -> Self { 62 Self { 63 enumerate: iter.enumerate(), 64 unused: PhantomData, 65 } 66 } 67 } 68 69 impl<'a, K: EntityRef, V> Iterator for IterMut<'a, K, V> { 70 type Item = (K, &'a mut V); 71 next(&mut self) -> Option<Self::Item>72 fn next(&mut self) -> Option<Self::Item> { 73 self.enumerate.next().map(|(i, v)| (K::new(i), v)) 74 } 75 size_hint(&self) -> (usize, Option<usize>)76 fn size_hint(&self) -> (usize, Option<usize>) { 77 self.enumerate.size_hint() 78 } 79 } 80 81 impl<'a, K: EntityRef, V> DoubleEndedIterator for IterMut<'a, K, V> { next_back(&mut self) -> Option<Self::Item>82 fn next_back(&mut self) -> Option<Self::Item> { 83 self.enumerate.next_back().map(|(i, v)| (K::new(i), v)) 84 } 85 } 86 87 impl<'a, K: EntityRef, V> ExactSizeIterator for IterMut<'a, K, V> {} 88 89 /// Iterate over all keys in order. 90 pub struct IntoIter<K: EntityRef, V> { 91 enumerate: Enumerate<vec::IntoIter<V>>, 92 unused: PhantomData<K>, 93 } 94 95 impl<K: EntityRef, V> IntoIter<K, V> { 96 /// Create an `IntoIter` iterator that visits the `PrimaryMap` keys and values 97 /// of `iter`. new(iter: vec::IntoIter<V>) -> Self98 pub fn new(iter: vec::IntoIter<V>) -> Self { 99 Self { 100 enumerate: iter.enumerate(), 101 unused: PhantomData, 102 } 103 } 104 } 105 106 impl<K: EntityRef, V> Iterator for IntoIter<K, V> { 107 type Item = (K, V); 108 next(&mut self) -> Option<Self::Item>109 fn next(&mut self) -> Option<Self::Item> { 110 self.enumerate.next().map(|(i, v)| (K::new(i), v)) 111 } 112 size_hint(&self) -> (usize, Option<usize>)113 fn size_hint(&self) -> (usize, Option<usize>) { 114 self.enumerate.size_hint() 115 } 116 } 117 118 impl<K: EntityRef, V> DoubleEndedIterator for IntoIter<K, V> { next_back(&mut self) -> Option<Self::Item>119 fn next_back(&mut self) -> Option<Self::Item> { 120 self.enumerate.next_back().map(|(i, v)| (K::new(i), v)) 121 } 122 } 123 124 impl<K: EntityRef, V> ExactSizeIterator for IntoIter<K, V> {} 125