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 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 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}