#numbers #forms #range #bounds #min #clamping #ada

clamps

包装、饱和以及其他形式的数字夹具

3 个版本

0.1.2 2022 年 5 月 6 日
0.1.1 2022 年 5 月 4 日
0.1.0 2022 年 5 月 4 日

1786 in 算法

MIT 许可证

47KB
1.5K SLoC

clamps

包装、饱和以及其他形式的数字夹具!

这样做很糟糕

if foo >= min && foo <= max {
    // do stuff
}

相反,如果我们能以某种方式将 maxmin 编码到 foo类型 中,那么我们就可以在不自己编写繁琐的代码的情况下获得边界检查的所有好处。Ada 有一个很好的解决方案,它有 rangemod 类型,如果 Rust 也有这些类型那会很好。

这个包里有什么?

Clamps 提供了三种基本形式的各种类型

  • 有界
    • 不能从超出范围的值构造。
  • 包装
    • 在从值构造时会包装以适应范围。
    • 类似于 Ada 的 mod 类型。
    • 实现了 AddAssignSubAssign 等。
  • 饱和
    • 在从值构造时会“饱和”以适应范围。
      • 过大的值将被设置为 MAX。
      • 过小的值将被设置为 MIN。
    • 实现了 AddAssignSubAssign 等。

所有三种变体都有泛型和具体形式。泛型类型稍微昂贵且繁琐,但可以与更多类型一起使用。具体形式便宜且易于使用,但目前仅限于整数。

泛型变体还允许你在运行时指定它们的边界,这有助于在动态检查索引等时使用。

无运行时依赖