Fix reverse iteration in cretonne-entity's Iter.
A `DoubleEndedIterator` needs to track both a forward position and a reverse position, so that `next_back()` can pop from the back of the sequence.
This commit is contained in:
@@ -10,6 +10,7 @@ where
|
|||||||
V: 'a,
|
V: 'a,
|
||||||
{
|
{
|
||||||
pos: usize,
|
pos: usize,
|
||||||
|
rev_pos: usize,
|
||||||
iter: slice::Iter<'a, V>,
|
iter: slice::Iter<'a, V>,
|
||||||
unused: PhantomData<K>,
|
unused: PhantomData<K>,
|
||||||
}
|
}
|
||||||
@@ -17,9 +18,10 @@ where
|
|||||||
impl<'a, K: EntityRef, V> Iter<'a, K, V> {
|
impl<'a, K: EntityRef, V> Iter<'a, K, V> {
|
||||||
/// Create an `Iter` iterator that visits the `PrimaryMap` keys and values
|
/// Create an `Iter` iterator that visits the `PrimaryMap` keys and values
|
||||||
/// of `iter`.
|
/// of `iter`.
|
||||||
pub fn new(key: K, iter: slice::Iter<'a, V>) -> Self {
|
pub fn new(iter: slice::Iter<'a, V>) -> Self {
|
||||||
Self {
|
Self {
|
||||||
pos: key.index(),
|
pos: 0,
|
||||||
|
rev_pos: iter.len(),
|
||||||
iter,
|
iter,
|
||||||
unused: PhantomData,
|
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> {
|
impl<'a, K: EntityRef, V> DoubleEndedIterator for Iter<'a, K, V> {
|
||||||
fn next_back(&mut self) -> Option<Self::Item> {
|
fn next_back(&mut self) -> Option<Self::Item> {
|
||||||
if let Some(next_back) = self.iter.next_back() {
|
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 {
|
} else {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
@@ -62,6 +66,7 @@ where
|
|||||||
V: 'a,
|
V: 'a,
|
||||||
{
|
{
|
||||||
pos: usize,
|
pos: usize,
|
||||||
|
rev_pos: usize,
|
||||||
iter: slice::IterMut<'a, V>,
|
iter: slice::IterMut<'a, V>,
|
||||||
unused: PhantomData<K>,
|
unused: PhantomData<K>,
|
||||||
}
|
}
|
||||||
@@ -69,9 +74,10 @@ where
|
|||||||
impl<'a, K: EntityRef, V> IterMut<'a, K, V> {
|
impl<'a, K: EntityRef, V> IterMut<'a, K, V> {
|
||||||
/// Create an `IterMut` iterator that visits the `PrimaryMap` keys and values
|
/// Create an `IterMut` iterator that visits the `PrimaryMap` keys and values
|
||||||
/// of `iter`.
|
/// of `iter`.
|
||||||
pub fn new(key: K, iter: slice::IterMut<'a, V>) -> Self {
|
pub fn new(iter: slice::IterMut<'a, V>) -> Self {
|
||||||
Self {
|
Self {
|
||||||
pos: key.index(),
|
pos: 0,
|
||||||
|
rev_pos: iter.len(),
|
||||||
iter,
|
iter,
|
||||||
unused: PhantomData,
|
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> {
|
impl<'a, K: EntityRef, V> DoubleEndedIterator for IterMut<'a, K, V> {
|
||||||
fn next_back(&mut self) -> Option<Self::Item> {
|
fn next_back(&mut self) -> Option<Self::Item> {
|
||||||
if let Some(next_back) = self.iter.next_back() {
|
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 {
|
} else {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,11 +11,11 @@ pub struct Keys<K: EntityRef> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<K: EntityRef> Keys<K> {
|
impl<K: EntityRef> Keys<K> {
|
||||||
/// Create a `Keys` iterator that visits `count` entities starting from 0.
|
/// Create a `Keys` iterator that visits `len` entities starting from 0.
|
||||||
pub fn new(count: usize) -> Self {
|
pub fn with_len(len: usize) -> Self {
|
||||||
Self {
|
Self {
|
||||||
pos: 0,
|
pos: 0,
|
||||||
rev_pos: count,
|
rev_pos: len,
|
||||||
unused: PhantomData,
|
unused: PhantomData,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,17 +71,17 @@ where
|
|||||||
|
|
||||||
/// Iterate over all the keys and values in this map.
|
/// Iterate over all the keys and values in this map.
|
||||||
pub fn iter(&self) -> Iter<K, V> {
|
pub fn iter(&self) -> Iter<K, V> {
|
||||||
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.
|
/// Iterate over all the keys and values in this map, mutable edition.
|
||||||
pub fn iter_mut(&mut self) -> IterMut<K, V> {
|
pub fn iter_mut(&mut self) -> IterMut<K, V> {
|
||||||
IterMut::new(K::new(0), self.elems.iter_mut())
|
IterMut::new(self.elems.iter_mut())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Iterate over all the keys in this map.
|
/// Iterate over all the keys in this map.
|
||||||
pub fn keys(&self) -> Keys<K> {
|
pub fn keys(&self) -> Keys<K> {
|
||||||
Keys::new(self.elems.len())
|
Keys::with_len(self.elems.len())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Iterate over all the keys in this map.
|
/// Iterate over all the keys in this map.
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ where
|
|||||||
|
|
||||||
/// Iterate over all the keys in this map.
|
/// Iterate over all the keys in this map.
|
||||||
pub fn keys(&self) -> Keys<K> {
|
pub fn keys(&self) -> Keys<K> {
|
||||||
Keys::new(self.elems.len())
|
Keys::with_len(self.elems.len())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Iterate over all the values in this map.
|
/// Iterate over all the values in this map.
|
||||||
@@ -72,12 +72,12 @@ where
|
|||||||
|
|
||||||
/// Iterate over all the keys and values in this map.
|
/// Iterate over all the keys and values in this map.
|
||||||
pub fn iter(&self) -> Iter<K, V> {
|
pub fn iter(&self) -> Iter<K, V> {
|
||||||
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.
|
/// Iterate over all the keys and values in this map, mutable edition.
|
||||||
pub fn iter_mut(&mut self) -> IterMut<K, V> {
|
pub fn iter_mut(&mut self) -> IterMut<K, V> {
|
||||||
IterMut::new(K::new(0), self.elems.iter_mut())
|
IterMut::new(self.elems.iter_mut())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Remove all entries from this map.
|
/// Remove all entries from this map.
|
||||||
@@ -192,6 +192,34 @@ mod tests {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn iter_rev() {
|
||||||
|
let mut m: PrimaryMap<E, usize> = 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]
|
#[test]
|
||||||
fn keys() {
|
fn keys() {
|
||||||
let mut m: PrimaryMap<E, usize> = PrimaryMap::new();
|
let mut m: PrimaryMap<E, usize> = PrimaryMap::new();
|
||||||
@@ -205,6 +233,19 @@ mod tests {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn keys_rev() {
|
||||||
|
let mut m: PrimaryMap<E, usize> = 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]
|
#[test]
|
||||||
fn values() {
|
fn values() {
|
||||||
let mut m: PrimaryMap<E, usize> = PrimaryMap::new();
|
let mut m: PrimaryMap<E, usize> = PrimaryMap::new();
|
||||||
@@ -230,4 +271,31 @@ mod tests {
|
|||||||
i += 1;
|
i += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn values_rev() {
|
||||||
|
let mut m: PrimaryMap<E, usize> = 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!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ where
|
|||||||
|
|
||||||
/// Iterate over all the keys in this set.
|
/// Iterate over all the keys in this set.
|
||||||
pub fn keys(&self) -> Keys<K> {
|
pub fn keys(&self) -> Keys<K> {
|
||||||
Keys::new(self.len)
|
Keys::with_len(self.len)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Resize the set to have `n` entries by adding default entries as needed.
|
/// Resize the set to have `n` entries by adding default entries as needed.
|
||||||
|
|||||||
Reference in New Issue
Block a user