#arithmetic #crypto #proc-macro #operator #equivalents #saturating #u32

saturating_arithmetic

Proc macro #[saturateit] 将运算符重写为其饱和等效版本

4个版本

0.1.3 2020年10月1日
0.1.2 2020年9月30日
0.1.1 2020年9月30日
0.1.0 2020年9月30日

#819 in 过程宏

每月21次下载

Apache-2.0

10KB
95

描述

此Crate提供了一种过程宏,可以将算术运算符 +,-,* 以及它们的赋值版本 +=,-=,*= 重写为其饱和等效版本 saturating_add, saturating_sub, saturating_mul。例如,这对于快速 安全 旧代码很有用,如果你能接受由此检查带来的性能惩罚。

GitHub
Crates.io

内容

示例

以下函数

#[saturateit]
fn mix(a: u32, b: u32, c: &[u32]) -> u32 {
    let mut r = a + b;
    for u in c {
        r *= u;
    }
    r
}

被重写为

fn mix(a: u32, b: u32, c: &[u32]) -> u32 {
    let mut r = a.saturating_add(b);
    for u in c {
        r = r.saturating_mul(u);
    }
    r
}

安装

在您的 Cargo.toml 中的 [dependencies] 添加

[dependencies]
saturating_arithmetic = "0.1"

# If you want this to work on your own types, you'll need this crate too:
num-traits = "0.2"

然后,在您的入口点(main.rslib.rs)中添加

extern crate saturating_arithmetic;
extern crate num_traits;

然后在您的代码中使用它们。

use saturating_arithmetic::saturateit;
use num_traits::{SaturatingAdd, SaturatingMul, SaturatingSub};

用法

在函数体上方添加 #[saturateit]

#[saturateit]
fn lmao_jeff() {
    4 + 4;
}

您可以使用类似 cargo expand 的工具来检查宏是否真正起作用。

fn lmao_jeff() {
    4.saturating_add(4);
}

警告

如果您也在使用特性,您可能会看到关于必须借用操作符右侧的警告,因为根据特性的函数签名是 saturating_add(&self, rhs: &Self) -> Self
根据我的经验,您可以忽略这些。



免责声明

我从wrapping_arithmetic中分叉了这个项目,因为有点需要它。我对这个实际上是如何工作的没有头绪,除了过程宏魔法那些庞大的依赖确实做了些什么。您可以自由地创建一个Issue或PR,但我无法保证我能帮到您。

待办事项

总的来说,整个项目需要重做,使其更像overflower,但需要积极维护,并且没有任何夜间功能。我对整个特性问题也很不满意,肯定有办法让这一切都能可靠地工作。当然。

依赖项

~1.5MB
~36K SLoC