#const-generics #checking #utility

nightly 无std checks

添加了几个针对const泛型的编译时检查

8个版本 (稳定)

1.0.6 2023年5月17日
1.0.5 2023年4月24日
1.0.4 2023年4月23日
0.0.0 2023年4月20日

151无标准库

Download history 2/week @ 2024-03-08 2/week @ 2024-03-15 7/week @ 2024-03-29 4/week @ 2024-04-05

每月112次下载
matrix-rs 中使用

MIT 许可证

10KB
132

checks

添加了几个针对const泛型的编译时检查。

灵感来源于这篇Reddit帖子

注意:此库需要使用#![feature(generic_const_exprs)]标志。

用法

#![feature(generic_const_exprs)]

/// Only allows for arguments of `C` to be alphabetic
struct AlphabeticTest<const C: char>
where 
    checks::char::Alphabetic<C>: checks::Passed;

// All letters are alphabetic, check passes.
let pass = AlphabeticTest::<'a'>; // Compiles
let pass = AlphabeticTest::<'B'>; // Compiles
let pass = AlphabeticTest::<'c'>; // Compiles

// Letters are not alphabetic, check fails.
let fail = AlphabeticTest::<'1'>; // Compile error!
let fail = AlphabeticTest::<'&'>; // Compile error!
let fail = AlphabeticTest::<'3'>; // Compile error!

也可以实现自定义检查

const fn is_binary(num: u8) -> bool { num == 0 || num == 1 }
struct BinaryOnly<const N: u8> 
where
    Check<{ is_binary(N) }>: Passed;

let pass = BinaryOnly::<0>; // Compiles
let pass = BinaryOnly::<1>; // Compiles

let fail = BinaryOnly::<2>; // Compiler error!

检查也可以使用check!宏来定义,这也会为示例输入生成文档/测试

check! { u8 =>
    /// Matches all binary numbers (0, 1)
    Binary(
        passes: 0, 1
        fails: 2, 3, 4
    ): |N| (N == 0 || N == 1)
}

struct BinaryOnly<const N: u8>
where
    Binary<N>: Passed;

let pass = BinaryOnly::<0>; // Compiles
let pass = BinaryOnly::<1>; // Compiles

let fail = BinaryOnly::<2>; // Compiler error!

提供的检查的完整列表可以在docs.rs页面上找到。

无运行时依赖