From 00d7d3a7749e7f405523f29e1ea3e636727fd3c7 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Thu, 7 Jun 2018 15:32:11 -0700 Subject: [PATCH] Implement `IntoIterator` for `PrimaryMap`. This makes iterating through a `PrimaryMap` more consistent with iterating through a `Vec`. --- lib/codegen/src/dce.rs | 2 +- lib/codegen/src/regalloc/pressure.rs | 2 +- lib/codegen/src/write.rs | 10 +++++----- lib/entity/src/primary.rs | 26 +++++++++++++++++++++++++- 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/lib/codegen/src/dce.rs b/lib/codegen/src/dce.rs index 797e905c6d..5373948e88 100644 --- a/lib/codegen/src/dce.rs +++ b/lib/codegen/src/dce.rs @@ -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() { { diff --git a/lib/codegen/src/regalloc/pressure.rs b/lib/codegen/src/regalloc/pressure.rs index a85bef28ca..65651987a7 100644 --- a/lib/codegen/src/regalloc/pressure.rs +++ b/lib/codegen/src/regalloc/pressure.rs @@ -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; diff --git a/lib/codegen/src/write.rs b/lib/codegen/src/write.rs index 3f666fda24..d7f6ce8747 100644 --- a/lib/codegen/src/write.rs +++ b/lib/codegen/src/write.rs @@ -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)?; } diff --git a/lib/entity/src/primary.rs b/lib/entity/src/primary.rs index 4f7307fb88..07e00cb884 100644 --- a/lib/entity/src/primary.rs +++ b/lib/entity/src/primary.rs @@ -121,6 +121,30 @@ where } } +impl<'a, K, V> IntoIterator for &'a PrimaryMap +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 +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),