#![deny(unsafe_code)]
mod dispatch;
pub mod nat_reify;
pub use dispatch::{reify_const, HasModulus, Modular};
pub use nat_reify::{
reify_nat, reify_nat2, reify_nat2_fn, reify_nat_fn, FnNat, FnNat2, Nat2Callback, NatCallback,
};
pub const MAX_REIFY_VALUE: u64 = 255;
#[macro_export]
macro_rules! reify {
($val:expr, $f:expr) => {{
$crate::reify_const($val, $f)
}};
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn reify_zero() {
let result = reify_const(0, |m| m.modulus());
assert_eq!(result, 0);
}
#[test]
fn reify_max() {
let result = reify_const(255, |m| m.modulus());
assert_eq!(result, 255);
}
#[test]
fn reify_arbitrary() {
for v in [1, 17, 42, 100, 200, 255] {
let result = reify_const(v, |m| m.modulus());
assert_eq!(result, v);
}
}
#[test]
#[should_panic(expected = "out of supported range")]
fn reify_out_of_range() {
reify_const(256, |m| m.modulus());
}
#[test]
fn reify_macro() {
reify!(42u64, |m: &dyn HasModulus| { assert_eq!(m.modulus(), 42) });
}
#[test]
fn reify_returns_value() {
let doubled = reify_const(21, |m| m.modulus() * 2);
assert_eq!(doubled, 42);
}
#[test]
fn reify_all_values() {
for v in 0..=255u64 {
assert_eq!(reify_const(v, |m| m.modulus()), v);
}
}
}