2 个不稳定版本
0.2.0 | 2021 年 10 月 1 日 |
---|---|
0.1.0 | 2021 年 9 月 30 日 |
0.0.1 |
|
#2722 in Rust 模式
13KB
190 行
constant
:常量,Rust 编程的编译时评估工具 🦀
constant
包旨在提供工具,以安全地 绕过 Rust 常量评估的限制。
特性
- 创建 常量默认实现
- 创建 嵌套常量默认实现
- 在
Constdef
实现中对泛型、生命周期和泛型提供全面支持 - 此包支持
std
提供的几乎所有类型。如果您需要其他外部类型,请 提交一个 issue 并询问! - 更多功能即将推出!
常量默认实现
#[derive(constant::Constdef)]
pub struct SpookyFriend {
name: String,
email: String,
friend_names: Vec<String>,
userid: u64,
}
const SPOOKY: SpookyFriend = SpookyFriend::default();
#[test]
fn test_struct_with_heap_fields() {
// spooky name; it's empty!
assert_eq!(SPOOKY.name, "");
// spooky email; it's empty!
assert_eq!(SPOOKY.email, "");
// spooky friend has no friends!
assert_eq!(SPOOKY.friend_names, Vec::<String>::new());
// spooky userid; it's 0!
assert_eq!(SPOOKY.userid, 0);
}
嵌套常量默认实现
use constant::Constdef;
#[derive(Constdef)]
pub struct SystemLoad {
disk: DiskLoad,
net: NetLoad,
}
#[derive(Constdef)]
pub struct DiskLoad {
disk_count: usize,
media_list: Vec<String>,
}
#[derive(Constdef)]
pub struct NetLoad {
interface_list: Vec<String>,
portload: [usize; 65536],
}
static mut SYSLOAD: SystemLoad = SystemLoad::default();
#[test]
fn test_system_load_nested_struct() {
unsafe {
// check the number of disks
assert_eq!(SYSLOAD.disk.disk_count, 0);
// increment the number of disks
SYSLOAD.disk.disk_count += 1;
assert_eq!(SYSLOAD.disk.disk_count, 1);
// check port 80 load
assert_eq!(SYSLOAD.net.portload[80], 0);
// increment the load
SYSLOAD.net.portload[80] += 1;
assert_eq!(SYSLOAD.net.portload[80], 1);
// now let's add a disk
SYSLOAD.disk.media_list.push("/dev/sda1".to_string());
// now let's add a network interface
SYSLOAD.net.interface_list.push("eth01".to_string());
}
}
许可证
本库根据 Apache-2.0 许可证分发。
依赖
~1.5MB
~35K SLoC