bit_cursor/
bit_read_exts.rs

1use std::ops::{BitOrAssign, ShlAssign};
2
3use nsw_types::{num_traits::ConstZero, *};
4
5use crate::{bit_read::BitRead, byte_order::ByteOrder};
6
7fn bit_read_exts_helper<
8    T: ConstZero + ShlAssign<u32> + BitOrAssign + From<u1>,
9    const N: usize,
10    U: BitRead + ?Sized,
11>(
12    buf: &mut U,
13) -> std::io::Result<T> {
14    // TODO: it'd be nice not to do this bit-by-bit.  I think once we get the from_xxx_bytes methods
15    // in nsw_types those could work here.
16    let mut read_buf = [u1::ZERO; N];
17    buf.read_bits_exact(&mut read_buf)?;
18    let mut val = T::ZERO;
19    for bit in read_buf.iter() {
20        val <<= 1;
21        val |= (*bit).into();
22    }
23    Ok(val)
24}
25
26pub trait BitReadExts: BitRead {
27    fn read_bool(&mut self) -> std::io::Result<bool> {
28        self.read_u1().map(|v| v.into())
29    }
30
31    fn read_u1(&mut self) -> std::io::Result<u1> {
32        bit_read_exts_helper::<u1, 1, Self>(self)
33    }
34
35    fn read_u2(&mut self) -> std::io::Result<u2> {
36        bit_read_exts_helper::<u2, 2, Self>(self)
37    }
38
39    fn read_u3(&mut self) -> std::io::Result<u3> {
40        bit_read_exts_helper::<u3, 3, Self>(self)
41    }
42
43    fn read_u4(&mut self) -> std::io::Result<u4> {
44        bit_read_exts_helper::<u4, 4, Self>(self)
45    }
46
47    fn read_u5(&mut self) -> std::io::Result<u5> {
48        bit_read_exts_helper::<u5, 5, Self>(self)
49    }
50
51    fn read_u6(&mut self) -> std::io::Result<u6> {
52        bit_read_exts_helper::<u6, 6, Self>(self)
53    }
54
55    fn read_u7(&mut self) -> std::io::Result<u7> {
56        bit_read_exts_helper::<u7, 7, Self>(self)
57    }
58
59    fn read_u8(&mut self) -> std::io::Result<u8> {
60        bit_read_exts_helper::<u8, 8, Self>(self)
61    }
62
63    fn read_u9<T: ByteOrder>(&mut self) -> std::io::Result<u9> {
64        let mut buf = [u1::new(0); 9];
65        self.read_bits_exact(&mut buf)?;
66        Ok(<T>::read_u9(&buf))
67    }
68
69    fn read_u10<T: ByteOrder>(&mut self) -> std::io::Result<u10> {
70        let mut buf = [u1::new(0); 10];
71        self.read_bits_exact(&mut buf)?;
72        Ok(<T>::read_u10(&buf))
73    }
74
75    fn read_u11<T: ByteOrder>(&mut self) -> std::io::Result<u11> {
76        let mut buf = [u1::new(0); 11];
77        self.read_bits_exact(&mut buf)?;
78        Ok(<T>::read_u11(&buf))
79    }
80
81    fn read_u12<T: ByteOrder>(&mut self) -> std::io::Result<u12> {
82        let mut buf = [u1::new(0); 12];
83        self.read_bits_exact(&mut buf)?;
84        Ok(<T>::read_u12(&buf))
85    }
86
87    fn read_u13<T: ByteOrder>(&mut self) -> std::io::Result<u13> {
88        let mut buf = [u1::new(0); 13];
89        self.read_bits_exact(&mut buf)?;
90        Ok(<T>::read_u13(&buf))
91    }
92
93    fn read_u14<T: ByteOrder>(&mut self) -> std::io::Result<u14> {
94        let mut buf = [u1::new(0); 14];
95        self.read_bits_exact(&mut buf)?;
96        Ok(<T>::read_u14(&buf))
97    }
98
99    fn read_u15<T: ByteOrder>(&mut self) -> std::io::Result<u15> {
100        let mut buf = [u1::new(0); 15];
101        self.read_bits_exact(&mut buf)?;
102        Ok(<T>::read_u15(&buf))
103    }
104
105    fn read_u16<T: ByteOrder>(&mut self) -> std::io::Result<u16> {
106        let mut buf = [u1::new(0); 16];
107        self.read_bits_exact(&mut buf)?;
108        Ok(<T>::read_u16(&buf))
109    }
110
111    fn read_u17<T: ByteOrder>(&mut self) -> std::io::Result<u17> {
112        let mut buf = [u1::new(0); 17];
113        self.read_bits_exact(&mut buf)?;
114        Ok(<T>::read_u17(&buf))
115    }
116
117    fn read_u18<T: ByteOrder>(&mut self) -> std::io::Result<u18> {
118        let mut buf = [u1::new(0); 18];
119        self.read_bits_exact(&mut buf)?;
120        Ok(<T>::read_u18(&buf))
121    }
122
123    fn read_u19<T: ByteOrder>(&mut self) -> std::io::Result<u19> {
124        let mut buf = [u1::new(0); 19];
125        self.read_bits_exact(&mut buf)?;
126        Ok(<T>::read_u19(&buf))
127    }
128
129    fn read_u20<T: ByteOrder>(&mut self) -> std::io::Result<u20> {
130        let mut buf = [u1::new(0); 20];
131        self.read_bits_exact(&mut buf)?;
132        Ok(<T>::read_u20(&buf))
133    }
134
135    fn read_u21<T: ByteOrder>(&mut self) -> std::io::Result<u21> {
136        let mut buf = [u1::new(0); 21];
137        self.read_bits_exact(&mut buf)?;
138        Ok(<T>::read_u21(&buf))
139    }
140
141    fn read_u22<T: ByteOrder>(&mut self) -> std::io::Result<u22> {
142        let mut buf = [u1::new(0); 22];
143        self.read_bits_exact(&mut buf)?;
144        Ok(<T>::read_u22(&buf))
145    }
146
147    fn read_u23<T: ByteOrder>(&mut self) -> std::io::Result<u23> {
148        let mut buf = [u1::new(0); 23];
149        self.read_bits_exact(&mut buf)?;
150        Ok(<T>::read_u23(&buf))
151    }
152
153    fn read_u24<T: ByteOrder>(&mut self) -> std::io::Result<u24> {
154        let mut buf = [u1::new(0); 24];
155        self.read_bits_exact(&mut buf)?;
156        Ok(<T>::read_u24(&buf))
157    }
158
159    fn read_u25<T: ByteOrder>(&mut self) -> std::io::Result<u25> {
160        let mut buf = [u1::new(0); 25];
161        self.read_bits_exact(&mut buf)?;
162        Ok(<T>::read_u25(&buf))
163    }
164
165    fn read_u26<T: ByteOrder>(&mut self) -> std::io::Result<u26> {
166        let mut buf = [u1::new(0); 26];
167        self.read_bits_exact(&mut buf)?;
168        Ok(<T>::read_u26(&buf))
169    }
170
171    fn read_u27<T: ByteOrder>(&mut self) -> std::io::Result<u27> {
172        let mut buf = [u1::new(0); 27];
173        self.read_bits_exact(&mut buf)?;
174        Ok(<T>::read_u27(&buf))
175    }
176
177    fn read_u28<T: ByteOrder>(&mut self) -> std::io::Result<u28> {
178        let mut buf = [u1::new(0); 28];
179        self.read_bits_exact(&mut buf)?;
180        Ok(<T>::read_u28(&buf))
181    }
182
183    fn read_u29<T: ByteOrder>(&mut self) -> std::io::Result<u29> {
184        let mut buf = [u1::new(0); 29];
185        self.read_bits_exact(&mut buf)?;
186        Ok(<T>::read_u29(&buf))
187    }
188
189    fn read_u30<T: ByteOrder>(&mut self) -> std::io::Result<u30> {
190        let mut buf = [u1::new(0); 30];
191        self.read_bits_exact(&mut buf)?;
192        Ok(<T>::read_u30(&buf))
193    }
194
195    fn read_u31<T: ByteOrder>(&mut self) -> std::io::Result<u31> {
196        let mut buf = [u1::new(0); 31];
197        self.read_bits_exact(&mut buf)?;
198        Ok(<T>::read_u31(&buf))
199    }
200
201    fn read_u32<T: ByteOrder>(&mut self) -> std::io::Result<u32> {
202        let mut buf = [u1::new(0); 32];
203        self.read_bits_exact(&mut buf)?;
204        Ok(<T>::read_u32(&buf))
205    }
206}
207
208impl<T> BitReadExts for T where T: BitRead {}
209
210#[cfg(test)]
211mod test {
212    use bitvec::{order::Msb0, vec::BitVec};
213
214    use super::BitReadExts;
215    use crate::{bit_cursor::BitCursor, byte_order::NetworkOrder};
216
217    #[test]
218    fn test_read() {
219        let data = BitVec::<u8, Msb0>::from_slice(&42u32.to_be_bytes());
220        let mut cursor = BitCursor::new(data);
221
222        assert_eq!(cursor.read_u32::<NetworkOrder>().unwrap(), 42);
223    }
224}