Avoid intermediate vector
authorAleksey Kladov <aleksey.kladov@gmail.com>
Fri, 16 Mar 2018 09:29:54 +0000 (12:29 +0300)
committerAleksey Kladov <aleksey.kladov@gmail.com>
Fri, 16 Mar 2018 15:09:44 +0000 (18:09 +0300)
src/cargo/core/resolver/mod.rs
src/cargo/ops/resolve.rs
tests/testsuite/resolve.rs

index 9d765933aaadabf1fff283873b381d82a7dbe6ef..e4f7483ac356ecf8601db0543d6b1fa8a1c92d2e 100644 (file)
@@ -416,7 +416,7 @@ pub fn resolve(
     summaries: &[(Summary, Method)],
     replacements: &[(PackageIdSpec, Dependency)],
     registry: &mut Registry,
-    try_to_use: &[&PackageId],
+    try_to_use: &HashSet<&PackageId>,
     config: Option<&Config>,
     print_warnings: bool,
 ) -> CargoResult<Resolve> {
@@ -662,7 +662,7 @@ impl ConflictReason {
 struct RegistryQueryer<'a> {
     registry: &'a mut (Registry + 'a),
     replacements: &'a [(PackageIdSpec, Dependency)],
-    try_to_use: HashSet<&'a PackageId>,
+    try_to_use: &'a HashSet<&'a PackageId>,
     // TODO: with nll the Rc can be removed
     cache: HashMap<Dependency, Rc<Vec<Candidate>>>,
 }
@@ -671,13 +671,13 @@ impl<'a> RegistryQueryer<'a> {
     fn new(
         registry: &'a mut Registry,
         replacements: &'a [(PackageIdSpec, Dependency)],
-        try_to_use: &'a [&'a PackageId],
+        try_to_use: &'a HashSet<&'a PackageId>,
     ) -> Self {
         RegistryQueryer {
             registry,
             replacements,
             cache: HashMap::new(),
-            try_to_use: try_to_use.iter().cloned().collect(),
+            try_to_use,
         }
     }
 
index 618613964fa658bf9997ca69e271a7170d393eca..e52e71de298bcf58d63da5a7cd0dbdb3e5b31217 100644 (file)
@@ -170,7 +170,7 @@ pub fn resolve_with_previous<'a, 'cfg>(
     // In the case where a previous instance of resolve is available, we
     // want to lock as many packages as possible to the previous version
     // without disturbing the graph structure.
-    let mut try_to_use = Vec::new();
+    let mut try_to_use = HashSet::new();
     if let Some(r) = previous {
         trace!("previous: {:?}", r);
         register_previous_locks(ws, registry, r, keep);
index e991f9c0578811cf8d944f994d2fe9158024367a..2d99846d3750894ccd21bc40c8cdcc8726ed15ce 100644 (file)
@@ -1,4 +1,4 @@
-use std::collections::BTreeMap;
+use std::collections::{BTreeMap, HashSet};
 
 use hamcrest::{assert_that, contains, is_not};
 
@@ -33,7 +33,14 @@ fn resolve(
     let mut registry = MyRegistry(registry);
     let summary = Summary::new(pkg.clone(), deps, BTreeMap::new(), None).unwrap();
     let method = Method::Everything;
-    let resolve = resolver::resolve(&[(summary, method)], &[], &mut registry, &[], None, false)?;
+    let resolve = resolver::resolve(
+        &[(summary, method)],
+        &[],
+        &mut registry,
+        &HashSet::new(),
+        None,
+        false,
+    )?;
     let res = resolve.iter().cloned().collect();
     Ok(res)
 }