#math #compile-time #numeric #no-std #arithmetic-operations

nightly no-std constrained_int

限定在包含范围内的整数

4 个版本

0.2.3 2022 年 11 月 24 日
0.2.2 2022 年 8 月 19 日
0.2.0 2022 年 7 月 11 日
0.1.2 2022 年 7 月 10 日

#1009 in 算法

MIT/Apache

205KB
2.5K SLoC

限定在包含范围内的整数

License Documentation Crate CI codecov Safety No std Maintenance

Constrained 类型简单地表示为原始整数,但它们的值将始终包含在包含范围界限内。范围在编译时定义,通过为适当的 const 泛型参数赋值。限定类型提供可失败的建设和值赋值 API,它们还实现了范围边界的包装、饱和、溢出和检查算术操作。有关更多信息,请参阅所需类型的文档。

constrained_int 依赖于 const_guards 仓库来定义编译时约束,它本身使用不完整的 generic_const_exprs 功能。因此,此仓库只能使用 nightly 编译,更重要的是,必须将其视为仅限 实验性 的仓库。

默认情况下,此仓库为 no_std。有关更多信息,请参阅功能部分。

安装

# Cargo.toml

[dependencies]
constrained_int = "0.2"

示例

use constrained_int::i8::{ConstrainedI8, ConstrainedI8Error};

// Lower bound = -5, upper bound = 10, default = -1.
type Constrained = ConstrainedI8<-5, 10, -1>;
type ConstrainedError = ConstrainedI8Error<-5, 10>;

fn main() -> Result<(), ConstrainedError> {
    // Gets the default value.
    let mut constrained = Constrained::default();
    assert_eq!(constrained.get(), -1);

    // Sets within inclusive range, succeeds.
    constrained.set(-5)?;
    assert_eq!(constrained.get(), -5);

    // Below lower bound, fails.
    assert_eq!(constrained.checked_sub(1), None);
    assert_eq!(constrained.get(), -5);

    // Saturates at the upper bound.
    constrained = constrained.saturating_add(100);
    assert_eq!(constrained.get(), 10);

    // Sets out of boundary, fails.
    assert!(constrained.set(11).is_err());

    // Wraps around the upper bound.
    constrained = constrained.wrapping_add(1);
    assert_eq!(constrained.get(), -5);

    Ok(())
}

文档

此项目文档托管在 docs.rs

安全性

此仓库使用 #![forbid)] 来确保所有内容都在 100% 安全的 Rust 中实现。

功能标志

此仓库不提供任何默认功能。可启用的功能是:stdserde

std

默认情况下,此仓库不与标准库链接,因此适用于 no_std 环境。但它确实提供了一个 std 功能,该功能将标准库作为依赖项启用。通过启用此仓库的 std 功能,提供了以下附加功能

  • 所有仓库的错误类型都将实现 std::error::Error 特性。

如果用户已经在他们的仓库中导入标准库,则启用 std 功能不会带来任何额外成本。

serde

serde 功能实现了 serdeSerializeDeserialize 特性,用于 WrappingSaturating 以及所有 Constrained 类型。请注意,构造约束在将值反序列化为任何 Constrained 类型时会在运行时进行检查。有关这些约束的更多信息,请参阅所需类型的文档。

许可证

根据以下之一进行许可

贡献

除非您明确说明,否则根据 Apache-2.0 许可证定义的,您提交的任何有意包含在作品中的贡献,都应如上所述双重许可,不附加任何额外的条款或条件。

代码审查

建议始终使用 cargo-crev 验证每个依赖项的可靠性,包括这个依赖项。

依赖项

~1.5MB
~37K SLoC