4 个版本
0.2.3 | 2022 年 11 月 24 日 |
---|---|
0.2.2 | 2022 年 8 月 19 日 |
0.2.0 | 2022 年 7 月 11 日 |
0.1.2 |
|
#1009 in 算法
205KB
2.5K SLoC
限定在包含范围内的整数
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 中实现。
功能标志
此仓库不提供任何默认功能。可启用的功能是:std
和 serde
。
std
默认情况下,此仓库不与标准库链接,因此适用于 no_std
环境。但它确实提供了一个 std
功能,该功能将标准库作为依赖项启用。通过启用此仓库的 std
功能,提供了以下附加功能
- 所有仓库的错误类型都将实现
std::error::Error
特性。
如果用户已经在他们的仓库中导入标准库,则启用 std
功能不会带来任何额外成本。
serde
该 serde
功能实现了 serde 的 Serialize
和 Deserialize
特性,用于 Wrapping
、Saturating
以及所有 Constrained
类型。请注意,构造约束在将值反序列化为任何 Constrained
类型时会在运行时进行检查。有关这些约束的更多信息,请参阅所需类型的文档。
许可证
根据以下之一进行许可
- Apache License,版本 2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
贡献
除非您明确说明,否则根据 Apache-2.0 许可证定义的,您提交的任何有意包含在作品中的贡献,都应如上所述双重许可,不附加任何额外的条款或条件。
代码审查
建议始终使用 cargo-crev 验证每个依赖项的可靠性,包括这个依赖项。
依赖项
~1.5MB
~37K SLoC