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
10KB
233 lines
constant
: Constant, compile-time evaluation tools for Rust 🦀
The constant
crate aims to provide tools for safely working around the limits imposed by constant evaluation in Rust.
Features
- Create constant default implementations
- Created nested constant default implementations
- Full support for generics, lifetimes and generics in
Constdef
impls - Almost all types provided by the
std
are supported by this crate. If you need any other external type, just open an issue and ask! - More coming soon!
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