about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorJonas Schievink <jonas@schievink.net>2016-07-11 01:43:55 +0200
committerJonas Schievink <jonas@schievink.net>2016-07-11 01:43:55 +0200
commitdd0505cefc2a25702cfe33d8115ed2c536dc40b8 (patch)
tree2127c42e68d333746dd520b6ae66849a58073908 /src
parent66fb62baf7a655e0b08f2d61f7e186ac0ac18045 (diff)
downloadrust-dd0505cefc2a25702cfe33d8115ed2c536dc40b8.tar.gz
rust-dd0505cefc2a25702cfe33d8115ed2c536dc40b8.zip
Calculate the 2 largest variants using iterators
No need to store all sizes in a vector
Diffstat (limited to 'src')
-rw-r--r--src/librustc_lint/types.rs43
1 files changed, 22 insertions, 21 deletions
diff --git a/src/librustc_lint/types.rs b/src/librustc_lint/types.rs
index 8b44157a405..2dbe54fe768 100644
--- a/src/librustc_lint/types.rs
+++ b/src/librustc_lint/types.rs
@@ -697,7 +697,6 @@ impl LateLintPass for VariantSizeDifferences {
     fn check_item(&mut self, cx: &LateContext, it: &hir::Item) {
         if let hir::ItemEnum(ref enum_definition, ref gens) = it.node {
             if gens.ty_params.is_empty() {  // sizes only make sense for non-generic types
-                let mut sizes = vec![];
                 let t = cx.tcx.node_id_to_type(it.id);
                 let layout = cx.tcx.normalizing_infer_ctxt(ProjectionMode::Any).enter(|infcx| {
                     t.layout(&infcx).unwrap_or_else(|e| {
@@ -710,26 +709,28 @@ impl LateLintPass for VariantSizeDifferences {
 
                     debug!("enum `{}` is {} bytes large", t, size.bytes());
 
-                    for (variant, variant_layout) in enum_definition.variants.iter().zip(variants) {
-                        // Subtract the size of the enum discriminant
-                        let bytes = variant_layout.min_size().bytes().saturating_sub(discr_size);
-                        sizes.push(bytes);
-
-                        debug!("- variant `{}` is {} bytes large", variant.node.name, bytes);
-                    }
-
-                    let (largest, slargest, largest_index) = sizes.iter()
-                                                                  .enumerate()
-                                                                  .fold((0, 0, 0),
-                        |(l, s, li), (idx, &size)|
-                            if size > l {
-                                (size, l, idx)
-                            } else if size > s {
-                                (l, size, li)
-                            } else {
-                                (l, s, li)
-                            }
-                    );
+                    let (largest, slargest, largest_index) = enum_definition.variants
+                        .iter()
+                        .zip(variants)
+                        .map(|(variant, variant_layout)| {
+                            // Subtract the size of the enum discriminant
+                            let bytes = variant_layout.min_size().bytes()
+                                                                 .saturating_sub(discr_size);
+
+                            debug!("- variant `{}` is {} bytes large", variant.node.name, bytes);
+                            bytes
+                        })
+                        .enumerate()
+                        .fold((0, 0, 0),
+                            |(l, s, li), (idx, size)|
+                                if size > l {
+                                    (size, l, idx)
+                                } else if size > s {
+                                    (l, size, li)
+                                } else {
+                                    (l, s, li)
+                                }
+                        );
 
                     // we only warn if the largest variant is at least thrice as large as
                     // the second-largest.