Ranges
Ranges
is a generic replacement for the [core]/[std] range types.
GenericRange
This is the main replacement for [core]/[std] ranges with provided From
implementations.
The only difference is, that T
needs to implement Domain
and consequently [Ord
].
The start
needs to be less or equal to end
to uphold certain guarantees and allow for more optimization.
Ranges
This is a [vector]-backed range/interval set storing generic ranges in a ordered and always disjoint fashion.
Domain
This is the helper trait that defines the properties of a type and the domain it is in.
It is already implemented for all [primitive] integers, [char
] and [bool
]. Additionally there are implementations
using feature gates for [noisy_float
] and [num-bigint
].
The default implementation of this trait is written in a way, that continuous
types need no further code (except, if applicable, their min- and maximum).
Discrete-only methods panic by default and are never called by the
library if the DISCRETE
constant is false
(which it is by default).
More examples can be found in the documentation.
from [core]/[std] ranges: ``` use ranges::GenericRange;
let generic = GenericRange::from(1..5); asserteq!(generic.startbound(), Bound::Included(&1)); asserteq!(generic.endbound(), Bound::Excluded(&5)); ```
overlapping union: ``` use ranges::{GenericRange, OperationResult};
let range = GenericRange::from(0..10); let range2 = 5..=15;
assert_eq!(range | range2, OperationResult::Single((0..=15).into())); ```
find contained intersecting ranges: ``` use ranges::Ranges;
let ranges = Ranges::from(vec![0..5, 10..20, 25..30, 45..50]); asserteq!(ranges.findintersecting_ranges(&(7..47).into()), Some((1, 3))); ```
contains an item: ``` use ranges::Ranges;
let ranges = Ranges::from(vec![0..3, 5..10]); assert!(ranges.contains(&2)); assert!(ranges.contains(&7)); assert!(!ranges.contains(&4)); ```
Example implementation for a Domain
allowing only values between 0 and 100:
```
use ranges::Domain;
struct LimitedInt(u8);
impl LimitedInt { const MIN: u8 = 0; const MAX: u8 = 100; }
impl Domain for LimitedInt {
fn predecessor(&self) -> Option
fn successor(&self) -> Option<Self> {
match self {
Self::MAX => None,
_ => Some(self + 1),
}
}
fn minimum() -> Bound<Self> {
Bound::Included(Self::MIN)
}
fn maximum() -> Bound<Self> {
Bound::Included(Self::MAX)
}
}
fn clamptodomain() {
let range = GenericRange::
The feature [arbitrary
] allows creating arbitrary GenericRange
s and Range
s
which will always uphold the guarantees described above e.g. for use in fuzzers.