Skip to main content

relp_num/rational/small/
size.rs

1//! # Measuring a fixed width rational
2use crate::traits::EncodingSize;
3use crate::{
4    Rational8, Rational16, Rational32, Rational64, Rational128, RationalUsize,
5};
6
7macro_rules! size_small {
8    ($($name:ty => $unsigned:ty),+ $(,)?) => {$(
9        impl EncodingSize for $name {
10            fn numerator_bits(&self) -> u32 {
11                <$unsigned>::BITS - self.numerator.leading_zeros()
12            }
13
14            fn denominator_bits(&self) -> u32 {
15                <$unsigned>::BITS - self.denominator.leading_zeros()
16            }
17        }
18    )+}
19}
20
21size_small!(
22    Rational8 => u8,
23    Rational16 => u16,
24    Rational32 => u32,
25    Rational64 => u64,
26    Rational128 => u128,
27    RationalUsize => usize,
28);
29
30#[cfg(test)]
31mod test {
32    use crate::{EncodingSize, R8, R16};
33
34    #[test]
35    fn the_bits_are_counted_over_the_magnitude() {
36        assert_eq!(R8!(0).numerator_bits(), 0);
37        assert_eq!(R8!(0).denominator_bits(), 1);
38        assert_eq!(R8!(-1).encoding_bits(), 2);
39        assert_eq!(R8!(255).numerator_bits(), 8);
40        assert_eq!(R16!(256).numerator_bits(), 9);
41        assert_eq!(R8!(1, 3).denominator_bits(), 2);
42    }
43}