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}