Skip to main content

compactly/v2/
bools.rs

1use crate::Sorted;
2
3use super::Encode;
4use super::{bit_context::BitContext, EncodingStrategy};
5
6impl Encode for bool {
7    type Context = BitContext;
8    #[inline]
9    fn encode<E: super::EntropyCoder>(&self, writer: &mut E, ctx: &mut Self::Context) {
10        // println!("Encoding {self:?}");
11        writer.encode_bit(ctx.probability(), *self);
12        *ctx = ctx.adapt(*self);
13    }
14    #[inline]
15    fn decode<D: super::EntropyDecoder>(
16        reader: &mut D,
17        ctx: &mut Self::Context,
18    ) -> Result<Self, std::io::Error> {
19        let b = reader.decode_bit(ctx)?;
20        // println!("Decoding {b:?}");
21        Ok(b)
22    }
23}
24
25impl EncodingStrategy<bool> for Sorted {
26    type Context = BitContext;
27    fn decode<D: super::EntropyDecoder>(
28        reader: &mut D,
29        ctx: &mut Self::Context,
30    ) -> Result<bool, std::io::Error> {
31        bool::decode(reader, ctx)
32    }
33    fn encode<E: super::EntropyCoder>(value: &bool, writer: &mut E, ctx: &mut Self::Context) {
34        value.encode(writer, ctx)
35    }
36}
37
38#[test]
39fn size() {
40    use super::assert_bits;
41    assert_bits!(true, 1);
42    assert_bits!(false, 1);
43    assert_bits!([false; 128], 7);
44    assert_bits!([true; 2], 1);
45    assert_bits!([true; 3], 1);
46    assert_bits!([true; 16], 3);
47    assert_bits!([true; 64], 5);
48    assert_bits!([false, true], 3);
49}
50
51#[test]
52fn millibits_required() {
53    use super::Millibits;
54    let mut bc = BitContext::default();
55    assert_eq!(bc.probability().as_f64(), 0.5);
56
57    assert_eq!(false.millibits(), Millibits::bits(1));
58    assert_eq!(true.millibits(), Millibits::bits(1));
59
60    macro_rules! assert_millibits {
61        ($bit:literal, $ctx:expr, $expected:expr) => {{
62            let mut mb = Millibits::new(0);
63            $bit.encode(&mut mb, $ctx);
64            assert_eq!(mb, $expected);
65        }};
66    }
67
68    assert_millibits!(true, &mut bc, Millibits::bits(1));
69
70    assert_eq!(bc, BitContext::True1False0);
71    assert!(bc.probability().as_f64() < 0.5);
72
73    assert_millibits!(true, &mut BitContext::True1False0, Millibits::new(582));
74    assert_millibits!(false, &mut BitContext::True1False0, Millibits::new(1590));
75
76    assert_millibits!(true, &mut bc, Millibits::new(582));
77    assert_millibits!(true, &mut bc, Millibits::new(415));
78    assert_millibits!(false, &mut bc, Millibits::new(2327));
79    assert_millibits!(false, &mut bc, Millibits::new(1590));
80    assert_millibits!(false, &mut bc, Millibits::new(1218));
81    assert_millibits!(false, &mut bc, Millibits::new(1000));
82}