2 个不稳定版本

0.2.0 2021 年 10 月 1 日
0.1.0 2021 年 9 月 30 日
0.0.1 2021 年 9 月 30 日

#2722 in Rust 模式

Apache-2.0

13KB
190

constant:常量,Rust 编程的编译时评估工具 🦀

Rust Stable GitHub Workflow Status Crates.io docs.rs GitHub

constant 包旨在提供工具,以安全地 绕过 Rust 常量评估的限制。

特性

常量默认实现

#[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