unums 0.0.1

A crate for using Unums
Documentation
#![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);