diff --git a/src/librustc/metadata/creader.rs b/src/librustc/metadata/creader.rs index eaf01241c816..c8c4a396c87a 100644 --- a/src/librustc/metadata/creader.rs +++ b/src/librustc/metadata/creader.rs @@ -57,6 +57,7 @@ pub fn read_crates(diag: @mut span_handler, warn_if_multiple_versions(e, diag, *e.crate_cache); } +#[deriving(Clone)] struct cache_entry { cnum: int, span: span, @@ -76,22 +77,13 @@ fn dump_crates(crate_cache: &[cache_entry]) { fn warn_if_multiple_versions(e: @mut Env, diag: @mut span_handler, crate_cache: &[cache_entry]) { - use std::either::*; - if crate_cache.len() != 0u { let name = loader::crate_name_from_metas( *crate_cache[crate_cache.len() - 1].metas ); - let vec: ~[Either] = crate_cache.iter().map(|&entry| { - let othername = loader::crate_name_from_metas(*entry.metas); - if name == othername { - Left(entry) - } else { - Right(entry) - } - }).collect(); - let (matches, non_matches) = partition(vec); + let (matches, non_matches) = crate_cache.partitioned(|entry| + name == loader::crate_name_from_metas(*entry.metas)); assert!(!matches.is_empty()); diff --git a/src/libstd/either.rs b/src/libstd/either.rs index 7150430893b3..5d988965e8cc 100644 --- a/src/libstd/either.rs +++ b/src/libstd/either.rs @@ -151,8 +151,9 @@ pub fn rights>>(eithers: Iter) /// Returns a structure containing a vector of left values and a vector of /// right values. pub fn partition(eithers: ~[Either]) -> (~[L], ~[R]) { - let mut lefts: ~[L] = ~[]; - let mut rights: ~[R] = ~[]; + let n_lefts = eithers.iter().count(|elt| elt.is_left()); + let mut lefts = vec::with_capacity(n_lefts); + let mut rights = vec::with_capacity(eithers.len() - n_lefts); for elt in eithers.move_iter() { match elt { Left(l) => lefts.push(l),