diff --git a/lib/entity/src/iter.rs b/lib/entity/src/iter.rs index 9eeba6c7a6..0455e40519 100644 --- a/lib/entity/src/iter.rs +++ b/lib/entity/src/iter.rs @@ -10,6 +10,7 @@ where V: 'a, { pos: usize, + rev_pos: usize, iter: slice::Iter<'a, V>, unused: PhantomData, } @@ -17,9 +18,10 @@ where impl<'a, K: EntityRef, V> Iter<'a, K, V> { /// Create an `Iter` iterator that visits the `PrimaryMap` keys and values /// of `iter`. - pub fn new(key: K, iter: slice::Iter<'a, V>) -> Self { + pub fn new(iter: slice::Iter<'a, V>) -> Self { Self { - pos: key.index(), + pos: 0, + rev_pos: iter.len(), iter, unused: PhantomData, } @@ -47,7 +49,9 @@ impl<'a, K: EntityRef, V> Iterator for Iter<'a, K, V> { impl<'a, K: EntityRef, V> DoubleEndedIterator for Iter<'a, K, V> { fn next_back(&mut self) -> Option { if let Some(next_back) = self.iter.next_back() { - Some((K::new(self.pos), next_back)) + let rev_pos = self.rev_pos - 1; + self.rev_pos -= 1; + Some((K::new(rev_pos), next_back)) } else { None } @@ -62,6 +66,7 @@ where V: 'a, { pos: usize, + rev_pos: usize, iter: slice::IterMut<'a, V>, unused: PhantomData, } @@ -69,9 +74,10 @@ where impl<'a, K: EntityRef, V> IterMut<'a, K, V> { /// Create an `IterMut` iterator that visits the `PrimaryMap` keys and values /// of `iter`. - pub fn new(key: K, iter: slice::IterMut<'a, V>) -> Self { + pub fn new(iter: slice::IterMut<'a, V>) -> Self { Self { - pos: key.index(), + pos: 0, + rev_pos: iter.len(), iter, unused: PhantomData, } @@ -99,7 +105,9 @@ impl<'a, K: EntityRef, V> Iterator for IterMut<'a, K, V> { impl<'a, K: EntityRef, V> DoubleEndedIterator for IterMut<'a, K, V> { fn next_back(&mut self) -> Option { if let Some(next_back) = self.iter.next_back() { - Some((K::new(self.pos), next_back)) + let rev_pos = self.rev_pos - 1; + self.rev_pos -= 1; + Some((K::new(rev_pos), next_back)) } else { None } diff --git a/lib/entity/src/keys.rs b/lib/entity/src/keys.rs index 52481097cb..e9d1e91505 100644 --- a/lib/entity/src/keys.rs +++ b/lib/entity/src/keys.rs @@ -11,11 +11,11 @@ pub struct Keys { } impl Keys { - /// Create a `Keys` iterator that visits `count` entities starting from 0. - pub fn new(count: usize) -> Self { + /// Create a `Keys` iterator that visits `len` entities starting from 0. + pub fn with_len(len: usize) -> Self { Self { pos: 0, - rev_pos: count, + rev_pos: len, unused: PhantomData, } } diff --git a/lib/entity/src/map.rs b/lib/entity/src/map.rs index ad8dca7e01..285e61e4c6 100644 --- a/lib/entity/src/map.rs +++ b/lib/entity/src/map.rs @@ -71,17 +71,17 @@ where /// Iterate over all the keys and values in this map. pub fn iter(&self) -> Iter { - Iter::new(K::new(0), self.elems.iter()) + Iter::new(self.elems.iter()) } /// Iterate over all the keys and values in this map, mutable edition. pub fn iter_mut(&mut self) -> IterMut { - IterMut::new(K::new(0), self.elems.iter_mut()) + IterMut::new(self.elems.iter_mut()) } /// Iterate over all the keys in this map. pub fn keys(&self) -> Keys { - Keys::new(self.elems.len()) + Keys::with_len(self.elems.len()) } /// Iterate over all the keys in this map. diff --git a/lib/entity/src/primary.rs b/lib/entity/src/primary.rs index 36b76f09d6..4f7307fb88 100644 --- a/lib/entity/src/primary.rs +++ b/lib/entity/src/primary.rs @@ -57,7 +57,7 @@ where /// Iterate over all the keys in this map. pub fn keys(&self) -> Keys { - Keys::new(self.elems.len()) + Keys::with_len(self.elems.len()) } /// Iterate over all the values in this map. @@ -72,12 +72,12 @@ where /// Iterate over all the keys and values in this map. pub fn iter(&self) -> Iter { - Iter::new(K::new(0), self.elems.iter()) + Iter::new(self.elems.iter()) } /// Iterate over all the keys and values in this map, mutable edition. pub fn iter_mut(&mut self) -> IterMut { - IterMut::new(K::new(0), self.elems.iter_mut()) + IterMut::new(self.elems.iter_mut()) } /// Remove all entries from this map. @@ -192,6 +192,34 @@ mod tests { } } + #[test] + fn iter_rev() { + let mut m: PrimaryMap = PrimaryMap::new(); + m.push(12); + m.push(33); + + let mut i = 2; + for (key, value) in m.iter().rev() { + i -= 1; + assert_eq!(key.index(), i); + match i { + 0 => assert_eq!(*value, 12), + 1 => assert_eq!(*value, 33), + _ => panic!(), + } + } + + i = 2; + for (key, value) in m.iter_mut().rev() { + i -= 1; + assert_eq!(key.index(), i); + match i { + 0 => assert_eq!(*value, 12), + 1 => assert_eq!(*value, 33), + _ => panic!(), + } + } + } #[test] fn keys() { let mut m: PrimaryMap = PrimaryMap::new(); @@ -205,6 +233,19 @@ mod tests { } } + #[test] + fn keys_rev() { + let mut m: PrimaryMap = PrimaryMap::new(); + m.push(12); + m.push(33); + + let mut i = 2; + for key in m.keys().rev() { + i -= 1; + assert_eq!(key.index(), i); + } + } + #[test] fn values() { let mut m: PrimaryMap = PrimaryMap::new(); @@ -230,4 +271,31 @@ mod tests { i += 1; } } + + #[test] + fn values_rev() { + let mut m: PrimaryMap = PrimaryMap::new(); + m.push(12); + m.push(33); + + let mut i = 2; + for value in m.values().rev() { + i -= 1; + match i { + 0 => assert_eq!(*value, 12), + 1 => assert_eq!(*value, 33), + _ => panic!(), + } + } + i = 2; + for value_mut in m.values_mut().rev() { + i -= 1; + match i { + 0 => assert_eq!(*value_mut, 12), + 1 => assert_eq!(*value_mut, 33), + _ => panic!(), + } + } + } + } diff --git a/lib/entity/src/set.rs b/lib/entity/src/set.rs index 21f518eb66..7644db49ad 100644 --- a/lib/entity/src/set.rs +++ b/lib/entity/src/set.rs @@ -55,7 +55,7 @@ where /// Iterate over all the keys in this set. pub fn keys(&self) -> Keys { - Keys::new(self.len) + Keys::with_len(self.len) } /// Resize the set to have `n` entries by adding default entries as needed.