bit_cursor/
bit_read_exts.rs1use 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 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}