lilliput_core/header/
float.rs

1#[cfg(any(test, feature = "testing"))]
2use proptest::prelude::*;
3#[cfg(any(test, feature = "testing"))]
4use proptest_derive::Arbitrary;
5
6/// Header representing a floating-point number.
7#[cfg_attr(any(test, feature = "testing"), derive(Arbitrary))]
8#[derive(Copy, Clone, Eq, PartialEq, Debug)]
9pub struct FloatHeader {
10    #[cfg_attr(
11        any(test, feature = "testing"),
12        proptest(strategy = "(1..=FloatHeader::MAX_VALUE_WIDTH)")
13    )]
14    width: u8,
15}
16
17impl FloatHeader {
18    /// Creates a header from a floating-point value's byte-width.
19    pub fn new(width: u8) -> Self {
20        assert!(width >= 1);
21        assert!(width <= 8);
22
23        Self { width }
24    }
25
26    /// Returns the associated value's byte-width.
27    pub fn width(&self) -> u8 {
28        self.width
29    }
30}
31
32impl FloatHeader {
33    pub(crate) const MASK: u8 = 0b00001111;
34    pub(crate) const MAX_VALUE_WIDTH: u8 = Self::VALUE_WIDTH_BITS + 1;
35
36    pub(crate) const TYPE_BITS: u8 = 0b00001000;
37
38    pub(crate) const VALUE_WIDTH_BITS: u8 = 0b00000111;
39}
40
41#[cfg(test)]
42mod tests {
43    use proptest::prelude::*;
44    use test_log::test;
45
46    use crate::{
47        config::EncoderConfig,
48        decoder::Decoder,
49        encoder::Encoder,
50        io::{SliceReader, VecWriter},
51    };
52
53    use super::*;
54
55    proptest::proptest! {
56        #[test]
57        fn encode_decode_roundtrip(header in FloatHeader::arbitrary(), config in EncoderConfig::arbitrary()) {
58            let mut encoded: Vec<u8> = Vec::new();
59            let writer = VecWriter::new(&mut encoded);
60            let mut encoder = Encoder::new(writer, config);
61            encoder.encode_float_header(&header).unwrap();
62
63            prop_assert!(encoded.len() == 1);
64
65            let reader = SliceReader::new(&encoded);
66            let mut decoder = Decoder::from_reader(reader);
67            let decoded = decoder.decode_float_header().unwrap();
68            prop_assert_eq!(&decoded, &header);
69        }
70    }
71}