From 45a7012fd969ad97fcbcdd4af2530875e37663b7 Mon Sep 17 00:00:00 2001 From: Owen Sanchez Date: Mon, 6 Feb 2017 12:25:38 -0700 Subject: [PATCH] Search directly for the largest and smallest variants instead of sorting --- clippy_lints/src/large_enum_variant.rs | 29 +++++++++++++++----------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/clippy_lints/src/large_enum_variant.rs b/clippy_lints/src/large_enum_variant.rs index 1363183cb81..050362dede0 100644 --- a/clippy_lints/src/large_enum_variant.rs +++ b/clippy_lints/src/large_enum_variant.rs @@ -51,10 +51,10 @@ fn check_item(&mut self, cx: &LateContext, item: &Item) { let ty = cx.tcx.item_type(did); let adt = ty.ty_adt_def().expect("already checked whether this is an enum"); - let mut sizes = Vec::new(); - let mut variants = Vec::new(); + let mut smallest_variant: Option<(_, _)> = None; + let mut largest_variant: Option<(_, _)> = None; - for variant in &adt.variants { + for (i, variant) in adt.variants.iter().enumerate() { let data_layout = TargetDataLayout::parse(cx.sess()); cx.tcx.infer_ctxt((), Reveal::All).enter(|infcx| { let size: u64 = variant.fields @@ -72,18 +72,13 @@ fn check_item(&mut self, cx: &LateContext, item: &Item) { }) .sum(); - sizes.push(size); - variants.push(variant); + let grouped = (size, (i, variant)); + + update_if(&mut smallest_variant, grouped, |a, b| b.0 <= a.0); + update_if(&mut largest_variant, grouped, |a, b| b.0 >= a.0); }); } - let mut grouped = sizes.into_iter().zip(variants.into_iter().enumerate()).collect::>(); - - grouped.sort_by_key(|g| g.0); - - let smallest_variant = grouped.first(); - let largest_variant = grouped.last(); - if let (Some(smallest), Some(largest)) = (smallest_variant, largest_variant) { let difference = largest.0 - smallest.0; @@ -118,3 +113,13 @@ fn check_item(&mut self, cx: &LateContext, item: &Item) { } } } + +fn update_if(old: &mut Option, new: T, f: F) where F: Fn(&T, &T) -> bool { + if let Some(ref mut val) = *old { + if f(val, &new) { + *val = new; + } + } else { + *old = Some(new); + } +} -- 2.44.0