grib 0.15.4

GRIB format parser & writer for Rust
Documentation
pub(crate) trait BitsRequired {
    fn bits_required(&self) -> u8;
}

macro_rules! add_impl_for_integer_types {
    ($($ty:ty,)*) => ($(
        impl BitsRequired for $ty {
            fn bits_required(&self) -> u8 {
                (Self::BITS - self.leading_zeros()) as u8
            }
        }
    )*);
}

add_impl_for_integer_types![u8, u32, usize,];

impl BitsRequired for f64 {
    fn bits_required(&self) -> u8 {
        (self + 1.).log2().ceil() as u8
    }
}

#[cfg(test)]
mod tests {
    use crate::encoder::helpers::BitsRequired;

    #[test]
    fn bits_calculation() {
        assert_eq!(0_u32.bits_required(), 0);
        assert_eq!(1_u32.bits_required(), 1);
        assert_eq!(2_u32.bits_required(), 2);
        assert_eq!(3_u32.bits_required(), 2);
        assert_eq!(4_u32.bits_required(), 3);
        assert_eq!(8_u32.bits_required(), 4);

        assert_eq!(0_f64.bits_required(), 0);
        assert_eq!(1_f64.bits_required(), 1);
        assert_eq!(2_f64.bits_required(), 2);
        assert_eq!(3_f64.bits_required(), 2);
        assert_eq!(4_f64.bits_required(), 3);
        assert_eq!(8_f64.bits_required(), 4);
    }
}