#range #set #no-std

no-std 范围

此包提供核心/标准范围的一个泛型替代品,以及用于与它们一起工作的集合操作和可以以尽可能少的内存高效存储它们的范围集合

1 个不稳定版本

0.4.0 2024年6月23日
0.3.3 2021年5月22日
0.3.2 2021年1月4日
0.3.1 2020年8月30日
0.1.0 2020年1月13日

算法 中排名 #105

Download history 563/week @ 2024-04-27 518/week @ 2024-05-04 498/week @ 2024-05-11 728/week @ 2024-05-18 536/week @ 2024-05-25 693/week @ 2024-06-01 505/week @ 2024-06-08 559/week @ 2024-06-15 903/week @ 2024-06-22 488/week @ 2024-06-29 604/week @ 2024-07-06 513/week @ 2024-07-13 671/week @ 2024-07-20 512/week @ 2024-07-27 376/week @ 2024-08-03 561/week @ 2024-08-10

每月下载量 2,232
用于 3 个包(2 个直接使用)

LGPL-3.0 或更高版本

350KB
7.5K SLoC

范围

Docs Crates.io License Deps.rs Build Status Code Coverage

Matrix

Rangescore/std 范围类型的泛型替代品。

概述

GenericRange

这是 core/std 范围的主要替代品,提供了 From 实现。唯一的区别是,T 需要实现 Domain 并相应地实现 Ord

start 需要小于或等于 end 以维持某些保证并允许进行更多优化。

范围

这是一个基于 vector 的范围/区间集合,以有序和总是不相交的方式存储泛型范围。

Domain

这是一个辅助特质,用于定义类型的属性及其所属的域。它已经为所有 原始 整数、charbool 实现了。此外,还有使用功能门控的 noisy_floatnum-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 允许创建任意的 GenericRangeRange,这些范围始终会保持上述保证,例如用于模糊测试。

依赖关系

~0–730KB
~14K SLoC