tbe/
lib.rs

1extern crate base2;
2extern crate int;
3extern crate bitrw;
4
5pub struct TbeStruct<T: Copy> {
6    k: u8,
7    u: T,
8}
9
10impl<T: Copy> TbeStruct<T> {
11    pub fn get_k(&self) -> u8 { self.k }
12    pub fn get_u(&self) -> T { self.u }
13}
14
15pub trait Tbe: int::UInt + base2::Base2 {
16    fn tbe(self) -> TbeStruct<Self> {
17        let k = self.floor_log2();
18        let ek2 = Self::exp2(k + 1);
19        TbeStruct { k: k, u: ek2 - self }
20    }
21}
22
23impl<T: int::UInt + base2::Base2> Tbe for T {}
24
25pub trait TbeRead {
26    fn read_tbe<T: int::UInt>(&mut self, tbe: TbeStruct<T>) -> std::io::Result<T>;
27}
28
29impl TbeRead for bitrw::BitRead<'_> {
30    /// ```
31    /// extern crate bitrw;
32    /// extern crate tbe;
33    /// use tbe::Tbe;
34    /// use tbe::TbeRead;
35    /// use bitrw::BitRead;
36    /// use bitrw::UseBitRead;
37    /// let v = [0b0_11_01_0_0_1_u8, 0b11_0];
38    /// let mut c = std::io::Cursor::new(&v);
39    /// let mut r = c.use_bit_read();
40    /// assert_eq!(r.read_tbe(1_u8.tbe()).unwrap(), 0);
41    /// assert_eq!(r.read_tbe(2_u8.tbe()).unwrap(), 1);
42    /// assert_eq!(r.read_tbe(2_u8.tbe()).unwrap(), 0);
43    /// assert_eq!(r.read_tbe(3_u8.tbe()).unwrap(), 0);
44    /// assert_eq!(r.read_tbe(3_u8.tbe()).unwrap(), 1);
45    /// assert_eq!(r.read_tbe(3_u8.tbe()).unwrap(), 2);
46    /// assert_eq!(r.read_tbe(4_u8.tbe()).unwrap(), 0);
47    /// assert_eq!(r.read_tbe(4_u8.tbe()).unwrap(), 3);
48    /// ```
49    fn read_tbe<T: int::UInt>(&mut self, tbe: TbeStruct<T>) -> std::io::Result<T> {
50        let v = self.read(tbe.k)?;
51        Ok(if v < tbe.u {
52            v
53        } else {
54            ((v << 1_u8) | self.read(1)?) - tbe.u
55        })
56    }
57}
58
59pub trait TbeWrite {
60    fn write_tbe<T: int::UInt>(&mut self, tbe: TbeStruct<T>, v: T) -> std::io::Result<()>;
61}
62
63impl TbeWrite for bitrw::BitWrite<'_> {
64    /// ```
65    /// extern crate bitrw;
66    /// extern crate tbe;
67    /// use tbe::Tbe;
68    /// use tbe::TbeWrite;
69    /// use bitrw::BitRead;
70    /// use bitrw::UseBitWrite;
71    /// let mut v = vec![];
72    /// {
73    ///     std::io::Cursor::new(&mut v).use_bit_write(&mut|w| {
74    ///         w.write_tbe(0_u8.tbe(), 0);
75    ///         w.write_tbe(1_u8.tbe(), 0);
76    ///         w.write_tbe(2_u8.tbe(), 1);
77    ///         w.write_tbe(2_u8.tbe(), 0);
78    ///         w.write_tbe(5_u8.tbe(), 0);
79    ///         w.write_tbe(5_u8.tbe(), 1);
80    ///         w.write_tbe(5_u8.tbe(), 2);
81    ///         w.write_tbe(5_u8.tbe(), 3);
82    ///         w.write_tbe(256_u16.tbe(), 0).unwrap();
83    ///         Ok(())
84    ///     });
85    /// }
86    /// assert_eq!(&v, &[0b10_01_00_01, 0b000_0000_011, 0b0]);
87    /// ```
88    fn write_tbe<T: int::UInt>(&mut self, tbe: TbeStruct<T>, v: T) -> std::io::Result<()> {
89        if v < tbe.u {
90            self.write(v, tbe.k)
91        } else {
92            let x = v + tbe.u;
93            self.write(x >> 1_u8, tbe.k)?;
94            self.write(x, 1)
95        }
96    }
97}