#![allow(dead_code)]
pub trait UnumEnv {
fn e_size_size() -> usize;
fn f_size_size() -> usize;
fn e_size_max() -> usize;
fn f_size_max() -> usize;
fn utag_size() -> usize;
fn max_ubits() -> usize;
fn ubit_mask() -> usize;
fn f_size_mask() -> usize;
fn e_size_mask() -> usize;
fn ef_size_mask() -> usize;
fn utag_mask() -> usize;
fn ulpu() -> usize;
fn small_subnormal_u() -> usize;
fn small_normal_u() -> usize;
fn sign_big_u() -> usize;
fn pos_inf_u() -> usize;
fn neg_inf_u() -> usize;
fn max_real_u() -> usize;
fn min_real_u() -> usize;
fn neg_big_u() -> usize;
fn q_na_nu() -> usize;
fn s_na_nu() -> usize;
}
macro_rules! ImplUnumEnv {
($T:ident, $E:expr, $F:expr) => {
pub struct $T;
impl UnumEnv for $T {
#[inline(always)]
fn e_size_size() -> usize { $E }
#[inline(always)]
fn f_size_size() -> usize { $F }
#[inline(always)]
fn e_size_max() -> usize { 1 << $E }
#[inline(always)]
fn f_size_max() -> usize { 1 << $F }
#[inline(always)]
fn utag_size() -> usize { 1 + $E + $F }
#[inline(always)]
fn max_ubits() -> usize {
1 + $T::e_size_size() + $T::f_size_size() + $T::utag_size()
}
#[inline(always)]
fn ubit_mask() -> usize { 1 << ($T::utag_size() - 1) }
#[inline(always)]
fn f_size_mask() -> usize { (1 << ($T::f_size_size()) - 1) }
#[inline(always)]
fn e_size_mask() -> usize { ($T::ubit_mask() - 1) - $T::f_size_mask() }
#[inline(always)]
fn ef_size_mask() -> usize { $T::e_size_mask() | $T::f_size_mask() }
#[inline(always)]
fn utag_mask() -> usize { $T::ubit_mask() | $T::ef_size_mask() }
#[inline(always)]
fn ulpu() -> usize { 1 << $T::utag_size() }
#[inline(always)]
fn small_subnormal_u() -> usize { $T::ef_size_mask() + $T::ulpu() }
#[inline(always)]
fn small_normal_u() -> usize {
$T::ef_size_mask() + (1 << ($T::max_ubits() - 1 - $T::e_size_max()))
}
#[inline(always)]
fn sign_big_u() -> usize { 1 << ($T::max_ubits() - 1) }
#[inline(always)]
fn pos_inf_u() -> usize { $T::sign_big_u() - 1 - $T::ubit_mask() }
#[inline(always)]
fn neg_inf_u() -> usize { $T::pos_inf_u() + $T::sign_big_u() }
#[inline(always)]
fn max_real_u() -> usize { $T::pos_inf_u() - $T::ulpu() }
#[inline(always)]
fn min_real_u() -> usize { $T::max_real_u() + $T::sign_big_u() }
#[inline(always)]
fn neg_big_u() -> usize { $T::neg_inf_u() - $T::ulpu() }
#[inline(always)]
fn q_na_nu() -> usize { $T::pos_inf_u() + $T::ubit_mask() }
#[inline(always)]
fn s_na_nu() -> usize { $T::neg_inf_u() + $T::ubit_mask() }
}
};
}
ImplUnumEnv!(Exp3Frac4, 3, 4);
ImplUnumEnv!(Exp4Frac4, 4, 4);
ImplUnumEnv!(Exp4Frac5, 4, 5);