Skip to content

feat: add inclusive and exclusive bounds to Range #111

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 14 additions & 5 deletions benches/large_case.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,21 @@ use std::time::Duration;
extern crate criterion;
use self::criterion::*;

use pubgrub::bounded_range::BoundedRange;
use pubgrub::discrete_range::DiscreteRange;
use pubgrub::package::Package;
use pubgrub::solver::{resolve, OfflineDependencyProvider};
use pubgrub::version::{NumberVersion, SemanticVersion, Version};
use pubgrub::version_set::VersionSet;
use serde::de::Deserialize;
use std::hash::Hash;

fn bench<'a, P: Package + Deserialize<'a>, V: Version + Hash + Deserialize<'a>>(
fn bench<'a, P: Package + Deserialize<'a>, V: VersionSet + Deserialize<'a>>(
b: &mut Bencher,
case: &'a str,
) {
) where
<V as VersionSet>::V: Deserialize<'a>,
{
let dependency_provider: OfflineDependencyProvider<P, V> = ron::de::from_str(&case).unwrap();

b.iter(|| {
Expand All @@ -33,13 +38,17 @@ fn bench_nested(c: &mut Criterion) {
let case = case.unwrap().path();
let name = case.file_name().unwrap().to_string_lossy();
let data = std::fs::read_to_string(&case).unwrap();
if name.ends_with("u16_NumberVersion.ron") {
if name.ends_with("u16_discrete_NumberVersion.ron") {
group.bench_function(name, |b| {
bench::<u16, NumberVersion>(b, &data);
bench::<u16, DiscreteRange<NumberVersion>>(b, &data);
});
} else if name.ends_with("u16_bounded_NumberVersion.ron") {
group.bench_function(name, |b| {
bench::<u16, BoundedRange<NumberVersion>>(b, &data);
});
} else if name.ends_with("str_SemanticVersion.ron") {
group.bench_function(name, |b| {
bench::<&str, SemanticVersion>(b, &data);
bench::<&str, DiscreteRange<SemanticVersion>>(b, &data);
});
}
}
Expand Down
24 changes: 12 additions & 12 deletions examples/branching_error_reporting.rs
Original file line number Diff line number Diff line change
@@ -1,54 +1,54 @@
// SPDX-License-Identifier: MPL-2.0

use pubgrub::bounded_range::BoundedRange;
use pubgrub::error::PubGrubError;
use pubgrub::range::Range;
use pubgrub::report::{DefaultStringReporter, Reporter};
use pubgrub::solver::{resolve, OfflineDependencyProvider};
use pubgrub::version::SemanticVersion;

type SemVS = Range<SemanticVersion>;
type SemVS = BoundedRange<SemanticVersion>;

// https://github.com/dart-lang/pub/blob/master/doc/solver.md#branching-error-reporting
fn main() {
let mut dependency_provider = OfflineDependencyProvider::<&str, SemVS>::new();
#[rustfmt::skip]
// root 1.0.0 depends on foo ^1.0.0
dependency_provider.add_dependencies(
"root", (1, 0, 0),
[("foo", Range::from_range_bounds((1, 0, 0)..(2, 0, 0)))],
"root", (1, 0, 0),
[("foo", BoundedRange::from_range_bounds((1, 0, 0)..(2, 0, 0)))],
);
#[rustfmt::skip]
// foo 1.0.0 depends on a ^1.0.0 and b ^1.0.0
dependency_provider.add_dependencies(
"foo", (1, 0, 0),
[
("a", Range::from_range_bounds((1, 0, 0)..(2, 0, 0))),
("b", Range::from_range_bounds((1, 0, 0)..(2, 0, 0))),
("a", BoundedRange::from_range_bounds((1, 0, 0)..(2, 0, 0))),
("b", BoundedRange::from_range_bounds((1, 0, 0)..(2, 0, 0))),
],
);
#[rustfmt::skip]
// foo 1.1.0 depends on x ^1.0.0 and y ^1.0.0
dependency_provider.add_dependencies(
"foo", (1, 1, 0),
[
("x", Range::from_range_bounds((1, 0, 0)..(2, 0, 0))),
("y", Range::from_range_bounds((1, 0, 0)..(2, 0, 0))),
("x", BoundedRange::from_range_bounds((1, 0, 0)..(2, 0, 0))),
("y", BoundedRange::from_range_bounds((1, 0, 0)..(2, 0, 0))),
],
);
#[rustfmt::skip]
// a 1.0.0 depends on b ^2.0.0
dependency_provider.add_dependencies(
"a", (1, 0, 0),
[("b", Range::from_range_bounds((2, 0, 0)..(3, 0, 0)))],
"a", (1, 0, 0),
[("b", BoundedRange::from_range_bounds((2, 0, 0)..(3, 0, 0)))],
);
// b 1.0.0 and 2.0.0 have no dependencies.
dependency_provider.add_dependencies("b", (1, 0, 0), []);
dependency_provider.add_dependencies("b", (2, 0, 0), []);
#[rustfmt::skip]
// x 1.0.0 depends on y ^2.0.0.
dependency_provider.add_dependencies(
"x", (1, 0, 0),
[("y", Range::from_range_bounds((2, 0, 0)..(3, 0, 0)))],
"x", (1, 0, 0),
[("y", BoundedRange::from_range_bounds((2, 0, 0)..(3, 0, 0)))],
);
// y 1.0.0 and 2.0.0 have no dependencies.
dependency_provider.add_dependencies("y", (1, 0, 0), []);
Expand Down
4 changes: 2 additions & 2 deletions examples/caching_dependency_provider.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@
use std::cell::RefCell;
use std::error::Error;

use pubgrub::bounded_range::BoundedRange;
use pubgrub::package::Package;
use pubgrub::range::Range;
use pubgrub::solver::{resolve, Dependencies, DependencyProvider, OfflineDependencyProvider};
use pubgrub::version::NumberVersion;
use pubgrub::version_set::VersionSet;

type NumVS = Range<NumberVersion>;
type NumVS = BoundedRange<NumberVersion>;

// An example implementing caching dependency provider that will
// store queried dependencies in memory and check them before querying more from remote.
Expand Down
10 changes: 5 additions & 5 deletions examples/doc_interface.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
// SPDX-License-Identifier: MPL-2.0

use pubgrub::range::Range;
use pubgrub::bounded_range::BoundedRange;
use pubgrub::solver::{resolve, OfflineDependencyProvider};
use pubgrub::version::NumberVersion;

type NumVS = Range<NumberVersion>;
type NumVS = BoundedRange<NumberVersion>;

// `root` depends on `menu` and `icons`
// `menu` depends on `dropdown`
Expand All @@ -14,10 +14,10 @@ type NumVS = Range<NumberVersion>;
fn main() {
let mut dependency_provider = OfflineDependencyProvider::<&str, NumVS>::new();
dependency_provider.add_dependencies(
"root", 1, [("menu", Range::any()), ("icons", Range::any())],
"root", 1, [("menu", BoundedRange::any()), ("icons", BoundedRange::any())],
);
dependency_provider.add_dependencies("menu", 1, [("dropdown", Range::any())]);
dependency_provider.add_dependencies("dropdown", 1, [("icons", Range::any())]);
dependency_provider.add_dependencies("menu", 1, [("dropdown", BoundedRange::any())]);
dependency_provider.add_dependencies("dropdown", 1, [("icons", BoundedRange::any())]);
dependency_provider.add_dependencies("icons", 1, []);

// Run the algorithm.
Expand Down
32 changes: 16 additions & 16 deletions examples/doc_interface_error.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: MPL-2.0

use pubgrub::bounded_range::BoundedRange;
use pubgrub::error::PubGrubError;
use pubgrub::range::Range;
use pubgrub::report::{DefaultStringReporter, Reporter};
use pubgrub::solver::{resolve, OfflineDependencyProvider};
use pubgrub::version::SemanticVersion;

type SemVS = Range<SemanticVersion>;
type SemVS = BoundedRange<SemanticVersion>;

// `root` depends on `menu`, `icons 1.0.0` and `intl 5.0.0`
// `menu 1.0.0` depends on `dropdown < 2.0.0`
Expand All @@ -20,46 +20,46 @@ fn main() {
let mut dependency_provider = OfflineDependencyProvider::<&str, SemVS>::new();
// Direct dependencies: menu and icons.
dependency_provider.add_dependencies("root", (1, 0, 0), [
("menu", Range::any()),
("icons", Range::exact((1, 0, 0))),
("intl", Range::exact((5, 0, 0))),
("menu", BoundedRange::any()),
("icons", BoundedRange::exact((1, 0, 0))),
("intl", BoundedRange::exact((5, 0, 0))),
]);

// Dependencies of the menu lib.
dependency_provider.add_dependencies("menu", (1, 0, 0), [
("dropdown", Range::from_range_bounds(..(2, 0, 0))),
("dropdown", BoundedRange::from_range_bounds(..(2, 0, 0))),
]);
dependency_provider.add_dependencies("menu", (1, 1, 0), [
("dropdown", Range::from_range_bounds((2, 0, 0)..)),
("dropdown", BoundedRange::from_range_bounds((2, 0, 0)..)),
]);
dependency_provider.add_dependencies("menu", (1, 2, 0), [
("dropdown", Range::from_range_bounds((2, 0, 0)..)),
("dropdown", BoundedRange::from_range_bounds((2, 0, 0)..)),
]);
dependency_provider.add_dependencies("menu", (1, 3, 0), [
("dropdown", Range::from_range_bounds((2, 0, 0)..)),
("dropdown", BoundedRange::from_range_bounds((2, 0, 0)..)),
]);
dependency_provider.add_dependencies("menu", (1, 4, 0), [
("dropdown", Range::from_range_bounds((2, 0, 0)..)),
("dropdown", BoundedRange::from_range_bounds((2, 0, 0)..)),
]);
dependency_provider.add_dependencies("menu", (1, 5, 0), [
("dropdown", Range::from_range_bounds((2, 0, 0)..)),
("dropdown", BoundedRange::from_range_bounds((2, 0, 0)..)),
]);

// Dependencies of the dropdown lib.
dependency_provider.add_dependencies("dropdown", (1, 8, 0), [
("intl", Range::exact((3, 0, 0))),
("intl", BoundedRange::exact((3, 0, 0))),
]);
dependency_provider.add_dependencies("dropdown", (2, 0, 0), [
("icons", Range::exact((2, 0, 0))),
("icons", BoundedRange::exact((2, 0, 0))),
]);
dependency_provider.add_dependencies("dropdown", (2, 1, 0), [
("icons", Range::exact((2, 0, 0))),
("icons", BoundedRange::exact((2, 0, 0))),
]);
dependency_provider.add_dependencies("dropdown", (2, 2, 0), [
("icons", Range::exact((2, 0, 0))),
("icons", BoundedRange::exact((2, 0, 0))),
]);
dependency_provider.add_dependencies("dropdown", (2, 3, 0), [
("icons", Range::exact((2, 0, 0))),
("icons", BoundedRange::exact((2, 0, 0))),
]);

// Icons have no dependencies.
Expand Down
28 changes: 14 additions & 14 deletions examples/doc_interface_semantic.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: MPL-2.0

use pubgrub::bounded_range::BoundedRange;
use pubgrub::error::PubGrubError;
use pubgrub::range::Range;
use pubgrub::report::{DefaultStringReporter, Reporter};
use pubgrub::solver::{resolve, OfflineDependencyProvider};
use pubgrub::version::SemanticVersion;

type SemVS = Range<SemanticVersion>;
type SemVS = BoundedRange<SemanticVersion>;

// `root` depends on `menu` and `icons 1.0.0`
// `menu 1.0.0` depends on `dropdown < 2.0.0`
Expand All @@ -19,43 +19,43 @@ fn main() {
let mut dependency_provider = OfflineDependencyProvider::<&str, SemVS>::new();
// Direct dependencies: menu and icons.
dependency_provider.add_dependencies("root", (1, 0, 0), [
("menu", Range::any()),
("icons", Range::exact((1, 0, 0))),
("menu", BoundedRange::any()),
("icons", BoundedRange::exact((1, 0, 0))),
]);

// Dependencies of the menu lib.
dependency_provider.add_dependencies("menu", (1, 0, 0), [
("dropdown", Range::from_range_bounds(..(2, 0, 0))),
("dropdown", BoundedRange::from_range_bounds(..(2, 0, 0))),
]);
dependency_provider.add_dependencies("menu", (1, 1, 0), [
("dropdown", Range::from_range_bounds((2, 0, 0)..)),
("dropdown", BoundedRange::from_range_bounds((2, 0, 0)..)),
]);
dependency_provider.add_dependencies("menu", (1, 2, 0), [
("dropdown", Range::from_range_bounds((2, 0, 0)..)),
("dropdown", BoundedRange::from_range_bounds((2, 0, 0)..)),
]);
dependency_provider.add_dependencies("menu", (1, 3, 0), [
("dropdown", Range::from_range_bounds((2, 0, 0)..)),
("dropdown", BoundedRange::from_range_bounds((2, 0, 0)..)),
]);
dependency_provider.add_dependencies("menu", (1, 4, 0), [
("dropdown", Range::from_range_bounds((2, 0, 0)..)),
("dropdown", BoundedRange::from_range_bounds((2, 0, 0)..)),
]);
dependency_provider.add_dependencies("menu", (1, 5, 0), [
("dropdown", Range::from_range_bounds((2, 0, 0)..)),
("dropdown", BoundedRange::from_range_bounds((2, 0, 0)..)),
]);

// Dependencies of the dropdown lib.
dependency_provider.add_dependencies("dropdown", (1, 8, 0), []);
dependency_provider.add_dependencies("dropdown", (2, 0, 0), [
("icons", Range::exact((2, 0, 0))),
("icons", BoundedRange::exact((2, 0, 0))),
]);
dependency_provider.add_dependencies("dropdown", (2, 1, 0), [
("icons", Range::exact((2, 0, 0))),
("icons", BoundedRange::exact((2, 0, 0))),
]);
dependency_provider.add_dependencies("dropdown", (2, 2, 0), [
("icons", Range::exact((2, 0, 0))),
("icons", BoundedRange::exact((2, 0, 0))),
]);
dependency_provider.add_dependencies("dropdown", (2, 3, 0), [
("icons", Range::exact((2, 0, 0))),
("icons", BoundedRange::exact((2, 0, 0))),
]);

// Icons has no dependency.
Expand Down
16 changes: 8 additions & 8 deletions examples/linear_error_reporting.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: MPL-2.0

use pubgrub::bounded_range::BoundedRange;
use pubgrub::error::PubGrubError;
use pubgrub::range::Range;
use pubgrub::report::{DefaultStringReporter, Reporter};
use pubgrub::solver::{resolve, OfflineDependencyProvider};
use pubgrub::version::SemanticVersion;

type SemVS = Range<SemanticVersion>;
type SemVS = BoundedRange<SemanticVersion>;

// https://github.com/dart-lang/pub/blob/master/doc/solver.md#linear-error-reporting
fn main() {
Expand All @@ -16,21 +16,21 @@ fn main() {
dependency_provider.add_dependencies(
"root", (1, 0, 0),
[
("foo", Range::from_range_bounds((1, 0, 0)..(2, 0, 0))),
("baz", Range::from_range_bounds((1, 0, 0)..(2, 0, 0))),
("foo", BoundedRange::from_range_bounds((1, 0, 0)..(2, 0, 0))),
("baz", BoundedRange::from_range_bounds((1, 0, 0)..(2, 0, 0))),
],
);
#[rustfmt::skip]
// foo 1.0.0 depends on bar ^2.0.0
dependency_provider.add_dependencies(
"foo", (1, 0, 0),
[("bar", Range::from_range_bounds((2, 0, 0)..(3, 0, 0)))],
"foo", (1, 0, 0),
[("bar", BoundedRange::from_range_bounds((2, 0, 0)..(3, 0, 0)))],
);
#[rustfmt::skip]
// bar 2.0.0 depends on baz ^3.0.0
dependency_provider.add_dependencies(
"bar", (2, 0, 0),
[("baz", Range::from_range_bounds((3, 0, 0)..(4, 0, 0)))],
"bar", (2, 0, 0),
[("baz", BoundedRange::from_range_bounds((3, 0, 0)..(4, 0, 0)))],
);
// baz 1.0.0 and 3.0.0 have no dependencies
dependency_provider.add_dependencies("baz", (1, 0, 0), []);
Expand Down
Loading