1 个不稳定版本
0.4.0 | 2024年6月23日 |
---|---|
0.3.3 |
|
0.3.2 |
|
0.3.1 |
|
0.1.0 |
|
在 算法 中排名 #105
每月下载量 2,232
用于 3 个包(2 个直接使用)
350KB
7.5K SLoC
范围
概述
GenericRange
这是 core/std 范围的主要替代品,提供了 From
实现。唯一的区别是,T
需要实现 Domain
并相应地实现 Ord
。
start
需要小于或等于 end
以维持某些保证并允许进行更多优化。
范围
这是一个基于 vector 的范围/区间集合,以有序和总是不相交的方式存储泛型范围。
Domain
这是一个辅助特质,用于定义类型的属性及其所属的域。它已经为所有 原始 整数、char
和 bool
实现了。此外,还有使用功能门控的 noisy_float
和 num-bigint
的实现。
此特质的默认实现以连续类型无需额外代码的方式编写(除非适用,还需它们的 min- 和 max-)。默认情况下,仅离散的方法会抛出恐慌,如果 DISCRETE
常量设置为 false
(默认情况下是这样的),则库不会调用这些方法。
示例
更多示例可以在 文档 中找到。
GenericRange
- 从 core/std 范围
use ranges::GenericRange; let generic = GenericRange::from(1..5); assert_eq!(generic.start_bound(), Bound::Included(&1)); assert_eq!(generic.end_bound(), Bound::Excluded(&5));
- 重叠并集
use ranges::{GenericRange, OperationResult}; let range = GenericRange::from(0..10); let range2 = 5..=15; assert_eq!(range | range2, OperationResult::Single((0..=15).into()));
范围
- 查找包含的交叠范围
use ranges::Ranges; let ranges = Ranges::from(vec![0..5, 10..20, 25..30, 45..50]); assert_eq!(ranges.find_intersecting_ranges(&(7..47).into()), Some((1, 3)));
- 包含一个项
use ranges::Ranges; let ranges = Ranges::from(vec![0..3, 5..10]); assert!(ranges.contains(&2)); assert!(ranges.contains(&7)); assert!(!ranges.contains(&4));
Domain
示例实现,允许Domain
的值在0到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<Self> {
match self {
Self::MIN => None,
_ => Some(self - 1),
}
}
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)
}
}
#[test]
fn clamp_to_domain() {
let range = GenericRange::<LimitedInt>::from(0..200);
assert!(range, (0..=100).into());
}
注意事项
功能 arbitrary
允许创建任意的 GenericRange
和 Range
,这些范围始终会保持上述保证,例如用于模糊测试。
依赖关系
~0–730KB
~14K SLoC