macro_rules! macro_impl {
($d:tt, $DEC: ident, $bits: literal, $sign: ident, $name: ident) => {
#[macro_export]
#[doc = concat!("A macro to construct ", $bits, "-bit ", stringify!($sign), " [`", stringify!($DEC), "`](crate::", stringify!($DEC), ") decimal from literals in compile time.")]
#[doc = concat!("const N: ", stringify!($DEC), " = ", stringify!($name), "!(1.23456789);")]
#[doc = concat!("let num = ", stringify!($name), "!(0);")]
#[doc = concat!("const A: ", stringify!($DEC), " = ", stringify!($name), "!(5);")]
#[doc = concat!("const B: ", stringify!($DEC), " = ", stringify!($name), "!(1_000);")]
#[doc = concat!("const C: ", stringify!($DEC), " = A.div(B);")]
#[doc = concat!("assert_eq!(C, ", stringify!($name), "!(0.005));")]
#[doc = concat!("use fastnum::{", stringify!($name), ", ", stringify!($DEC), "}")]
#[doc = concat!("const N: ", stringify!($DEC), " = ", stringify!($name), "!(A1.23456789);")]
macro_rules! $name {
($d($d body:tt)*) => {{
const __CTX: $crate::decimal::Context = $crate::decimal::Context::default();
const __DECIMAL: $crate::$DEC = $crate::$DEC::parse_str(concat!($d(stringify!($d body)),*), __CTX);
__DECIMAL
}};
}
};
}
macro_impl!($, UD128, 128, unsigned, udec128);
macro_impl!($, UD256, 256, unsigned, udec256);
macro_impl!($, UD512, 512, unsigned, udec512);
macro_impl!($, UD1024, 1024, unsigned, udec1024);
macro_impl!($, D128, 128, signed, dec128);
macro_impl!($, D256, 256, signed, dec256);
macro_impl!($, D512, 512, signed, dec512);
macro_impl!($, D1024, 1024, signed, dec1024);