#constant #external #macro #constdef #evaluation #compile-time #lifetime

macro const_internals

Internal macros for the constant crate. Not for external use!

3 releases (breaking)

0.2.0 Oct 1, 2021
0.1.0 Sep 30, 2021
0.0.1 Sep 30, 2021

#66 in #evaluation


Used in constant

Apache-2.0

10KB
233 lines

constant: Constant, compile-time evaluation tools for Rust 🦀

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

The constant crate aims to provide tools for safely working around the limits imposed by constant evaluation in Rust.

Features

Constant default implementations

#[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);
}

Nested constant default implementations

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());
    }
}

License

This library is distributed under the Apache-2.0 License.


lib.rs:

Internal macros for the constant crate.

This crate contains some internal macros for the constant crate. Consider using the constant crate instead because the macros are unusable without the constant crate.

Dependencies

~1.5MB
~34K SLoC