Skip to content

Commit 42d8fb9

Browse files
committed
Use u64 for version set type
1 parent eeb525b commit 42d8fb9

30 files changed

+2358
-1297
lines changed

benches/backtracking.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ fn backtracking_singletons(c: &mut Criterion, package_count: u32, version_count:
2626

2727
c.bench_function("backtracking_singletons", |b| {
2828
b.iter(|| {
29-
let _ = pubgrub::resolve(&mut dependency_provider, 0u32, 0u32);
29+
let _ = dependency_provider.resolve(0u32, 0u32);
3030
})
3131
});
3232
}
@@ -59,7 +59,7 @@ fn backtracking_disjoint_versions(c: &mut Criterion, package_count: u32, version
5959

6060
c.bench_function("backtracking_disjoint_versions", |b| {
6161
b.iter(|| {
62-
let _ = pubgrub::resolve(&mut dependency_provider, 0u32, 0u32);
62+
let _ = dependency_provider.resolve(0u32, 0u32);
6363
})
6464
});
6565
}
@@ -83,7 +83,7 @@ fn backtracking_ranges(c: &mut Criterion, package_count: u32, version_count: u32
8383

8484
c.bench_function("backtracking_ranges", |b| {
8585
b.iter(|| {
86-
let _ = pubgrub::resolve(&mut dependency_provider, 0u32, 0u32);
86+
let _ = dependency_provider.resolve(0u32, 0u32);
8787
})
8888
});
8989
}

benches/large_case.rs

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,19 @@ use std::time::Duration;
77
use criterion::*;
88
use serde::de::Deserialize;
99

10-
use pubgrub::{resolve, Map, OfflineDependencyProvider, Range, SemanticVersion, VersionSet};
10+
use pubgrub::{Map, OfflineDependencyProvider, Range, VersionRanges};
1111

1212
fn bench<
1313
'a,
1414
P: Debug + Display + Clone + Eq + Hash + Deserialize<'a>,
15-
VS: VersionSet + Deserialize<'a>,
15+
R: VersionRanges + Deserialize<'a>,
1616
>(
1717
b: &mut Bencher,
1818
case: &'a str,
1919
) where
20-
<VS as VersionSet>::V: Deserialize<'a>,
20+
R::V: Deserialize<'a>,
2121
{
22-
let mut dependency_provider: OfflineDependencyProvider<P, VS> =
23-
ron::de::from_str(case).unwrap();
22+
let mut dependency_provider: OfflineDependencyProvider<P, R> = ron::de::from_str(case).unwrap();
2423

2524
let dependencies = dependency_provider
2625
.packages()
@@ -34,8 +33,8 @@ fn bench<
3433

3534
b.iter(|| {
3635
for (p, versions) in &dependencies {
37-
for n in versions {
38-
let _ = resolve(&mut dependency_provider, p.clone(), n.clone());
36+
for v in versions {
37+
let _ = dependency_provider.resolve(p.clone(), v.clone());
3938
}
4039
}
4140
});
@@ -49,14 +48,10 @@ fn bench_nested(c: &mut Criterion) {
4948
let case = case.unwrap().path();
5049
let name = case.file_name().unwrap().to_string_lossy();
5150
let data = std::fs::read_to_string(&case).unwrap();
52-
if name.ends_with("u16_NumberVersion.ron") || name.ends_with("u16_u32.ron") {
51+
if name.ends_with("u16_NumberVersion.ron") {
5352
group.bench_function(name, |b| {
5453
bench::<u16, Range<u32>>(b, &data);
5554
});
56-
} else if name.ends_with("str_SemanticVersion.ron") {
57-
group.bench_function(name, |b| {
58-
bench::<&str, Range<SemanticVersion>>(b, &data);
59-
});
6055
}
6156
}
6257

benches/sudoku.rs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44
// SPDX-License-Identifier: MPL-2.0
55

66
use pubgrub::{
7-
resolve, DefaultStringReporter, OfflineDependencyProvider, PubGrubError, Range, Reporter,
8-
SelectedDependencies,
7+
DefaultStringReporter, Map, OfflineDependencyProvider, PubGrubError, Range, Reporter,
98
};
109
use std::fmt;
1110
use std::sync::Arc;
@@ -119,19 +118,18 @@ fn encode_constraints(
119118
}
120119
}
121120

122-
fn solve(board: Vec<(SudokuPackage, Ranges<Arc<usize>>)>) -> SelectedDependencies<DP> {
121+
fn solve(board: Vec<(SudokuPackage, Ranges<Arc<usize>>)>) -> Map<SudokuPackage, Arc<usize>> {
123122
let mut dependency_provider = DP::new();
124123
encode_constraints(&mut dependency_provider);
125124
dependency_provider.add_dependencies(SudokuPackage::Root, Arc::new(1usize), board);
126-
match resolve(
127-
&mut dependency_provider,
128-
SudokuPackage::Root,
129-
Arc::new(1usize),
130-
) {
125+
match dependency_provider.resolve(SudokuPackage::Root, Arc::new(1usize)) {
131126
Ok(sol) => sol,
132127
Err(PubGrubError::NoSolution(mut error)) => {
133128
error.derivation_tree.collapse_no_versions();
134-
eprintln!("{}", DefaultStringReporter::report(&error));
129+
eprintln!(
130+
"{}",
131+
DefaultStringReporter::report(&error, &dependency_provider)
132+
);
135133
std::process::exit(1);
136134
}
137135
Err(err) => panic!("{:?}", err),

examples/branching_error_reporting.rs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// SPDX-License-Identifier: MPL-2.0
22

33
use pubgrub::{
4-
resolve, DefaultStringReporter, OfflineDependencyProvider, PubGrubError, Ranges, Reporter,
4+
DefaultStringReporter, OfflineDependencyProvider, PubGrubError, Ranges, Reporter,
55
SemanticVersion,
66
};
77

@@ -10,15 +10,16 @@ type SemVS = Ranges<SemanticVersion>;
1010
// https://github.com/dart-lang/pub/blob/master/doc/solver.md#branching-error-reporting
1111
fn main() {
1212
let mut dependency_provider = OfflineDependencyProvider::<&str, SemVS>::new();
13+
1314
#[rustfmt::skip]
1415
// root 1.0.0 depends on foo ^1.0.0
15-
dependency_provider.add_dependencies(
16+
dependency_provider.add_dependencies(
1617
"root", (1, 0, 0),
1718
[("foo", Ranges::from_range_bounds((1, 0, 0)..(2, 0, 0)))],
1819
);
1920
#[rustfmt::skip]
2021
// foo 1.0.0 depends on a ^1.0.0 and b ^1.0.0
21-
dependency_provider.add_dependencies(
22+
dependency_provider.add_dependencies(
2223
"foo", (1, 0, 0),
2324
[
2425
("a", Ranges::from_range_bounds((1, 0, 0)..(2, 0, 0))),
@@ -27,7 +28,7 @@ fn main() {
2728
);
2829
#[rustfmt::skip]
2930
// foo 1.1.0 depends on x ^1.0.0 and y ^1.0.0
30-
dependency_provider.add_dependencies(
31+
dependency_provider.add_dependencies(
3132
"foo", (1, 1, 0),
3233
[
3334
("x", Ranges::from_range_bounds((1, 0, 0)..(2, 0, 0))),
@@ -36,7 +37,7 @@ fn main() {
3637
);
3738
#[rustfmt::skip]
3839
// a 1.0.0 depends on b ^2.0.0
39-
dependency_provider.add_dependencies(
40+
dependency_provider.add_dependencies(
4041
"a", (1, 0, 0),
4142
[("b", Ranges::from_range_bounds((2, 0, 0)..(3, 0, 0)))],
4243
);
@@ -45,7 +46,7 @@ fn main() {
4546
dependency_provider.add_dependencies("b", (2, 0, 0), []);
4647
#[rustfmt::skip]
4748
// x 1.0.0 depends on y ^2.0.0.
48-
dependency_provider.add_dependencies(
49+
dependency_provider.add_dependencies(
4950
"x", (1, 0, 0),
5051
[("y", Ranges::from_range_bounds((2, 0, 0)..(3, 0, 0)))],
5152
);
@@ -54,11 +55,14 @@ fn main() {
5455
dependency_provider.add_dependencies("y", (2, 0, 0), []);
5556

5657
// Run the algorithm.
57-
match resolve(&mut dependency_provider, "root", (1, 0, 0)) {
58+
match dependency_provider.resolve("root", (1, 0, 0)) {
5859
Ok(sol) => println!("{:?}", sol),
5960
Err(PubGrubError::NoSolution(mut error)) => {
6061
error.derivation_tree.collapse_no_versions();
61-
eprintln!("{}", DefaultStringReporter::report(&error));
62+
eprintln!(
63+
"{}",
64+
DefaultStringReporter::report(&error, &dependency_provider)
65+
);
6266
std::process::exit(1);
6367
}
6468
Err(err) => panic!("{:?}", err),
Lines changed: 78 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,106 @@
11
// SPDX-License-Identifier: MPL-2.0
22

33
use std::cell::RefCell;
4-
use std::collections::BTreeMap;
54
use std::fmt::{Debug, Display};
65
use std::hash::Hash;
76

87
use pubgrub::{
98
resolve, Dependencies, DependencyConstraints, DependencyProvider, Map,
10-
OfflineDependencyProvider, Package, PackageArena, Ranges,
9+
OfflineDependencyProvider, Package, PackageArena, PackageVersionWrapper, PubGrubError, Ranges,
10+
SelectedDependencies, VersionIndex, VersionRanges, VersionSet,
1111
};
1212

1313
type NumVS = Ranges<u32>;
14-
type CachedDeps<V, VS> = RefCell<Map<Package, BTreeMap<V, DependencyConstraints<VS>>>>;
14+
15+
trait RemoteProvider: DependencyProvider<P = PackageVersionWrapper<Self::Pkg>> {
16+
type Pkg: Debug + Display + Clone + Eq + Hash;
17+
type R: VersionRanges;
18+
19+
fn resolve_parameters(
20+
&self,
21+
p: Self::Pkg,
22+
v: impl Into<<Self::R as VersionRanges>::V>,
23+
) -> Option<(PackageVersionWrapper<Self::Pkg>, VersionIndex)>;
24+
}
25+
26+
impl<P: Debug + Display + Clone + Eq + Hash, R: VersionRanges> RemoteProvider
27+
for OfflineDependencyProvider<P, R>
28+
{
29+
type Pkg = P;
30+
type R = R;
31+
32+
fn resolve_parameters(
33+
&self,
34+
p: P,
35+
v: impl Into<<Self::R as VersionRanges>::V>,
36+
) -> Option<(PackageVersionWrapper<P>, VersionIndex)> {
37+
self.resolve_parameters(p, v)
38+
}
39+
}
1540

1641
// An example implementing caching dependency provider that will
1742
// store queried dependencies in memory and check them before querying more from remote.
18-
struct CachingDependencyProvider<DP: DependencyProvider>
43+
struct CachingDependencyProvider<DP: RemoteProvider<R = R>, R: VersionRanges>
1944
where
2045
DP::P: Debug + Display + Clone + Eq + Hash,
2146
{
2247
remote_dependencies: DP,
23-
cached_dependencies: CachedDeps<DP::V, DP::VS>,
48+
cached_dependencies: RefCell<Map<Package, Map<VersionIndex, DependencyConstraints>>>,
2449
}
2550

26-
impl<DP: DependencyProvider> CachingDependencyProvider<DP>
51+
impl<DP: RemoteProvider<R = R>, R: VersionRanges> CachingDependencyProvider<DP, R>
2752
where
2853
DP::P: Debug + Display + Clone + Eq + Hash,
2954
{
30-
pub fn new(remote_dependencies_provider: DP) -> Self {
55+
fn new(remote_dependencies_provider: DP) -> Self {
3156
CachingDependencyProvider {
3257
remote_dependencies: remote_dependencies_provider,
3358
cached_dependencies: Default::default(),
3459
}
3560
}
61+
62+
fn resolve(
63+
&mut self,
64+
p: <DP as RemoteProvider>::Pkg,
65+
v: impl Into<R::V>,
66+
) -> Result<SelectedDependencies<Self>, PubGrubError<Self>> {
67+
let Some((p, v)) = self.remote_dependencies.resolve_parameters(p, v) else {
68+
return Err(PubGrubError::NoRoot);
69+
};
70+
resolve(self, p, v)
71+
}
3672
}
3773

38-
impl<DP: DependencyProvider<M = &'static str>> DependencyProvider for CachingDependencyProvider<DP>
74+
impl<DP: RemoteProvider<R = R>, R: VersionRanges> DependencyProvider
75+
for CachingDependencyProvider<DP, R>
3976
where
4077
DP::P: Debug + Display + Clone + Eq + Hash,
78+
R::V: Clone,
4179
{
4280
// Cache dependencies if they were already queried
4381
fn get_dependencies(
4482
&mut self,
4583
package: Package,
46-
version: &DP::V,
84+
version_index: VersionIndex,
4785
package_store: &mut PackageArena<Self::P>,
48-
) -> Result<Dependencies<DP::VS, DP::M>, DP::Err> {
86+
) -> Result<Dependencies<DP::M>, DP::Err> {
4987
let mut cache = self.cached_dependencies.borrow_mut();
50-
if let Some(deps) = cache.get(&package).and_then(|vmap| vmap.get(version)) {
88+
if let Some(deps) = cache
89+
.get(&package)
90+
.and_then(|vmap| vmap.get(&version_index))
91+
{
5192
return Ok(Dependencies::Available(deps.clone()));
5293
}
5394

5495
match self
5596
.remote_dependencies
56-
.get_dependencies(package, version, package_store)
97+
.get_dependencies(package, version_index, package_store)
5798
{
5899
Ok(Dependencies::Available(deps)) => {
59100
cache
60101
.entry(package)
61102
.or_default()
62-
.insert(version.clone(), deps.clone());
103+
.insert(version_index, deps.clone());
63104
Ok(Dependencies::Available(deps))
64105
}
65106

@@ -71,31 +112,47 @@ where
71112
fn choose_version(
72113
&mut self,
73114
package: Package,
74-
ranges: &DP::VS,
115+
set: VersionSet,
75116
package_store: &PackageArena<Self::P>,
76-
) -> Result<Option<DP::V>, DP::Err> {
117+
) -> Result<Option<VersionIndex>, DP::Err> {
77118
self.remote_dependencies
78-
.choose_version(package, ranges, package_store)
119+
.choose_version(package, set, package_store)
79120
}
80121

81122
type Priority = DP::Priority;
82123

83124
fn prioritize(
84125
&mut self,
85126
package: Package,
86-
ranges: &DP::VS,
127+
set: VersionSet,
87128
package_store: &PackageArena<Self::P>,
88129
) -> Self::Priority {
89130
self.remote_dependencies
90-
.prioritize(package, ranges, package_store)
131+
.prioritize(package, set, package_store)
91132
}
92133

93134
type Err = DP::Err;
94135

95136
type P = DP::P;
96-
type V = DP::V;
97-
type VS = DP::VS;
98137
type M = DP::M;
138+
139+
fn package_version_repr<'a>(
140+
&'a self,
141+
pkg: &'a Self::P,
142+
version_index: VersionIndex,
143+
) -> impl Display + 'a {
144+
self.remote_dependencies
145+
.package_version_repr(pkg, version_index)
146+
}
147+
148+
fn package_version_set_repr<'a>(
149+
&'a self,
150+
pkg: &'a Self::P,
151+
version_set: VersionSet,
152+
) -> impl Display + 'a {
153+
self.remote_dependencies
154+
.package_version_set_repr(pkg, version_set)
155+
}
99156
}
100157

101158
fn main() {
@@ -108,6 +165,6 @@ fn main() {
108165
let mut caching_dependencies_provider =
109166
CachingDependencyProvider::new(remote_dependencies_provider);
110167

111-
let solution = resolve(&mut caching_dependencies_provider, "root", 1u32);
168+
let solution = caching_dependencies_provider.resolve("root", 1u32);
112169
println!("Solution: {:?}", solution);
113170
}

examples/doc_interface.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// SPDX-License-Identifier: MPL-2.0
22

3-
use pubgrub::{resolve, OfflineDependencyProvider, Ranges};
3+
use pubgrub::{OfflineDependencyProvider, Ranges};
44

55
type NumVS = Ranges<u32>;
66

@@ -19,6 +19,6 @@ fn main() {
1919
dependency_provider.add_dependencies("icons", 1u32, []);
2020

2121
// Run the algorithm.
22-
let solution = resolve(&mut dependency_provider, "root", 1u32);
23-
println!("Solution: {:?}", solution);
22+
let solution = dependency_provider.resolve("root", 1u32).unwrap();
23+
println!("Solution: {solution:?}");
2424
}

0 commit comments

Comments
 (0)