Implement IntoIterator for PrimaryMap.

This makes iterating through a `PrimaryMap` more consistent with
iterating through a `Vec`.
This commit is contained in:
Dan Gohman
2018-06-07 15:32:11 -07:00
parent fdf89edbfe
commit 00d7d3a774
4 changed files with 32 additions and 8 deletions

View File

@@ -44,7 +44,7 @@ pub fn do_dce(func: &mut Function, domtree: &mut DominatorTree) {
let mut live = Vec::with_capacity(func.dfg.num_values());
live.resize(func.dfg.num_values(), false);
for &ebb in domtree.cfg_postorder().iter() {
for &ebb in domtree.cfg_postorder() {
let mut pos = FuncCursor::new(func).at_bottom(ebb);
while let Some(inst) = pos.prev_inst() {
{

View File

@@ -88,7 +88,7 @@ impl Pressure {
};
// Get the layout of aliasing top-level register classes from the register banks.
for bank in reginfo.banks.iter() {
for bank in reginfo.banks {
let first = bank.first_toprc;
let num = bank.num_toprcs;

View File

@@ -50,31 +50,31 @@ fn write_preamble(
writeln!(w, " {} = {}", ss, slot)?;
}
for (gv, gv_data) in func.global_vars.iter() {
for (gv, gv_data) in &func.global_vars {
any = true;
writeln!(w, " {} = {}", gv, gv_data)?;
}
for (heap, heap_data) in func.heaps.iter() {
for (heap, heap_data) in &func.heaps {
any = true;
writeln!(w, " {} = {}", heap, heap_data)?;
}
// Write out all signatures before functions since function declarations can refer to
// signatures.
for (sig, sig_data) in func.dfg.signatures.iter() {
for (sig, sig_data) in &func.dfg.signatures {
any = true;
writeln!(w, " {} = {}", sig, sig_data.display(regs))?;
}
for (fnref, ext_func) in func.dfg.ext_funcs.iter() {
for (fnref, ext_func) in &func.dfg.ext_funcs {
any = true;
if ext_func.signature != SigRef::reserved_value() {
writeln!(w, " {} = {}", fnref, ext_func)?;
}
}
for (jt, jt_data) in func.jump_tables.iter() {
for (jt, jt_data) in &func.jump_tables {
any = true;
writeln!(w, " {} = {}", jt, jt_data)?;
}

View File

@@ -121,6 +121,30 @@ where
}
}
impl<'a, K, V> IntoIterator for &'a PrimaryMap<K, V>
where
K: EntityRef,
{
type Item = (K, &'a V);
type IntoIter = Iter<'a, K, V>;
fn into_iter(self) -> Self::IntoIter {
Iter::new(self.elems.iter())
}
}
impl<'a, K, V> IntoIterator for &'a mut PrimaryMap<K, V>
where
K: EntityRef,
{
type Item = (K, &'a mut V);
type IntoIter = IterMut<'a, K, V>;
fn into_iter(self) -> Self::IntoIter {
IterMut::new(self.elems.iter_mut())
}
}
#[cfg(test)]
mod tests {
use super::*;
@@ -171,7 +195,7 @@ mod tests {
m.push(33);
let mut i = 0;
for (key, value) in m.iter() {
for (key, value) in &m {
assert_eq!(key.index(), i);
match i {
0 => assert_eq!(*value, 12),