/rust/registry/src/index.crates.io-1949cf8c6b5b557f/bitstream-io-4.10.0/src/read.rs
Line | Count | Source |
1 | | // Copyright 2017 Brian Langenberger |
2 | | // |
3 | | // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or |
4 | | // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license |
5 | | // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your |
6 | | // option. This file may not be copied, modified, or distributed |
7 | | // except according to those terms. |
8 | | |
9 | | //! Traits and implementations for reading bits from a stream. |
10 | | |
11 | | #![warn(missing_docs)] |
12 | | |
13 | | #[cfg(not(feature = "std"))] |
14 | | use no_std_io2::io; |
15 | | |
16 | | #[cfg(feature = "alloc")] |
17 | | use alloc::{vec, vec::Vec}; |
18 | | #[cfg(feature = "std")] |
19 | | use std::io; |
20 | | |
21 | | use super::{ |
22 | | BitCount, CheckablePrimitive, Endianness, Integer, PhantomData, Primitive, SignedBitCount, |
23 | | SignedInteger, UnsignedInteger, VBRInteger, |
24 | | }; |
25 | | |
26 | | use core::convert::TryInto; |
27 | | |
28 | | /// An error returned if performing VBR read overflows |
29 | | #[derive(Copy, Clone, Debug)] |
30 | | pub(crate) struct VariableWidthOverflow; |
31 | | |
32 | | impl core::fmt::Display for VariableWidthOverflow { |
33 | 0 | fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { |
34 | 0 | "variable bit rate overflowed".fmt(f) |
35 | 0 | } |
36 | | } |
37 | | |
38 | | impl core::error::Error for VariableWidthOverflow {} |
39 | | |
40 | | impl From<VariableWidthOverflow> for io::Error { |
41 | 0 | fn from(VariableWidthOverflow: VariableWidthOverflow) -> Self { |
42 | 0 | io::Error::new( |
43 | | #[cfg(feature = "std")] |
44 | | { |
45 | 0 | io::ErrorKind::StorageFull |
46 | | }, |
47 | | #[cfg(not(feature = "std"))] |
48 | | { |
49 | | io::ErrorKind::Other |
50 | | }, |
51 | | "variable bit rate overflow", |
52 | | ) |
53 | 0 | } |
54 | | } |
55 | | |
56 | | /// A trait for anything that can read a variable number of |
57 | | /// potentially un-aligned values from an input stream |
58 | | pub trait BitRead { |
59 | | /// Reads a single bit from the stream. |
60 | | /// `true` indicates 1, `false` indicates 0 |
61 | | /// |
62 | | /// # Errors |
63 | | /// |
64 | | /// Passes along any I/O error from the underlying stream. |
65 | | /// |
66 | | /// # Examples |
67 | | /// ``` |
68 | | /// use bitstream_io::{BitReader, BitRead, BigEndian}; |
69 | | /// |
70 | | /// let bytes: &[u8] = &[0b1000_1110]; |
71 | | /// let mut r = BitReader::endian(bytes, BigEndian); |
72 | | /// assert_eq!(r.read_bit().unwrap(), true); |
73 | | /// assert_eq!(r.read_bit().unwrap(), false); |
74 | | /// assert_eq!(r.read_bit().unwrap(), false); |
75 | | /// assert_eq!(r.read_bit().unwrap(), false); |
76 | | /// assert_eq!(r.read_bit().unwrap(), true); |
77 | | /// assert_eq!(r.read_bit().unwrap(), true); |
78 | | /// assert_eq!(r.read_bit().unwrap(), true); |
79 | | /// assert_eq!(r.read_bit().unwrap(), false); |
80 | | /// assert!(r.read_bit().is_err()); // no more bits to read |
81 | | /// ``` |
82 | | /// |
83 | | /// ``` |
84 | | /// use bitstream_io::{BitReader, BitRead, LittleEndian}; |
85 | | /// |
86 | | /// let bytes: &[u8] = &[0b1000_1110]; |
87 | | /// let mut r = BitReader::endian(bytes, LittleEndian); |
88 | | /// assert_eq!(r.read_bit().unwrap(), false); |
89 | | /// assert_eq!(r.read_bit().unwrap(), true); |
90 | | /// assert_eq!(r.read_bit().unwrap(), true); |
91 | | /// assert_eq!(r.read_bit().unwrap(), true); |
92 | | /// assert_eq!(r.read_bit().unwrap(), false); |
93 | | /// assert_eq!(r.read_bit().unwrap(), false); |
94 | | /// assert_eq!(r.read_bit().unwrap(), false); |
95 | | /// assert_eq!(r.read_bit().unwrap(), true); |
96 | | /// assert!(r.read_bit().is_err()); // no more bits to read |
97 | | /// ``` |
98 | 0 | fn read_bit(&mut self) -> io::Result<bool> { |
99 | 0 | self.read_unsigned::<1, u8>().map(|b| b == 1) |
100 | 0 | } |
101 | | |
102 | | /// Reads a signed or unsigned value from the stream with |
103 | | /// the given constant number of bits. |
104 | | /// |
105 | | /// # Errors |
106 | | /// |
107 | | /// Passes along any I/O error from the underlying stream. |
108 | | /// A compile-time error occurs if the given number of bits |
109 | | /// is larger than the output type. |
110 | | /// |
111 | | /// # Examples |
112 | | /// ``` |
113 | | /// use bitstream_io::{BitReader, BitRead, BigEndian}; |
114 | | /// |
115 | | /// let bytes: &[u8] = &[0b0001_1111, 0b1011_11_00]; |
116 | | /// let mut r = BitReader::endian(bytes, BigEndian); |
117 | | /// // reading unsigned value is ok |
118 | | /// assert_eq!(r.read::<4, u8>().unwrap(), 1); |
119 | | /// // reading signed value is also ok |
120 | | /// assert_eq!(r.read::<4, i8>().unwrap(), -1); |
121 | | /// // reading an array of bits is ok too |
122 | | /// assert_eq!(r.read::<1, [bool; 4]>().unwrap(), [true, false, true, true]); |
123 | | /// // reading an array of any Integer type is ok |
124 | | /// assert_eq!(r.read::<2, [u8; 2]>().unwrap(), [0b11, 0b00]); |
125 | | /// // reading more bytes than we have is an error |
126 | | /// assert!(r.read::<4, u8>().is_err()); |
127 | | /// ``` |
128 | | /// |
129 | | /// ```rust,compile_fail |
130 | | /// use bitstream_io::{BitReader, BitRead, BigEndian}; |
131 | | /// |
132 | | /// let bytes: &[u8] = &[0b0001_1111, 0, 0]; |
133 | | /// let mut r = BitReader::endian(bytes, BigEndian); |
134 | | /// // reading 9 bits to a u8 is a compile-time error |
135 | | /// r.read::<9, u8>(); |
136 | | /// ``` |
137 | | #[inline] |
138 | 0 | fn read<const BITS: u32, I>(&mut self) -> io::Result<I> |
139 | 0 | where |
140 | 0 | I: Integer, |
141 | | { |
142 | 0 | I::read::<BITS, _>(self) |
143 | 0 | } |
144 | | |
145 | | /// Reads a signed or unsigned value from the stream with |
146 | | /// the given variable number of bits. |
147 | | /// |
148 | | /// # Errors |
149 | | /// |
150 | | /// Passes along any I/O error from the underlying stream. |
151 | | /// Also returns an error if the output type is too small |
152 | | /// to hold the requested number of bits. |
153 | | /// |
154 | | /// # Examples |
155 | | /// ``` |
156 | | /// use bitstream_io::{BitReader, BitRead, BigEndian}; |
157 | | /// let bytes: &[u8] = &[0b0001_1111]; |
158 | | /// let mut r = BitReader::endian(bytes, BigEndian); |
159 | | /// // reading unsigned value is ok |
160 | | /// assert_eq!(r.read_var::<u8>(4).unwrap(), 1); |
161 | | /// // reading signed value is also ok |
162 | | /// assert_eq!(r.read_var::<i8>(4).unwrap(), -1); |
163 | | /// // reading more bytes than we have is an error |
164 | | /// assert!(r.read_var::<u8>(4).is_err()); |
165 | | /// ``` |
166 | | /// |
167 | | /// ``` |
168 | | /// use bitstream_io::{BitReader, BitRead, BigEndian}; |
169 | | /// let bytes: &[u8] = &[0, 0, 0, 0, 0]; |
170 | | /// let mut r = BitReader::endian(bytes, BigEndian); |
171 | | /// // reading 9 bits to a u8 is a runtime error |
172 | | /// // no matter how much data is left |
173 | | /// assert!(r.read_var::<u8>(9).is_err()); |
174 | | /// ``` |
175 | | #[inline] |
176 | 0 | fn read_var<I>(&mut self, bits: u32) -> io::Result<I> |
177 | 0 | where |
178 | 0 | I: Integer + Sized, |
179 | | { |
180 | 0 | I::read_var(self, BitCount::unknown(bits)) |
181 | 0 | } |
182 | | |
183 | | /// Given a desired maximum value for a bit count, |
184 | | /// reads the necessary bits to fill up to that amount. |
185 | | /// |
186 | | /// For example, if the maximum bit count is 15 - or `0b1111` - |
187 | | /// reads a 4-bit unsigned value from the stream and returns a [`BitCount`] |
188 | | /// which can be used in subsequent reads. |
189 | | /// |
190 | | /// Note that `MAX` must be greater than 0, and `MAX + 1` must be |
191 | | /// an exact power of two. |
192 | | /// |
193 | | /// # Errors |
194 | | /// |
195 | | /// Passes along an I/O error from the underlying stream. |
196 | | /// |
197 | | /// # Examples |
198 | | /// |
199 | | /// ``` |
200 | | /// use bitstream_io::{BigEndian, BitReader, BitRead}; |
201 | | /// |
202 | | /// let bytes: &[u8] = &[0b100_11110]; |
203 | | /// let mut r = BitReader::endian(bytes, BigEndian); |
204 | | /// let count = r.read::<3, u32>().unwrap(); |
205 | | /// assert_eq!(count, 4); // reads 0b100 - or 4 |
206 | | /// // may need to verify count is not larger than u8 at runtime |
207 | | /// assert_eq!(r.read_var::<u8>(count).unwrap(), 0b1111); |
208 | | /// ``` |
209 | | /// |
210 | | /// ``` |
211 | | /// use bitstream_io::{BigEndian, BitReader, BitRead, BitCount}; |
212 | | /// |
213 | | /// let bytes: &[u8] = &[0b100_11110]; |
214 | | /// let mut r = BitReader::endian(bytes, BigEndian); |
215 | | /// let count = r.read_count::<0b111>().unwrap(); |
216 | | /// assert_eq!(count, BitCount::new::<4>()); // reads 0b100 - or 4 |
217 | | /// // maximum size of bit count is known to be 7 at compile-time, |
218 | | /// // so no runtime check needed to know 7 bits is not larger than a u8 |
219 | | /// assert_eq!(r.read_counted::<0b111, u8>(count).unwrap(), 0b1111); |
220 | | /// ``` |
221 | | /// |
222 | | /// ```rust,compile_fail |
223 | | /// use bitstream_io::{BigEndian, BitReader, BitRead}; |
224 | | /// |
225 | | /// let bytes: &[u8] = &[0b100_11110]; |
226 | | /// let mut r = BitReader::endian(bytes, BigEndian); |
227 | | /// // maximum bit count is 6 (0b110), so we need to read 3 bits |
228 | | /// // but no idea what to do if a value of 7 (0b111) is read, |
229 | | /// // so this does not compile at all |
230 | | /// let count = r.read_count::<0b110>(); |
231 | | /// ``` |
232 | 0 | fn read_count<const MAX: u32>(&mut self) -> io::Result<BitCount<MAX>> { |
233 | | const { |
234 | | assert!(MAX > 0, "MAX value must be > 0"); |
235 | | assert!( |
236 | | MAX == u32::MAX || (MAX + 1).is_power_of_two(), |
237 | | "MAX should fill some whole number of bits ('0b111', '0b1111', etc.)" |
238 | | ) |
239 | | } |
240 | | |
241 | 0 | self.read_unsigned_var(if MAX < u32::MAX { |
242 | 0 | (MAX + 1).ilog2() |
243 | | } else { |
244 | 0 | 32 |
245 | | }) |
246 | 0 | .map(|bits| BitCount { bits }) |
247 | 0 | } |
248 | | |
249 | | /// Reads a signed or unsigned value from the stream with |
250 | | /// the given number of bits. |
251 | | /// |
252 | | /// # Errors |
253 | | /// |
254 | | /// Passes along any I/O error from the underlying stream. |
255 | | /// Also returns an error if the output type is too small |
256 | | /// to hold the requested number of bits. |
257 | | /// |
258 | | /// # Examples |
259 | | /// ``` |
260 | | /// use bitstream_io::{BitReader, BitRead, BigEndian, BitCount}; |
261 | | /// |
262 | | /// let bytes: &[u8] = &[0b1111_0000]; |
263 | | /// let mut r = BitReader::endian(bytes, BigEndian); |
264 | | /// // reading 4 bits with a maximum of 4 will fit into a u8 |
265 | | /// // so no runtime check needed |
266 | | /// assert_eq!(r.read_counted::<4, u8>(BitCount::new::<4>()).unwrap(), 0b1111); |
267 | | /// // reading 4 bits with a maximum of 64 might not fit into a u8 |
268 | | /// // so we need to verify this at runtime |
269 | | /// assert_eq!(r.read_counted::<64, u8>(BitCount::new::<4>()).unwrap(), 0b0000); |
270 | | /// ``` |
271 | | #[inline(always)] |
272 | 0 | fn read_counted<const MAX: u32, I>(&mut self, bits: BitCount<MAX>) -> io::Result<I> |
273 | 0 | where |
274 | 0 | I: Integer + Sized, |
275 | | { |
276 | 0 | I::read_var(self, bits) |
277 | 0 | } |
278 | | |
279 | | /// Reads an unsigned value from the stream with |
280 | | /// the given constant number of bits. |
281 | | /// |
282 | | /// # Errors |
283 | | /// |
284 | | /// Passes along any I/O error from the underlying stream. |
285 | | /// A compile-time error occurs if the given number of bits |
286 | | /// is larger than the output type. |
287 | | /// |
288 | | /// # Examples |
289 | | /// ``` |
290 | | /// use bitstream_io::{BigEndian, BitReader, BitRead}; |
291 | | /// let data: &[u8] = &[0b1_01_10111]; |
292 | | /// let mut reader = BitReader::endian(data, BigEndian); |
293 | | /// assert_eq!(reader.read_unsigned::<1, u8>().unwrap(), 0b1); |
294 | | /// assert_eq!(reader.read_unsigned::<2, u8>().unwrap(), 0b01); |
295 | | /// assert_eq!(reader.read_unsigned::<5, u8>().unwrap(), 0b10111); |
296 | | /// ``` |
297 | | /// |
298 | | /// ``` |
299 | | /// use bitstream_io::{LittleEndian, BitReader, BitRead}; |
300 | | /// let data: &[u8] = &[0b10110_11_1]; |
301 | | /// let mut reader = BitReader::endian(data, LittleEndian); |
302 | | /// assert_eq!(reader.read_unsigned::<1, u8>().unwrap(), 0b1); |
303 | | /// assert_eq!(reader.read_unsigned::<2, u8>().unwrap(), 0b11); |
304 | | /// assert_eq!(reader.read_unsigned::<5, u8>().unwrap(), 0b10110); |
305 | | /// ``` |
306 | | /// |
307 | | /// ```rust,compile_fail |
308 | | /// use bitstream_io::{BigEndian, BitReader, BitRead}; |
309 | | /// let data: &[u8] = &[0, 0, 0, 0, 0]; |
310 | | /// let mut reader = BitReader::endian(data, BigEndian); |
311 | | /// // doesn't compile at all |
312 | | /// reader.read_unsigned::<9, u8>(); // can't read 9 bits to u8 |
313 | | /// ``` |
314 | 0 | fn read_unsigned<const BITS: u32, U>(&mut self) -> io::Result<U> |
315 | 0 | where |
316 | 0 | U: UnsignedInteger, |
317 | | { |
318 | 0 | self.read_unsigned_var(BITS) |
319 | 0 | } |
320 | | |
321 | | /// Reads an unsigned value from the stream with |
322 | | /// the given number of bits. |
323 | | /// |
324 | | /// # Errors |
325 | | /// |
326 | | /// Passes along any I/O error from the underlying stream. |
327 | | /// Also returns an error if the output type is too small |
328 | | /// to hold the requested number of bits. |
329 | | /// |
330 | | /// # Examples |
331 | | /// ``` |
332 | | /// use bitstream_io::{BigEndian, BitReader, BitRead}; |
333 | | /// let data: &[u8] = &[0b1_01_10111]; |
334 | | /// let mut reader = BitReader::endian(data, BigEndian); |
335 | | /// assert_eq!(reader.read_unsigned_var::<u8>(1).unwrap(), 0b1); |
336 | | /// assert_eq!(reader.read_unsigned_var::<u8>(2).unwrap(), 0b01); |
337 | | /// assert_eq!(reader.read_unsigned_var::<u8>(5).unwrap(), 0b10111); |
338 | | /// ``` |
339 | | /// |
340 | | /// ``` |
341 | | /// use bitstream_io::{LittleEndian, BitReader, BitRead}; |
342 | | /// let data: &[u8] = &[0b10110_11_1]; |
343 | | /// let mut reader = BitReader::endian(data, LittleEndian); |
344 | | /// assert_eq!(reader.read_unsigned_var::<u8>(1).unwrap(), 0b1); |
345 | | /// assert_eq!(reader.read_unsigned_var::<u8>(2).unwrap(), 0b11); |
346 | | /// assert_eq!(reader.read_unsigned_var::<u8>(5).unwrap(), 0b10110); |
347 | | /// ``` |
348 | | /// |
349 | | /// ``` |
350 | | /// use bitstream_io::{BigEndian, BitReader, BitRead}; |
351 | | /// let data: &[u8] = &[0, 0, 0, 0, 0]; |
352 | | /// let mut reader = BitReader::endian(data, BigEndian); |
353 | | /// assert!(reader.read_unsigned_var::<u8>(9).is_err()); // can't read 9 bits to u8 |
354 | | /// assert!(reader.read_unsigned_var::<u16>(17).is_err()); // can't read 17 bits to u16 |
355 | | /// assert!(reader.read_unsigned_var::<u32>(33).is_err()); // can't read 33 bits to u32 |
356 | | /// assert!(reader.read_unsigned_var::<u64>(65).is_err()); // can't read 65 bits to u64 |
357 | | /// ``` |
358 | | #[inline(always)] |
359 | 0 | fn read_unsigned_var<U>(&mut self, bits: u32) -> io::Result<U> |
360 | 0 | where |
361 | 0 | U: UnsignedInteger, |
362 | | { |
363 | 0 | self.read_unsigned_counted(BitCount::unknown(bits)) |
364 | 0 | } |
365 | | |
366 | | /// Reads an unsigned value from the stream with |
367 | | /// the given number of bits. |
368 | | /// |
369 | | /// # Errors |
370 | | /// |
371 | | /// Passes along any I/O error from the underlying stream. |
372 | | /// Also returns an error if the output type is too small |
373 | | /// to hold the requested number of bits. |
374 | | /// |
375 | | /// # Examples |
376 | | /// ``` |
377 | | /// use bitstream_io::{BitReader, BitRead, BigEndian, BitCount}; |
378 | | /// |
379 | | /// let bytes: &[u8] = &[0b1111_0000]; |
380 | | /// let mut r = BitReader::endian(bytes, BigEndian); |
381 | | /// // reading 4 bits with a maximum of 4 will fit into a u8 |
382 | | /// // so no runtime check needed |
383 | | /// assert_eq!(r.read_unsigned_counted::<4, u8>(BitCount::new::<4>()).unwrap(), 0b1111); |
384 | | /// // reading 4 bits with a maximum of 64 might not fit into a u8 |
385 | | /// // so we need to verify this at runtime |
386 | | /// assert_eq!(r.read_unsigned_counted::<64, u8>(BitCount::new::<4>()).unwrap(), 0b0000); |
387 | | /// ``` |
388 | | fn read_unsigned_counted<const MAX: u32, U>(&mut self, bits: BitCount<MAX>) -> io::Result<U> |
389 | | where |
390 | | U: UnsignedInteger; |
391 | | |
392 | | /// Reads a twos-complement signed value from the stream with |
393 | | /// the given constant number of bits. |
394 | | /// |
395 | | /// # Errors |
396 | | /// |
397 | | /// Passes along any I/O error from the underlying stream. |
398 | | /// A compile-time error occurs if the number of bits is 0, |
399 | | /// since one bit is always needed for the sign. |
400 | | /// A compile-time error occurs if the given number of bits |
401 | | /// is larger than the output type. |
402 | | /// |
403 | | /// # Examples |
404 | | /// ``` |
405 | | /// use bitstream_io::{BigEndian, BitReader, BitRead}; |
406 | | /// |
407 | | /// let data: &[u8] = &[0b1011_0111]; |
408 | | /// let mut reader = BitReader::endian(data, BigEndian); |
409 | | /// assert_eq!(reader.read_signed::<4, i8>().unwrap(), -5); |
410 | | /// assert_eq!(reader.read_signed::<4, i8>().unwrap(), 7); |
411 | | /// assert!(reader.read_signed::<4, i8>().is_err()); |
412 | | /// ``` |
413 | | /// |
414 | | /// ``` |
415 | | /// use bitstream_io::{LittleEndian, BitReader, BitRead}; |
416 | | /// |
417 | | /// let data: &[u8] = &[0b1011_0111]; |
418 | | /// let mut reader = BitReader::endian(data, LittleEndian); |
419 | | /// assert_eq!(reader.read_signed::<4, i8>().unwrap(), 7); |
420 | | /// assert_eq!(reader.read_signed::<4, i8>().unwrap(), -5); |
421 | | /// assert!(reader.read_signed::<4, i8>().is_err()); |
422 | | /// ``` |
423 | | /// |
424 | | /// ```rust,compile_fail |
425 | | /// use bitstream_io::{LittleEndian, BitReader, BitRead}; |
426 | | /// |
427 | | /// let data: &[u8] = &[0, 0, 0, 0, 0]; |
428 | | /// let mut reader = BitReader::endian(data, LittleEndian); |
429 | | /// // reading 9 bits to an i8 is a compile-time error |
430 | | /// reader.read_signed::<9, i8>(); |
431 | | /// ``` |
432 | 0 | fn read_signed<const BITS: u32, S>(&mut self) -> io::Result<S> |
433 | 0 | where |
434 | 0 | S: SignedInteger, |
435 | | { |
436 | 0 | self.read_signed_var(BITS) |
437 | 0 | } |
438 | | |
439 | | /// Reads a twos-complement signed value from the stream with |
440 | | /// the given number of bits. |
441 | | /// |
442 | | /// # Errors |
443 | | /// |
444 | | /// Passes along any I/O error from the underlying stream. |
445 | | /// Returns an error if the number of bits is 0, |
446 | | /// since one bit is always needed for the sign. |
447 | | /// Also returns an error if the output type is too small |
448 | | /// to hold the requested number of bits. |
449 | | /// |
450 | | /// # Examples |
451 | | /// ``` |
452 | | /// use bitstream_io::{BigEndian, BitReader, BitRead}; |
453 | | /// let data: &[u8] = &[0b1011_0111]; |
454 | | /// let mut reader = BitReader::endian(data, BigEndian); |
455 | | /// assert_eq!(reader.read_signed_var::<i8>(4).unwrap(), -5); |
456 | | /// assert_eq!(reader.read_signed_var::<i8>(4).unwrap(), 7); |
457 | | /// ``` |
458 | | /// |
459 | | /// ``` |
460 | | /// use bitstream_io::{LittleEndian, BitReader, BitRead}; |
461 | | /// let data: &[u8] = &[0b1011_0111]; |
462 | | /// let mut reader = BitReader::endian(data, LittleEndian); |
463 | | /// assert_eq!(reader.read_signed_var::<i8>(4).unwrap(), 7); |
464 | | /// assert_eq!(reader.read_signed_var::<i8>(4).unwrap(), -5); |
465 | | /// ``` |
466 | | /// |
467 | | /// ``` |
468 | | /// use std::io::Read; |
469 | | /// use bitstream_io::{BigEndian, BitReader, BitRead}; |
470 | | /// let data: &[u8] = &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; |
471 | | /// let mut r = BitReader::endian(data, BigEndian); |
472 | | /// assert!(r.read_signed_var::<i8>(9).is_err()); // can't read 9 bits to i8 |
473 | | /// assert!(r.read_signed_var::<i16>(17).is_err()); // can't read 17 bits to i16 |
474 | | /// assert!(r.read_signed_var::<i32>(33).is_err()); // can't read 33 bits to i32 |
475 | | /// assert!(r.read_signed_var::<i64>(65).is_err()); // can't read 65 bits to i64 |
476 | | /// ``` |
477 | 0 | fn read_signed_var<S>(&mut self, bits: u32) -> io::Result<S> |
478 | 0 | where |
479 | 0 | S: SignedInteger, |
480 | | { |
481 | 0 | self.read_signed_counted(BitCount::unknown(bits)) |
482 | 0 | } |
483 | | |
484 | | /// Reads a twos-complement signed value from the stream with |
485 | | /// the given number of bits. |
486 | | /// |
487 | | /// # Errors |
488 | | /// |
489 | | /// Passes along any I/O error from the underlying stream. |
490 | | /// Returns an error if the number of bits is 0, |
491 | | /// since one bit is always needed for the sign. |
492 | | /// Also returns an error if the output type is too small |
493 | | /// to hold the requested number of bits. |
494 | | /// |
495 | | /// # Examples |
496 | | /// ``` |
497 | | /// use bitstream_io::{BitReader, BitRead, BigEndian, BitCount}; |
498 | | /// |
499 | | /// let bytes: &[u8] = &[0b0001_1111]; |
500 | | /// let mut r = BitReader::endian(bytes, BigEndian); |
501 | | /// // reading 4 bits with a maximum of 4 will fit into an i8 |
502 | | /// // so no runtime check needed |
503 | | /// assert_eq!(r.read_signed_counted::<4, i8>(BitCount::new::<4>()).unwrap(), 1); |
504 | | /// // reading 4 bits with a maximum of 64 might not fit into an i8 |
505 | | /// // so we need to verify this at runtime |
506 | | /// assert_eq!(r.read_signed_counted::<64, i8>(BitCount::new::<4>()).unwrap(), -1); |
507 | | /// ``` |
508 | | fn read_signed_counted<const MAX: u32, S>( |
509 | | &mut self, |
510 | | bits: impl TryInto<SignedBitCount<MAX>>, |
511 | | ) -> io::Result<S> |
512 | | where |
513 | | S: SignedInteger; |
514 | | |
515 | | /// Reads the given constant value from the stream with the |
516 | | /// given number of bits. |
517 | | /// |
518 | | /// Due to current limitations of constant paramters, |
519 | | /// this is limited to `u32` values. |
520 | | /// |
521 | | /// If the constant read from the stream doesn't match the expected |
522 | | /// value, returns the generated error from the closure. |
523 | | /// |
524 | | /// # Errors |
525 | | /// |
526 | | /// Passes along any I/O error from the underlying stream, |
527 | | /// converted to the mismatch error. Returns the generated |
528 | | /// error if the read value doesn't match the expected constant. |
529 | | /// |
530 | | /// # Examples |
531 | | /// |
532 | | /// ``` |
533 | | /// use bitstream_io::{BitReader, BitRead, BigEndian}; |
534 | | /// |
535 | | /// enum Error { |
536 | | /// Mismatch, |
537 | | /// Io, |
538 | | /// } |
539 | | /// |
540 | | /// impl From<std::io::Error> for Error { |
541 | | /// fn from(_err: std::io::Error) -> Self { |
542 | | /// Self::Io |
543 | | /// } |
544 | | /// } |
545 | | /// |
546 | | /// let data: &[u8] = &[0b1000_1011, 0b0000_0001]; |
547 | | /// let mut r = BitReader::endian(data, BigEndian); |
548 | | /// assert!(r.read_const::<4, 0b1000, _>(Error::Mismatch).is_ok()); |
549 | | /// assert!(r.read_const::<4, 0b1011, _>(Error::Mismatch).is_ok()); |
550 | | /// // 0b1000 doesn't match 0b0000 |
551 | | /// assert!(matches!(r.read_const::<4, 0b1000, _>(Error::Mismatch), Err(Error::Mismatch))); |
552 | | /// // 0b1011 doesn't match 0b0001 |
553 | | /// assert!(matches!(r.read_const::<4, 0b1011, _>(Error::Mismatch), Err(Error::Mismatch))); |
554 | | /// // run out of bits to check |
555 | | /// assert!(matches!(r.read_const::<4, 0b0000, _>(Error::Mismatch), Err(Error::Io))); |
556 | | /// ``` |
557 | | #[inline] |
558 | 0 | fn read_const<const BITS: u32, const VALUE: u32, E>(&mut self, err: E) -> Result<(), E> |
559 | 0 | where |
560 | 0 | E: From<io::Error>, |
561 | | { |
562 | | use super::Numeric; |
563 | | |
564 | | const { |
565 | | assert!( |
566 | | BITS == 0 || VALUE <= (u32::ALL >> (u32::BITS_SIZE - BITS)), |
567 | | "excessive value for bits read" |
568 | | ); |
569 | | } |
570 | | |
571 | 0 | (self.read::<BITS, u32>()? == VALUE) |
572 | 0 | .then_some(()) |
573 | 0 | .ok_or(err) |
574 | 0 | } |
575 | | |
576 | | /// Reads whole value from the stream whose size in bits is equal |
577 | | /// to its type's size. |
578 | | /// |
579 | | /// # Errors |
580 | | /// |
581 | | /// Passes along any I/O error from the underlying stream. |
582 | | /// |
583 | | /// # Examples |
584 | | /// ``` |
585 | | /// use bitstream_io::{BitReader, BitRead, BigEndian}; |
586 | | /// |
587 | | /// let bytes: &[u8] = &[0x12, 0x34, 0x56, 0x78]; |
588 | | /// let mut r = BitReader::endian(bytes, BigEndian); |
589 | | /// assert_eq!(r.read_to::<u32>().unwrap(), 0x12_34_56_78); |
590 | | /// ``` |
591 | | /// |
592 | | /// ``` |
593 | | /// use bitstream_io::{BitReader, BitRead, BigEndian}; |
594 | | /// |
595 | | /// let bytes: &[u8] = &[0x12, 0x34, 0x56, 0x78]; |
596 | | /// let mut r = BitReader::endian(bytes, BigEndian); |
597 | | /// assert_eq!(r.read_to::<[u8; 4]>().unwrap(), [0x12, 0x34, 0x56, 0x78]); |
598 | | /// ``` |
599 | | fn read_to<V>(&mut self) -> io::Result<V> |
600 | | where |
601 | | V: Primitive; |
602 | | |
603 | | /// Reads whole value from the stream whose size in bits is equal |
604 | | /// to its type's size in an endianness that may be different |
605 | | /// from the stream's endianness. |
606 | | /// |
607 | | /// # Errors |
608 | | /// |
609 | | /// Passes along any I/O error from the underlying stream. |
610 | | /// |
611 | | /// # Example |
612 | | /// ``` |
613 | | /// use bitstream_io::{BitReader, BitRead, BigEndian, LittleEndian}; |
614 | | /// |
615 | | /// let bytes: &[u8] = &[0x12, 0x34, 0x56, 0x78]; |
616 | | /// let mut r = BitReader::endian(bytes, BigEndian); |
617 | | /// assert_eq!(r.read_as_to::<LittleEndian, u32>().unwrap(), 0x78_56_34_12); |
618 | | /// ``` |
619 | | fn read_as_to<F, V>(&mut self) -> io::Result<V> |
620 | | where |
621 | | F: Endianness, |
622 | | V: Primitive; |
623 | | |
624 | | /// Skips the given number of bits in the stream. |
625 | | /// Since this method does not need an accumulator, |
626 | | /// it may be slightly faster than reading to an empty variable. |
627 | | /// In addition, since there is no accumulator, |
628 | | /// there is no upper limit on the number of bits |
629 | | /// which may be skipped. |
630 | | /// These bits are still read from the stream, however, |
631 | | /// and are never skipped via a `seek` method. |
632 | | /// |
633 | | /// # Errors |
634 | | /// |
635 | | /// Passes along any I/O error from the underlying stream. |
636 | | /// |
637 | | /// # Example |
638 | | /// ``` |
639 | | /// use bitstream_io::{BitReader, BitRead, BigEndian}; |
640 | | /// |
641 | | /// let bytes: &[u8] = &[0b1_00000_10]; |
642 | | /// let mut r = BitReader::endian(bytes, BigEndian); |
643 | | /// assert_eq!(r.read_bit().unwrap(), true); |
644 | | /// assert!(r.skip(5).is_ok()); |
645 | | /// assert_eq!(r.read_bit().unwrap(), true); |
646 | | /// assert_eq!(r.read_bit().unwrap(), false); |
647 | | /// assert!(r.read_bit().is_err()); |
648 | | /// ``` |
649 | 0 | fn skip(&mut self, bits: u32) -> io::Result<()> { |
650 | 0 | (0..bits).try_for_each(|_| self.read_bit().map(|_| ())) |
651 | 0 | } |
652 | | |
653 | | /// Completely fills the given buffer with whole bytes. |
654 | | /// If the stream is already byte-aligned, it will map |
655 | | /// to a faster `read_exact` call. Otherwise it will read |
656 | | /// bytes individually in 8-bit increments. |
657 | | /// |
658 | | /// # Errors |
659 | | /// |
660 | | /// Passes along any I/O error from the underlying stream. |
661 | | /// |
662 | | /// # Example |
663 | | /// ``` |
664 | | /// use bitstream_io::{BitReader, BitRead, BigEndian}; |
665 | | /// |
666 | | /// let bytes: &[u8] = &[0x00, 0x01, 0x02, 0x03, 0x04]; |
667 | | /// let mut r = BitReader::endian(bytes, BigEndian); |
668 | | /// let mut buf = [0; 3]; |
669 | | /// assert_eq!(r.read::<8, u8>().unwrap(), 0x00); |
670 | | /// assert!(r.read_bytes(&mut buf).is_ok()); |
671 | | /// assert_eq!(&buf, &[0x01, 0x02, 0x03]); |
672 | | /// assert_eq!(r.read::<8, u8>().unwrap(), 0x04); |
673 | | /// ``` |
674 | 0 | fn read_bytes(&mut self, buf: &mut [u8]) -> io::Result<()> { |
675 | 0 | for b in buf.iter_mut() { |
676 | 0 | *b = self.read_unsigned::<8, _>()?; |
677 | | } |
678 | 0 | Ok(()) |
679 | 0 | } |
680 | | |
681 | | /// Completely fills a whole buffer with bytes and returns it. |
682 | | /// If the stream is already byte-aligned, it will map |
683 | | /// to a faster `read_exact` call. Otherwise it will read |
684 | | /// bytes individually in 8-bit increments. |
685 | | /// |
686 | | /// # Errors |
687 | | /// |
688 | | /// Passes along any I/O error from the underlying stream. |
689 | | #[inline(always)] |
690 | | #[deprecated(since = "1.8.0", note = "use read_to() method instead")] |
691 | 0 | fn read_to_bytes<const SIZE: usize>(&mut self) -> io::Result<[u8; SIZE]> { |
692 | 0 | self.read_to() |
693 | 0 | } |
694 | | |
695 | | /// Completely fills a vector of bytes and returns it. |
696 | | /// If the stream is already byte-aligned, it will map |
697 | | /// to a faster `read_exact` call. Otherwise it will read |
698 | | /// bytes individually in 8-bit increments. |
699 | | /// |
700 | | /// # Errors |
701 | | /// |
702 | | /// Passes along any I/O error from the underlying stream. |
703 | | /// |
704 | | /// # Example |
705 | | /// ``` |
706 | | /// use bitstream_io::{BitReader, BitRead, BigEndian}; |
707 | | /// |
708 | | /// let bytes: &[u8] = &[0x00, 0x01, 0x02, 0x03, 0x04]; |
709 | | /// let mut r = BitReader::endian(bytes, BigEndian); |
710 | | /// let mut buf = [0; 3]; |
711 | | /// assert_eq!(r.read::<8, u8>().unwrap(), 0x00); |
712 | | /// assert_eq!(r.read_to_vec(3).unwrap().as_slice(), &[0x01, 0x02, 0x03]); |
713 | | /// assert_eq!(r.read::<8, u8>().unwrap(), 0x04); |
714 | | /// ``` |
715 | | #[cfg(feature = "alloc")] |
716 | 0 | fn read_to_vec(&mut self, bytes: usize) -> io::Result<Vec<u8>> { |
717 | 0 | read_to_vec(|buf| self.read_bytes(buf), bytes) |
718 | 0 | } |
719 | | |
720 | | /// Counts the number of bits in the stream until `STOP_BIT` |
721 | | /// and returns the amount read. |
722 | | /// `STOP_BIT` must be 0 or 1. |
723 | | /// Because this field is variably-sized and may be large, |
724 | | /// its output is always a `u32` type. |
725 | | /// |
726 | | /// # Errors |
727 | | /// |
728 | | /// Passes along any I/O error from the underlying stream. |
729 | | /// May panic if the number of bits exceeds `u32`. |
730 | | /// |
731 | | /// # Examples |
732 | | /// ``` |
733 | | /// use bitstream_io::{BitReader, BitRead, BigEndian}; |
734 | | /// |
735 | | /// let bytes: &[u8] = &[0b0_10_11111, 0b10_000000]; |
736 | | /// let mut r = BitReader::endian(bytes, BigEndian); |
737 | | /// // read 1 bits until stop bit of 0, big-endian order |
738 | | /// assert_eq!(r.read_unary::<0>().unwrap(), 0); |
739 | | /// assert_eq!(r.read_unary::<0>().unwrap(), 1); |
740 | | /// assert_eq!(r.read_unary::<0>().unwrap(), 6); |
741 | | /// ``` |
742 | | /// |
743 | | /// ``` |
744 | | /// use bitstream_io::{BitReader, BitRead, BigEndian}; |
745 | | /// |
746 | | /// let bytes: &[u8] = &[0b1_01_00000, 0b01_000000]; |
747 | | /// let mut r = BitReader::endian(bytes, BigEndian); |
748 | | /// // read 0 bits until stop bit of 1, big-endian order |
749 | | /// assert_eq!(r.read_unary::<1>().unwrap(), 0); |
750 | | /// assert_eq!(r.read_unary::<1>().unwrap(), 1); |
751 | | /// assert_eq!(r.read_unary::<1>().unwrap(), 6); |
752 | | /// ``` |
753 | | /// |
754 | | /// ``` |
755 | | /// use bitstream_io::{BitReader, BitRead, LittleEndian}; |
756 | | /// |
757 | | /// let bytes: &[u8] = &[0b11111_01_0, 0b000000_01]; |
758 | | /// let mut r = BitReader::endian(bytes, LittleEndian); |
759 | | /// // read 1 bits until stop bit of 0, little-endian order |
760 | | /// assert_eq!(r.read_unary::<0>().unwrap(), 0); |
761 | | /// assert_eq!(r.read_unary::<0>().unwrap(), 1); |
762 | | /// assert_eq!(r.read_unary::<0>().unwrap(), 6); |
763 | | /// ``` |
764 | | /// |
765 | | /// ``` |
766 | | /// use bitstream_io::{BitReader, BitRead, LittleEndian}; |
767 | | /// |
768 | | /// let bytes: &[u8] = &[0b00000_10_1, 0b111111_10]; |
769 | | /// let mut r = BitReader::endian(bytes, LittleEndian); |
770 | | /// // read 0 bits until stop bit of 1, little-endian order |
771 | | /// assert_eq!(r.read_unary::<1>().unwrap(), 0); |
772 | | /// assert_eq!(r.read_unary::<1>().unwrap(), 1); |
773 | | /// assert_eq!(r.read_unary::<1>().unwrap(), 6); |
774 | | /// ``` |
775 | 0 | fn read_unary<const STOP_BIT: u8>(&mut self) -> io::Result<u32> { |
776 | | const { |
777 | | assert!(matches!(STOP_BIT, 0 | 1), "stop bit must be 0 or 1"); |
778 | | } |
779 | | |
780 | | // a simple implementation which works anywhere |
781 | 0 | let mut unary = 0; |
782 | 0 | while self.read::<1, u8>()? != STOP_BIT { |
783 | 0 | unary += 1; |
784 | 0 | } |
785 | 0 | Ok(unary) |
786 | 0 | } |
787 | | |
788 | | /// Reads to a checked value that is known to fit a given number of bits |
789 | | /// |
790 | | /// # Example |
791 | | /// ``` |
792 | | /// use bitstream_io::{ |
793 | | /// BitRead, BitReader, BigEndian, Checked, CheckedUnsigned, CheckedSigned, |
794 | | /// BitCount, SignedBitCount, BitWrite, BitWriter, |
795 | | /// }; |
796 | | /// |
797 | | /// let data: &[u8] = &[0b1001_1111]; |
798 | | /// let mut r = BitReader::endian(data, BigEndian); |
799 | | /// |
800 | | /// let bit_count = BitCount::<4>::new::<4>(); |
801 | | /// let checked_u8 = r.read_checked::<CheckedUnsigned<4, u8>>(bit_count).unwrap(); |
802 | | /// assert_eq!(checked_u8.into_value(), 0b1001); |
803 | | /// |
804 | | /// let bit_count = SignedBitCount::<4>::new::<4>(); |
805 | | /// let checked_i8 = r.read_checked::<CheckedSigned<4, i8>>(bit_count).unwrap(); |
806 | | /// assert_eq!(checked_i8.into_value(), -1); |
807 | | /// |
808 | | /// // note that checked values already know their bit count |
809 | | /// // so none is required when writing them to a stream |
810 | | /// let mut w = BitWriter::endian(vec![], BigEndian); |
811 | | /// w.write_checked(checked_u8).unwrap(); |
812 | | /// w.write_checked(checked_i8).unwrap(); |
813 | | /// assert_eq!(w.into_writer().as_slice(), data); |
814 | | /// ``` |
815 | | #[inline] |
816 | 0 | fn read_checked<C>(&mut self, count: C::CountType) -> io::Result<C> |
817 | 0 | where |
818 | 0 | C: CheckablePrimitive, |
819 | | { |
820 | 0 | C::read(self, count) |
821 | 0 | } |
822 | | |
823 | | /// Parses and returns complex type |
824 | 0 | fn parse<F: FromBitStream>(&mut self) -> Result<F, F::Error> { |
825 | 0 | F::from_reader(self) |
826 | 0 | } |
827 | | |
828 | | /// Parses and returns complex type with context |
829 | 0 | fn parse_with<'a, F: FromBitStreamWith<'a>>( |
830 | 0 | &mut self, |
831 | 0 | context: &F::Context, |
832 | 0 | ) -> Result<F, F::Error> { |
833 | 0 | F::from_reader(self, context) |
834 | 0 | } |
835 | | |
836 | | /// Parses and returns complex type with owned context |
837 | 0 | fn parse_using<F: FromBitStreamUsing>(&mut self, context: F::Context) -> Result<F, F::Error> { |
838 | 0 | F::from_reader(self, context) |
839 | 0 | } |
840 | | |
841 | | /// Returns true if the stream is aligned at a whole byte. |
842 | | /// |
843 | | /// # Example |
844 | | /// ``` |
845 | | /// use std::io::Read; |
846 | | /// use bitstream_io::{BigEndian, BitReader, BitRead}; |
847 | | /// let data = [0]; |
848 | | /// let mut reader = BitReader::endian(data.as_slice(), BigEndian); |
849 | | /// assert_eq!(reader.byte_aligned(), true); |
850 | | /// assert!(reader.skip(1).is_ok()); |
851 | | /// assert_eq!(reader.byte_aligned(), false); |
852 | | /// assert!(reader.skip(7).is_ok()); |
853 | | /// assert_eq!(reader.byte_aligned(), true); |
854 | | /// ``` |
855 | | fn byte_aligned(&self) -> bool; |
856 | | |
857 | | /// Throws away all unread bit values until the next whole byte. |
858 | | /// Does nothing if the stream is already aligned. |
859 | | /// |
860 | | /// # Example |
861 | | /// ``` |
862 | | /// use bitstream_io::{BigEndian, BitReader, BitRead}; |
863 | | /// let data: &[u8] = &[0x00, 0xFF]; |
864 | | /// let mut reader = BitReader::endian(data, BigEndian); |
865 | | /// assert_eq!(reader.read::<4, u8>().unwrap(), 0); |
866 | | /// reader.byte_align(); |
867 | | /// assert_eq!(reader.read::<8, u8>().unwrap(), 0xFF); |
868 | | /// ``` |
869 | | fn byte_align(&mut self); |
870 | | |
871 | | /// Given a compiled Huffman tree, reads bits from the stream |
872 | | /// until the next symbol is encountered. |
873 | | /// |
874 | | /// # Errors |
875 | | /// |
876 | | /// Passes along any I/O error from the underlying stream. |
877 | | /// |
878 | | /// # Example |
879 | | /// |
880 | | /// ``` |
881 | | /// use bitstream_io::{BitReader, BitRead, BigEndian, define_huffman_tree, huffman::FromBits}; |
882 | | /// |
883 | | /// define_huffman_tree!(TreeName : char = ['a', ['b', ['c', 'd']]]); |
884 | | /// // 'a' is 0 |
885 | | /// // 'b' is 1 -> 0 |
886 | | /// // 'c' is 1 -> 1 -> 0 |
887 | | /// // 'd' is 1 -> 1 -> 1 |
888 | | /// |
889 | | /// let data: &[u8] = &[0b0_10_110_11, 0b1_0000000]; |
890 | | /// let mut r = BitReader::endian(data, BigEndian); |
891 | | /// assert_eq!(r.read_huffman::<TreeName>().unwrap(), 'a'); |
892 | | /// assert_eq!(r.read_huffman::<TreeName>().unwrap(), 'b'); |
893 | | /// assert_eq!(r.read_huffman::<TreeName>().unwrap(), 'c'); |
894 | | /// assert_eq!(r.read_huffman::<TreeName>().unwrap(), 'd'); |
895 | | /// ``` |
896 | | #[inline] |
897 | 0 | fn read_huffman<T>(&mut self) -> io::Result<T::Symbol> |
898 | 0 | where |
899 | 0 | T: crate::huffman::FromBits, |
900 | | { |
901 | 0 | T::from_bits(|| self.read_bit()) |
902 | 0 | } |
903 | | |
904 | | /// Reads a number using a variable using a variable width integer. |
905 | | /// This optimises the case when the number is small. |
906 | | /// |
907 | | /// The integer is mapped to an unsigned value using zigzag encoding. |
908 | | /// For an integer X: |
909 | | /// - if X >= 0 -> 2X |
910 | | /// - else -> -2X + 1 |
911 | | /// |
912 | | /// # Errors |
913 | | /// |
914 | | /// Passes along any I/O error from the underlying stream. |
915 | | /// Returns an error if the data read would overflow the size of the result |
916 | | /// |
917 | | /// # Example |
918 | | /// ``` |
919 | | /// use bitstream_io::{BitReader, BitRead, BigEndian}; |
920 | | /// |
921 | | /// let bytes: &[u8] = &[0b0111_1100, 0b1100_0001]; |
922 | | /// let mut r = BitReader::endian(bytes, BigEndian); |
923 | | /// assert_eq!(r.read_unsigned_vbr::<4, u32>().unwrap(), 7); |
924 | | /// assert_eq!(r.read_unsigned_vbr::<4, u32>().unwrap(), 100); |
925 | | /// ``` |
926 | | /// ``` |
927 | | /// use bitstream_io::{BitReader, BitRead, BigEndian}; |
928 | | /// |
929 | | /// let bytes: &[u8] = &[0b1111_1111, 0b0011_1000, 0b1000_0100, 0b1000_1000, 0b1000_0000]; |
930 | | /// let mut r = BitReader::endian(bytes, BigEndian); |
931 | | /// assert_eq!(r.read_unsigned_vbr::<4, u8>().unwrap(), 255); // Tries to read <011><111><111> |
932 | | /// assert!(r.read_unsigned_vbr::<4, u8>().is_err()); // Tries to read a value of <100><000><000> |
933 | | /// assert!(r.read_unsigned_vbr::<4, u8>().is_err()); // Tries to read a value of <000><000><000><000> |
934 | | /// ``` |
935 | 0 | fn read_unsigned_vbr<const FIELD_SIZE: u32, U: UnsignedInteger>(&mut self) -> io::Result<U> { |
936 | | const { assert!(FIELD_SIZE >= 2 && FIELD_SIZE < U::BITS_SIZE) }; |
937 | 0 | let payload_bits = FIELD_SIZE - 1; |
938 | 0 | let mut value = U::ZERO; |
939 | 0 | let mut shift = 0u32; |
940 | | loop { |
941 | 0 | let (data, continuation) = self.read_unsigned::<FIELD_SIZE, U>().map(|item| { |
942 | 0 | ( |
943 | 0 | item & ((U::ONE << payload_bits) - U::ONE), |
944 | 0 | (item >> payload_bits) != U::ZERO, |
945 | 0 | ) |
946 | 0 | })?; |
947 | 0 | let shifted = data << shift; |
948 | 0 | value |= shifted; |
949 | 0 | if !continuation { |
950 | 0 | if (data << shift) >> shift == data { |
951 | 0 | break Ok(value); |
952 | | } else { |
953 | 0 | break Err(VariableWidthOverflow {}.into()); |
954 | | } |
955 | 0 | } |
956 | 0 | shift += payload_bits; |
957 | 0 | if shift >= U::BITS_SIZE { |
958 | 0 | break Err(VariableWidthOverflow {}.into()); |
959 | 0 | } |
960 | | } |
961 | 0 | } |
962 | | |
963 | | /// Reads a number using a variable using a variable width integer. |
964 | | /// This optimises the case when the number is small. |
965 | | /// |
966 | | /// The integer is mapped to an unsigned value using zigzag encoding. |
967 | | /// For an integer X: |
968 | | /// - if X >= 0 -> 2X |
969 | | /// - else -> -2X + 1 |
970 | | /// |
971 | | /// # Errors |
972 | | /// |
973 | | /// Passes along any I/O error from the underlying stream. |
974 | | /// Returns an error if the data read would overflow the size of the result |
975 | | /// |
976 | | /// # Example |
977 | | /// ``` |
978 | | /// use bitstream_io::{BitReader, BitRead, BigEndian}; |
979 | | /// |
980 | | /// let bytes: &[u8] = &[0b0110_1011, 0b1100_0001]; |
981 | | /// let mut r = BitReader::endian(bytes, BigEndian); |
982 | | /// assert_eq!(r.read_signed_vbr::<4, i32>().unwrap(), 3); |
983 | | /// assert_eq!(r.read_signed_vbr::<4, i32>().unwrap(), -50); |
984 | | /// ``` |
985 | 0 | fn read_signed_vbr<const FIELD_SIZE: u32, I: SignedInteger>(&mut self) -> io::Result<I> { |
986 | 0 | self.read_unsigned_vbr::<FIELD_SIZE, I::Unsigned>() |
987 | 0 | .map(|zig_zag| { |
988 | 0 | let shifted = zig_zag >> 1; |
989 | 0 | let complimented = zig_zag & <I::Unsigned as crate::Numeric>::ONE; |
990 | 0 | let neg = I::ZERO - complimented.as_non_negative(); |
991 | 0 | shifted.as_non_negative() ^ neg |
992 | 0 | }) |
993 | 0 | } |
994 | | |
995 | | /// Reads a signed or unsigned variable width integer from the stream. |
996 | | /// |
997 | | /// # Errors |
998 | | /// |
999 | | /// Passes along any I/O error from the underlying stream. |
1000 | | /// Returns an error if the data read would overflow the size of the result |
1001 | | /// |
1002 | | /// # Example |
1003 | | /// ``` |
1004 | | /// use bitstream_io::{BitReader, BitRead, BigEndian}; |
1005 | | /// |
1006 | | /// let bytes: &[u8] = &[0b0110_1011, 0b1100_0001]; |
1007 | | /// let mut r = BitReader::endian(bytes, BigEndian); |
1008 | | /// assert_eq!(r.read_vbr::<4, u32>().unwrap(), 6); |
1009 | | /// assert_eq!(r.read_vbr::<4, i32>().unwrap(), -50); |
1010 | | /// ``` |
1011 | | #[inline] |
1012 | 0 | fn read_vbr<const FIELD_SIZE: u32, I: VBRInteger>(&mut self) -> io::Result<I> { |
1013 | 0 | I::read_vbr::<FIELD_SIZE, _>(self) |
1014 | 0 | } |
1015 | | |
1016 | | /// Creates a "by reference" adaptor for this `BitRead` |
1017 | | /// |
1018 | | /// The returned adapter also implements `BitRead` |
1019 | | /// and will borrow the current reader. |
1020 | | /// |
1021 | | /// # Example |
1022 | | /// ``` |
1023 | | /// use bitstream_io::{BitReader, BitRead, BigEndian}; |
1024 | | /// |
1025 | | /// fn parse<R: BitRead>(r: R) { |
1026 | | /// // perform some parsing |
1027 | | /// } |
1028 | | /// |
1029 | | /// let data: &[u8] = &[0]; |
1030 | | /// let mut reader = BitReader::endian(data, BigEndian); |
1031 | | /// // performing parsing by reference |
1032 | | /// parse(reader.by_ref()); |
1033 | | /// // original owned reader still available |
1034 | | /// assert_eq!(reader.read::<8, u8>().unwrap(), 0); |
1035 | | /// ``` |
1036 | | #[inline] |
1037 | 0 | fn by_ref(&mut self) -> &mut Self { |
1038 | 0 | self |
1039 | 0 | } |
1040 | | } |
1041 | | |
1042 | | impl<R: BitRead + ?Sized> BitRead for &mut R { |
1043 | | #[inline] |
1044 | 0 | fn read_bit(&mut self) -> io::Result<bool> { |
1045 | 0 | (**self).read_bit() |
1046 | 0 | } |
1047 | | |
1048 | | #[inline] |
1049 | 0 | fn read<const BITS: u32, I>(&mut self) -> io::Result<I> |
1050 | 0 | where |
1051 | 0 | I: Integer, |
1052 | | { |
1053 | 0 | (**self).read::<BITS, I>() |
1054 | 0 | } |
1055 | | |
1056 | | #[inline] |
1057 | 0 | fn read_var<I>(&mut self, bits: u32) -> io::Result<I> |
1058 | 0 | where |
1059 | 0 | I: Integer + Sized, |
1060 | | { |
1061 | 0 | (**self).read_var(bits) |
1062 | 0 | } |
1063 | | |
1064 | | #[inline] |
1065 | 0 | fn read_count<const MAX: u32>(&mut self) -> io::Result<BitCount<MAX>> { |
1066 | 0 | (**self).read_count::<MAX>() |
1067 | 0 | } |
1068 | | |
1069 | | #[inline] |
1070 | 0 | fn read_counted<const MAX: u32, I>(&mut self, bits: BitCount<MAX>) -> io::Result<I> |
1071 | 0 | where |
1072 | 0 | I: Integer + Sized, |
1073 | | { |
1074 | 0 | (**self).read_counted::<MAX, I>(bits) |
1075 | 0 | } |
1076 | | |
1077 | | #[inline] |
1078 | 0 | fn read_unsigned<const BITS: u32, U>(&mut self) -> io::Result<U> |
1079 | 0 | where |
1080 | 0 | U: UnsignedInteger, |
1081 | | { |
1082 | 0 | (**self).read_unsigned::<BITS, U>() |
1083 | 0 | } |
1084 | | |
1085 | | #[inline] |
1086 | 0 | fn read_unsigned_var<U>(&mut self, bits: u32) -> io::Result<U> |
1087 | 0 | where |
1088 | 0 | U: UnsignedInteger, |
1089 | | { |
1090 | 0 | (**self).read_unsigned_var(bits) |
1091 | 0 | } |
1092 | | |
1093 | | #[inline] |
1094 | 0 | fn read_unsigned_counted<const MAX: u32, U>(&mut self, bits: BitCount<MAX>) -> io::Result<U> |
1095 | 0 | where |
1096 | 0 | U: UnsignedInteger, |
1097 | | { |
1098 | 0 | (**self).read_unsigned_counted::<MAX, U>(bits) |
1099 | 0 | } |
1100 | | |
1101 | | #[inline] |
1102 | 0 | fn read_signed<const BITS: u32, S>(&mut self) -> io::Result<S> |
1103 | 0 | where |
1104 | 0 | S: SignedInteger, |
1105 | | { |
1106 | 0 | (**self).read_signed::<BITS, S>() |
1107 | 0 | } |
1108 | | |
1109 | | #[inline] |
1110 | 0 | fn read_signed_var<S>(&mut self, bits: u32) -> io::Result<S> |
1111 | 0 | where |
1112 | 0 | S: SignedInteger, |
1113 | | { |
1114 | 0 | (**self).read_signed_var(bits) |
1115 | 0 | } |
1116 | | |
1117 | | #[inline] |
1118 | 0 | fn read_signed_counted<const MAX: u32, S>( |
1119 | 0 | &mut self, |
1120 | 0 | bits: impl TryInto<SignedBitCount<MAX>>, |
1121 | 0 | ) -> io::Result<S> |
1122 | 0 | where |
1123 | 0 | S: SignedInteger, |
1124 | | { |
1125 | 0 | (**self).read_signed_counted::<MAX, S>(bits) |
1126 | 0 | } |
1127 | | |
1128 | | #[inline] |
1129 | 0 | fn read_to<V>(&mut self) -> io::Result<V> |
1130 | 0 | where |
1131 | 0 | V: Primitive, |
1132 | | { |
1133 | 0 | (**self).read_to::<V>() |
1134 | 0 | } |
1135 | | |
1136 | | #[inline] |
1137 | 0 | fn read_as_to<F, V>(&mut self) -> io::Result<V> |
1138 | 0 | where |
1139 | 0 | F: Endianness, |
1140 | 0 | V: Primitive, |
1141 | | { |
1142 | 0 | (**self).read_as_to::<F, V>() |
1143 | 0 | } |
1144 | | |
1145 | | #[inline] |
1146 | 0 | fn skip(&mut self, bits: u32) -> io::Result<()> { |
1147 | 0 | (**self).skip(bits) |
1148 | 0 | } |
1149 | | |
1150 | | #[inline] |
1151 | 0 | fn read_bytes(&mut self, buf: &mut [u8]) -> io::Result<()> { |
1152 | 0 | (**self).read_bytes(buf) |
1153 | 0 | } |
1154 | | |
1155 | | #[inline] |
1156 | | #[cfg(feature = "alloc")] |
1157 | 0 | fn read_to_vec(&mut self, bytes: usize) -> io::Result<Vec<u8>> { |
1158 | 0 | (**self).read_to_vec(bytes) |
1159 | 0 | } |
1160 | | |
1161 | | #[inline] |
1162 | 0 | fn read_unary<const STOP_BIT: u8>(&mut self) -> io::Result<u32> { |
1163 | 0 | (**self).read_unary::<STOP_BIT>() |
1164 | 0 | } |
1165 | | |
1166 | | #[inline] |
1167 | 0 | fn parse<F: FromBitStream>(&mut self) -> Result<F, F::Error> { |
1168 | 0 | (**self).parse::<F>() |
1169 | 0 | } |
1170 | | |
1171 | | #[inline] |
1172 | 0 | fn parse_with<'a, F: FromBitStreamWith<'a>>( |
1173 | 0 | &mut self, |
1174 | 0 | context: &F::Context, |
1175 | 0 | ) -> Result<F, F::Error> { |
1176 | 0 | (**self).parse_with::<F>(context) |
1177 | 0 | } |
1178 | | |
1179 | | #[inline] |
1180 | 0 | fn byte_aligned(&self) -> bool { |
1181 | 0 | (**self).byte_aligned() |
1182 | 0 | } |
1183 | | |
1184 | | #[inline] |
1185 | 0 | fn byte_align(&mut self) { |
1186 | 0 | (**self).byte_align() |
1187 | 0 | } |
1188 | | |
1189 | | #[inline] |
1190 | 0 | fn read_huffman<T>(&mut self) -> io::Result<T::Symbol> |
1191 | 0 | where |
1192 | 0 | T: crate::huffman::FromBits, |
1193 | | { |
1194 | 0 | (**self).read_huffman::<T>() |
1195 | 0 | } |
1196 | | } |
1197 | | |
1198 | | /// A compatibility trait for older code implementing [`BitRead`] |
1199 | | /// |
1200 | | /// This is a trait largely compatible with older code |
1201 | | /// from the 2.X.X version, |
1202 | | /// which one can use with a named import as needed. |
1203 | | /// |
1204 | | /// New code should prefer the regular [`BitRead`] trait. |
1205 | | /// |
1206 | | /// # Example |
1207 | | /// ``` |
1208 | | /// use bitstream_io::BitRead2 as BitRead; |
1209 | | /// use bitstream_io::{BitReader, BigEndian}; |
1210 | | /// let byte = &[0b1111_0000]; |
1211 | | /// let mut reader = BitReader::endian(byte.as_slice(), BigEndian); |
1212 | | /// assert_eq!(reader.read::<u8>(4).unwrap(), 0b1111); |
1213 | | /// assert_eq!(reader.read_in::<4, u8>().unwrap(), 0b0000); |
1214 | | /// ``` |
1215 | | pub trait BitRead2 { |
1216 | | /// Reads a single bit from the stream. |
1217 | | /// `true` indicates 1, `false` indicates 0 |
1218 | | /// |
1219 | | /// # Errors |
1220 | | /// |
1221 | | /// Passes along any I/O error from the underlying stream. |
1222 | | fn read_bit(&mut self) -> io::Result<bool>; |
1223 | | |
1224 | | /// Reads an unsigned value from the stream with |
1225 | | /// the given number of bits. |
1226 | | /// |
1227 | | /// # Errors |
1228 | | /// |
1229 | | /// Passes along any I/O error from the underlying stream. |
1230 | | /// Also returns an error if the output type is too small |
1231 | | /// to hold the requested number of bits. |
1232 | | fn read<I>(&mut self, bits: u32) -> io::Result<I> |
1233 | | where |
1234 | | I: Integer + Sized; |
1235 | | |
1236 | | /// Reads an unsigned value from the stream with |
1237 | | /// the given constant number of bits. |
1238 | | /// |
1239 | | /// # Errors |
1240 | | /// |
1241 | | /// Passes along any I/O error from the underlying stream. |
1242 | | /// A compile-time error occurs if the given number of bits |
1243 | | /// is larger than the output type. |
1244 | 0 | fn read_in<const BITS: u32, I>(&mut self) -> io::Result<I> |
1245 | 0 | where |
1246 | 0 | I: Integer, |
1247 | | { |
1248 | 0 | self.read(BITS) |
1249 | 0 | } |
1250 | | |
1251 | | /// Reads a twos-complement signed value from the stream with |
1252 | | /// the given number of bits. |
1253 | | /// |
1254 | | /// # Errors |
1255 | | /// |
1256 | | /// Passes along any I/O error from the underlying stream. |
1257 | | /// Returns an error if the number of bits is 0, |
1258 | | /// since one bit is always needed for the sign. |
1259 | | /// Also returns an error if the output type is too small |
1260 | | /// to hold the requested number of bits. |
1261 | | fn read_signed<S>(&mut self, bits: u32) -> io::Result<S> |
1262 | | where |
1263 | | S: SignedInteger; |
1264 | | |
1265 | | /// Reads a twos-complement signed value from the stream with |
1266 | | /// the given constant number of bits. |
1267 | | /// |
1268 | | /// # Errors |
1269 | | /// |
1270 | | /// Passes along any I/O error from the underlying stream. |
1271 | | /// A compile-time error occurs if the number of bits is 0, |
1272 | | /// since one bit is always needed for the sign. |
1273 | | /// A compile-time error occurs if the given number of bits |
1274 | | /// is larger than the output type. |
1275 | 0 | fn read_signed_in<const BITS: u32, S>(&mut self) -> io::Result<S> |
1276 | 0 | where |
1277 | 0 | S: SignedInteger, |
1278 | | { |
1279 | 0 | self.read_signed(BITS) |
1280 | 0 | } |
1281 | | |
1282 | | /// Reads whole value from the stream whose size in bits is equal |
1283 | | /// to its type's size. |
1284 | | /// |
1285 | | /// # Errors |
1286 | | /// |
1287 | | /// Passes along any I/O error from the underlying stream. |
1288 | | fn read_to<V>(&mut self) -> io::Result<V> |
1289 | | where |
1290 | | V: Primitive; |
1291 | | |
1292 | | /// Reads whole value from the stream whose size in bits is equal |
1293 | | /// to its type's size in an endianness that may be different |
1294 | | /// from the stream's endianness. |
1295 | | /// |
1296 | | /// # Errors |
1297 | | /// |
1298 | | /// Passes along any I/O error from the underlying stream. |
1299 | | fn read_as_to<F, V>(&mut self) -> io::Result<V> |
1300 | | where |
1301 | | F: Endianness, |
1302 | | V: Primitive; |
1303 | | |
1304 | | /// Skips the given number of bits in the stream. |
1305 | | /// Since this method does not need an accumulator, |
1306 | | /// it may be slightly faster than reading to an empty variable. |
1307 | | /// In addition, since there is no accumulator, |
1308 | | /// there is no upper limit on the number of bits |
1309 | | /// which may be skipped. |
1310 | | /// These bits are still read from the stream, however, |
1311 | | /// and are never skipped via a `seek` method. |
1312 | | /// |
1313 | | /// # Errors |
1314 | | /// |
1315 | | /// Passes along any I/O error from the underlying stream. |
1316 | | fn skip(&mut self, bits: u32) -> io::Result<()>; |
1317 | | |
1318 | | /// Completely fills the given buffer with whole bytes. |
1319 | | /// If the stream is already byte-aligned, it will map |
1320 | | /// to a faster `read_exact` call. Otherwise it will read |
1321 | | /// bytes individually in 8-bit increments. |
1322 | | /// |
1323 | | /// # Errors |
1324 | | /// |
1325 | | /// Passes along any I/O error from the underlying stream. |
1326 | 0 | fn read_bytes(&mut self, buf: &mut [u8]) -> io::Result<()> { |
1327 | 0 | for b in buf.iter_mut() { |
1328 | 0 | *b = self.read_in::<8, _>()?; |
1329 | | } |
1330 | 0 | Ok(()) |
1331 | 0 | } |
1332 | | |
1333 | | /// Completely fills a whole buffer with bytes and returns it. |
1334 | | /// If the stream is already byte-aligned, it will map |
1335 | | /// to a faster `read_exact` call. Otherwise it will read |
1336 | | /// bytes individually in 8-bit increments. |
1337 | | /// |
1338 | | /// # Errors |
1339 | | /// |
1340 | | /// Passes along any I/O error from the underlying stream. |
1341 | | #[inline(always)] |
1342 | | #[deprecated(since = "1.8.0", note = "use read_to() method instead")] |
1343 | 0 | fn read_to_bytes<const SIZE: usize>(&mut self) -> io::Result<[u8; SIZE]> { |
1344 | 0 | self.read_to() |
1345 | 0 | } |
1346 | | |
1347 | | /// Completely fills a vector of bytes and returns it. |
1348 | | /// If the stream is already byte-aligned, it will map |
1349 | | /// to a faster `read_exact` call. Otherwise it will read |
1350 | | /// bytes individually in 8-bit increments. |
1351 | | /// |
1352 | | /// # Errors |
1353 | | /// |
1354 | | /// Passes along any I/O error from the underlying stream. |
1355 | | #[cfg(feature = "alloc")] |
1356 | 0 | fn read_to_vec(&mut self, bytes: usize) -> io::Result<Vec<u8>> { |
1357 | 0 | read_to_vec(|buf| self.read_bytes(buf), bytes) |
1358 | 0 | } |
1359 | | |
1360 | | /// Counts the number of 1 bits in the stream until the next |
1361 | | /// 0 bit and returns the amount read. |
1362 | | /// Because this field is variably-sized and may be large, |
1363 | | /// its output is always a `u32` type. |
1364 | | /// |
1365 | | /// # Errors |
1366 | | /// |
1367 | | /// Passes along any I/O error from the underlying stream. |
1368 | 0 | fn read_unary0(&mut self) -> io::Result<u32> { |
1369 | 0 | let mut unary = 0; |
1370 | 0 | while self.read_bit()? { |
1371 | 0 | unary += 1; |
1372 | 0 | } |
1373 | 0 | Ok(unary) |
1374 | 0 | } |
1375 | | |
1376 | | /// Counts the number of 0 bits in the stream until the next |
1377 | | /// 1 bit and returns the amount read. |
1378 | | /// Because this field is variably-sized and may be large, |
1379 | | /// its output is always a `u32` type. |
1380 | | /// |
1381 | | /// # Errors |
1382 | | /// |
1383 | | /// Passes along any I/O error from the underlying stream. |
1384 | 0 | fn read_unary1(&mut self) -> io::Result<u32> { |
1385 | 0 | let mut unary = 0; |
1386 | 0 | while !(self.read_bit()?) { |
1387 | 0 | unary += 1; |
1388 | 0 | } |
1389 | 0 | Ok(unary) |
1390 | 0 | } |
1391 | | |
1392 | | /// Parses and returns complex type |
1393 | 0 | fn parse<F: FromBitStream>(&mut self) -> Result<F, F::Error> |
1394 | 0 | where |
1395 | 0 | Self: BitRead, |
1396 | | { |
1397 | 0 | F::from_reader(self) |
1398 | 0 | } |
1399 | | |
1400 | | /// Parses and returns complex type with context |
1401 | 0 | fn parse_with<'a, F: FromBitStreamWith<'a>>( |
1402 | 0 | &mut self, |
1403 | 0 | context: &F::Context, |
1404 | 0 | ) -> Result<F, F::Error> |
1405 | 0 | where |
1406 | 0 | Self: BitRead, |
1407 | | { |
1408 | 0 | F::from_reader(self, context) |
1409 | 0 | } |
1410 | | |
1411 | | /// Returns true if the stream is aligned at a whole byte. |
1412 | | fn byte_aligned(&self) -> bool; |
1413 | | |
1414 | | /// Throws away all unread bit values until the next whole byte. |
1415 | | /// Does nothing if the stream is already aligned. |
1416 | | fn byte_align(&mut self); |
1417 | | |
1418 | | /// Given a compiled Huffman tree, reads bits from the stream |
1419 | | /// until the next symbol is encountered. |
1420 | | /// |
1421 | | /// # Errors |
1422 | | /// |
1423 | | /// Passes along any I/O error from the underlying stream. |
1424 | | #[inline] |
1425 | 0 | fn read_huffman<T>(&mut self) -> io::Result<T::Symbol> |
1426 | 0 | where |
1427 | 0 | T: crate::huffman::FromBits, |
1428 | | { |
1429 | 0 | T::from_bits(|| self.read_bit()) |
1430 | 0 | } |
1431 | | } |
1432 | | |
1433 | | impl<R: BitRead> BitRead2 for R { |
1434 | | #[inline(always)] |
1435 | 0 | fn read_bit(&mut self) -> io::Result<bool> { |
1436 | 0 | BitRead::read_bit(self) |
1437 | 0 | } |
1438 | | |
1439 | | #[inline(always)] |
1440 | 0 | fn read<I>(&mut self, bits: u32) -> io::Result<I> |
1441 | 0 | where |
1442 | 0 | I: Integer + Sized, |
1443 | | { |
1444 | 0 | self.read_var(bits) |
1445 | 0 | } |
1446 | | |
1447 | | #[inline(always)] |
1448 | 0 | fn read_in<const BITS: u32, I>(&mut self) -> io::Result<I> |
1449 | 0 | where |
1450 | 0 | I: Integer, |
1451 | | { |
1452 | 0 | BitRead::read::<BITS, I>(self) |
1453 | 0 | } |
1454 | | |
1455 | | #[inline(always)] |
1456 | 0 | fn read_signed<S>(&mut self, bits: u32) -> io::Result<S> |
1457 | 0 | where |
1458 | 0 | S: SignedInteger, |
1459 | | { |
1460 | 0 | self.read_signed_var(bits) |
1461 | 0 | } |
1462 | | |
1463 | | #[inline(always)] |
1464 | 0 | fn read_signed_in<const BITS: u32, S>(&mut self) -> io::Result<S> |
1465 | 0 | where |
1466 | 0 | S: SignedInteger, |
1467 | | { |
1468 | 0 | BitRead::read_signed::<BITS, S>(self) |
1469 | 0 | } |
1470 | | |
1471 | | #[inline(always)] |
1472 | 0 | fn read_to<V>(&mut self) -> io::Result<V> |
1473 | 0 | where |
1474 | 0 | V: Primitive, |
1475 | | { |
1476 | 0 | BitRead::read_to::<V>(self) |
1477 | 0 | } |
1478 | | |
1479 | | #[inline(always)] |
1480 | 0 | fn read_as_to<F, V>(&mut self) -> io::Result<V> |
1481 | 0 | where |
1482 | 0 | F: Endianness, |
1483 | 0 | V: Primitive, |
1484 | | { |
1485 | 0 | BitRead::read_as_to::<F, V>(self) |
1486 | 0 | } |
1487 | | |
1488 | | #[inline(always)] |
1489 | 0 | fn skip(&mut self, bits: u32) -> io::Result<()> { |
1490 | 0 | BitRead::skip(self, bits) |
1491 | 0 | } |
1492 | | |
1493 | | #[inline(always)] |
1494 | 0 | fn read_bytes(&mut self, buf: &mut [u8]) -> io::Result<()> { |
1495 | 0 | BitRead::read_bytes(self, buf) |
1496 | 0 | } |
1497 | | |
1498 | | #[inline(always)] |
1499 | 0 | fn read_unary0(&mut self) -> io::Result<u32> { |
1500 | 0 | self.read_unary::<0>() |
1501 | 0 | } |
1502 | | |
1503 | | #[inline(always)] |
1504 | 0 | fn read_unary1(&mut self) -> io::Result<u32> { |
1505 | 0 | self.read_unary::<1>() |
1506 | 0 | } |
1507 | | |
1508 | | #[inline(always)] |
1509 | 0 | fn byte_aligned(&self) -> bool { |
1510 | 0 | BitRead::byte_aligned(self) |
1511 | 0 | } |
1512 | | |
1513 | | #[inline(always)] |
1514 | 0 | fn byte_align(&mut self) { |
1515 | 0 | BitRead::byte_align(self) |
1516 | 0 | } |
1517 | | } |
1518 | | |
1519 | | /// For reading non-aligned bits from a stream of bytes in a given endianness. |
1520 | | /// |
1521 | | /// This will read exactly as many whole bytes needed to return |
1522 | | /// the requested number of bits. It may cache up to a single partial byte |
1523 | | /// but no more. |
1524 | | #[derive(Clone, Debug)] |
1525 | | pub struct BitReader<R, E: Endianness> { |
1526 | | // our underlying reader |
1527 | | reader: R, |
1528 | | // our partial byte |
1529 | | value: u8, |
1530 | | // the number of bits in our partial byte |
1531 | | bits: u32, |
1532 | | // a container for our endiannness |
1533 | | phantom: PhantomData<E>, |
1534 | | } |
1535 | | |
1536 | | impl<R, E: Endianness> BitReader<R, E> { |
1537 | | /// Wraps a BitReader around something that implements `Read` |
1538 | 0 | pub fn new(reader: R) -> BitReader<R, E> { |
1539 | 0 | BitReader { |
1540 | 0 | reader, |
1541 | 0 | value: 0, |
1542 | 0 | bits: 0, |
1543 | 0 | phantom: PhantomData, |
1544 | 0 | } |
1545 | 0 | } |
1546 | | |
1547 | | /// Wraps a BitReader around something that implements `Read` |
1548 | | /// with the given endianness. |
1549 | 0 | pub fn endian(reader: R, _endian: E) -> BitReader<R, E> { |
1550 | 0 | BitReader { |
1551 | 0 | reader, |
1552 | 0 | value: 0, |
1553 | 0 | bits: 0, |
1554 | 0 | phantom: PhantomData, |
1555 | 0 | } |
1556 | 0 | } |
1557 | | |
1558 | | /// Unwraps internal reader and disposes of BitReader. |
1559 | | /// |
1560 | | /// # Warning |
1561 | | /// |
1562 | | /// Any unread partial bits are discarded. |
1563 | | #[inline] |
1564 | 0 | pub fn into_reader(self) -> R { |
1565 | 0 | self.reader |
1566 | 0 | } |
1567 | | } |
1568 | | |
1569 | | impl<R: io::Read, E: Endianness> BitReader<R, E> { |
1570 | | /// If stream is byte-aligned, provides mutable reference |
1571 | | /// to internal reader. Otherwise returns `None` |
1572 | | #[inline] |
1573 | 0 | pub fn reader(&mut self) -> Option<&mut R> { |
1574 | 0 | if BitRead::byte_aligned(self) { |
1575 | 0 | Some(&mut self.reader) |
1576 | | } else { |
1577 | 0 | None |
1578 | | } |
1579 | 0 | } |
1580 | | |
1581 | | /// Returns byte-aligned mutable reference to internal reader. |
1582 | | /// |
1583 | | /// Bytes aligns stream if it is not already aligned. |
1584 | | #[inline] |
1585 | 0 | pub fn aligned_reader(&mut self) -> &mut R { |
1586 | 0 | BitRead::byte_align(self); |
1587 | 0 | &mut self.reader |
1588 | 0 | } |
1589 | | |
1590 | | /// Converts `BitReader` to `ByteReader` in the same endianness. |
1591 | | /// |
1592 | | /// # Warning |
1593 | | /// |
1594 | | /// Any unread partial bits are discarded. |
1595 | | #[inline] |
1596 | 0 | pub fn into_bytereader(self) -> ByteReader<R, E> { |
1597 | 0 | ByteReader::new(self.into_reader()) |
1598 | 0 | } |
1599 | | |
1600 | | /// If stream is byte-aligned, provides temporary `ByteReader` |
1601 | | /// in the same endianness. Otherwise returns `None` |
1602 | | /// |
1603 | | /// # Warning |
1604 | | /// |
1605 | | /// Any reader bits left over when `ByteReader` is dropped are lost. |
1606 | | #[inline] |
1607 | 0 | pub fn bytereader(&mut self) -> Option<ByteReader<&mut R, E>> { |
1608 | 0 | self.reader().map(ByteReader::new) |
1609 | 0 | } |
1610 | | } |
1611 | | |
1612 | | impl<R: io::Read, E: Endianness> BitRead for BitReader<R, E> { |
1613 | | #[inline(always)] |
1614 | 0 | fn read_bit(&mut self) -> io::Result<bool> { |
1615 | | let Self { |
1616 | 0 | value, |
1617 | 0 | bits, |
1618 | 0 | reader, |
1619 | | .. |
1620 | 0 | } = self; |
1621 | 0 | E::pop_bit_refill(reader, value, bits) |
1622 | 0 | } |
1623 | | |
1624 | | #[inline(always)] |
1625 | 0 | fn read_unsigned_counted<const BITS: u32, U>(&mut self, bits: BitCount<BITS>) -> io::Result<U> |
1626 | 0 | where |
1627 | 0 | U: UnsignedInteger, |
1628 | | { |
1629 | | let Self { |
1630 | 0 | value: queue_value, |
1631 | 0 | bits: queue_bits, |
1632 | 0 | reader, |
1633 | | .. |
1634 | 0 | } = self; |
1635 | 0 | E::read_bits(reader, queue_value, queue_bits, bits) |
1636 | 0 | } |
1637 | | |
1638 | | #[inline] |
1639 | 0 | fn read_unsigned<const BITS: u32, U>(&mut self) -> io::Result<U> |
1640 | 0 | where |
1641 | 0 | U: UnsignedInteger, |
1642 | | { |
1643 | | let Self { |
1644 | 0 | value, |
1645 | 0 | bits, |
1646 | 0 | reader, |
1647 | | .. |
1648 | 0 | } = self; |
1649 | 0 | E::read_bits_fixed::<BITS, R, U>(reader, value, bits) |
1650 | 0 | } |
1651 | | |
1652 | | #[inline(always)] |
1653 | 0 | fn read_signed_counted<const MAX: u32, S>( |
1654 | 0 | &mut self, |
1655 | 0 | bits: impl TryInto<SignedBitCount<MAX>>, |
1656 | 0 | ) -> io::Result<S> |
1657 | 0 | where |
1658 | 0 | S: SignedInteger, |
1659 | | { |
1660 | 0 | E::read_signed_counted( |
1661 | 0 | self, |
1662 | 0 | bits.try_into().map_err(|_| { |
1663 | 0 | io::Error::new( |
1664 | 0 | io::ErrorKind::InvalidInput, |
1665 | | "signed reads need at least 1 bit for sign", |
1666 | | ) |
1667 | 0 | })?, |
1668 | | ) |
1669 | 0 | } |
1670 | | |
1671 | | #[inline] |
1672 | 0 | fn read_signed<const BITS: u32, S>(&mut self) -> io::Result<S> |
1673 | 0 | where |
1674 | 0 | S: SignedInteger, |
1675 | | { |
1676 | 0 | let count = const { |
1677 | | assert!(BITS <= S::BITS_SIZE, "excessive bits for type read"); |
1678 | | let count = BitCount::<BITS>::new::<BITS>().signed_count(); |
1679 | | assert!(count.is_some(), "signed reads need at least 1 bit for sign"); |
1680 | | count.unwrap() |
1681 | | }; |
1682 | | |
1683 | 0 | E::read_signed_counted(self, count) |
1684 | 0 | } |
1685 | | |
1686 | | #[inline] |
1687 | 0 | fn read_to<V>(&mut self) -> io::Result<V> |
1688 | 0 | where |
1689 | 0 | V: Primitive, |
1690 | | { |
1691 | 0 | let mut buffer = V::buffer(); |
1692 | 0 | E::read_bytes::<8, _>( |
1693 | 0 | &mut self.reader, |
1694 | 0 | &mut self.value, |
1695 | 0 | self.bits, |
1696 | 0 | buffer.as_mut(), |
1697 | 0 | )?; |
1698 | 0 | Ok(E::bytes_to_primitive(buffer)) |
1699 | 0 | } |
1700 | | |
1701 | | #[inline] |
1702 | 0 | fn read_as_to<F, V>(&mut self) -> io::Result<V> |
1703 | 0 | where |
1704 | 0 | F: Endianness, |
1705 | 0 | V: Primitive, |
1706 | | { |
1707 | 0 | let mut buffer = V::buffer(); |
1708 | 0 | F::read_bytes::<8, _>( |
1709 | 0 | &mut self.reader, |
1710 | 0 | &mut self.value, |
1711 | 0 | self.bits, |
1712 | 0 | buffer.as_mut(), |
1713 | 0 | )?; |
1714 | 0 | Ok(F::bytes_to_primitive(buffer)) |
1715 | 0 | } |
1716 | | |
1717 | | /// # Examples |
1718 | | /// ``` |
1719 | | /// use std::io::Read; |
1720 | | /// use bitstream_io::{BigEndian, BitReader, BitRead}; |
1721 | | /// let data = [0b10110111]; |
1722 | | /// let mut reader = BitReader::endian(data.as_slice(), BigEndian); |
1723 | | /// assert!(reader.skip(3).is_ok()); |
1724 | | /// assert_eq!(reader.read::<5, u8>().unwrap(), 0b10111); |
1725 | | /// ``` |
1726 | | /// |
1727 | | /// ``` |
1728 | | /// use std::io::Read; |
1729 | | /// use bitstream_io::{LittleEndian, BitReader, BitRead}; |
1730 | | /// let data = [0b10110111]; |
1731 | | /// let mut reader = BitReader::endian(data.as_slice(), LittleEndian); |
1732 | | /// assert!(reader.skip(3).is_ok()); |
1733 | | /// assert_eq!(reader.read::<5, u8>().unwrap(), 0b10110); |
1734 | | /// ``` |
1735 | 0 | fn skip(&mut self, mut bits: u32) -> io::Result<()> { |
1736 | 0 | if BitRead::byte_aligned(self) && bits % 8 == 0 { |
1737 | 0 | skip_aligned(self.reader.by_ref(), bits / 8) |
1738 | | } else { |
1739 | | loop { |
1740 | 0 | match bits { |
1741 | 0 | 0 => break Ok(()), |
1742 | 0 | bits @ 1..64 => break self.read_var(bits).map(|_: u64| ()), |
1743 | | _ => { |
1744 | 0 | let _ = BitRead::read::<64, u64>(self)?; |
1745 | 0 | bits -= 64; |
1746 | | } |
1747 | | } |
1748 | | } |
1749 | | } |
1750 | 0 | } |
1751 | | |
1752 | | /// # Example |
1753 | | /// ``` |
1754 | | /// use std::io::Read; |
1755 | | /// use bitstream_io::{BigEndian, BitReader, BitRead}; |
1756 | | /// let data = b"foobar"; |
1757 | | /// let mut reader = BitReader::endian(data.as_slice(), BigEndian); |
1758 | | /// assert!(reader.skip(24).is_ok()); |
1759 | | /// let mut buf = [0;3]; |
1760 | | /// assert!(reader.read_bytes(&mut buf).is_ok()); |
1761 | | /// assert_eq!(&buf, b"bar"); |
1762 | | /// ``` |
1763 | | #[inline] |
1764 | 0 | fn read_bytes(&mut self, buf: &mut [u8]) -> io::Result<()> { |
1765 | 0 | E::read_bytes::<1024, _>(&mut self.reader, &mut self.value, self.bits, buf) |
1766 | 0 | } |
1767 | | |
1768 | 0 | fn read_unary<const STOP_BIT: u8>(&mut self) -> io::Result<u32> { |
1769 | | let Self { |
1770 | 0 | value, |
1771 | 0 | bits, |
1772 | 0 | reader, |
1773 | | .. |
1774 | 0 | } = self; |
1775 | 0 | E::pop_unary::<STOP_BIT, R>(reader, value, bits) |
1776 | 0 | } |
1777 | | |
1778 | | #[inline] |
1779 | 0 | fn byte_aligned(&self) -> bool { |
1780 | 0 | self.bits == 0 |
1781 | 0 | } |
1782 | | |
1783 | | #[inline] |
1784 | 0 | fn byte_align(&mut self) { |
1785 | 0 | self.value = 0; |
1786 | 0 | self.bits = 0; |
1787 | 0 | } |
1788 | | } |
1789 | | |
1790 | | impl<R, E> BitReader<R, E> |
1791 | | where |
1792 | | E: Endianness, |
1793 | | R: io::Read + io::Seek, |
1794 | | { |
1795 | | /// # Example |
1796 | | /// ``` |
1797 | | /// use std::io::{Read, Cursor, SeekFrom}; |
1798 | | /// use bitstream_io::{BigEndian, BitReader, BitRead}; |
1799 | | /// let data = [0x00, 0xFF]; |
1800 | | /// let mut reader = BitReader::endian(Cursor::new(&data), BigEndian); |
1801 | | /// assert_eq!(reader.position_in_bits().unwrap(), 0); |
1802 | | /// |
1803 | | /// let pos = reader.seek_bits(SeekFrom::Start(5)).unwrap(); |
1804 | | /// assert!(pos == 5 && 5 == reader.position_in_bits().unwrap()); |
1805 | | /// |
1806 | | /// let pos = reader.seek_bits(SeekFrom::Current(-2)).unwrap(); |
1807 | | /// assert!(pos == 3 && 3 == reader.position_in_bits().unwrap()); |
1808 | | /// |
1809 | | /// let pos = reader.seek_bits(SeekFrom::End(5)).unwrap(); |
1810 | | /// assert!(pos == 11 && 11 == reader.position_in_bits().unwrap()); |
1811 | | /// ``` |
1812 | 0 | pub fn seek_bits(&mut self, from: io::SeekFrom) -> io::Result<u64> { |
1813 | 0 | match from { |
1814 | 0 | io::SeekFrom::Start(from_start_pos) => { |
1815 | 0 | let (bytes, bits) = (from_start_pos / 8, (from_start_pos % 8) as u32); |
1816 | 0 | BitRead::byte_align(self); |
1817 | 0 | self.reader.seek(io::SeekFrom::Start(bytes))?; |
1818 | 0 | BitRead::skip(self, bits)?; |
1819 | 0 | Ok(from_start_pos) |
1820 | | } |
1821 | 0 | io::SeekFrom::End(from_end_pos) => { |
1822 | 0 | let reader_end = self.reader.seek(io::SeekFrom::End(0))?; |
1823 | 0 | let new_pos = (reader_end * 8) as i64 - from_end_pos; |
1824 | 0 | assert!(new_pos >= 0, "The final position should be greater than 0"); |
1825 | 0 | self.seek_bits(io::SeekFrom::Start(new_pos as u64)) |
1826 | | } |
1827 | 0 | io::SeekFrom::Current(offset) => { |
1828 | 0 | let new_pos = self.position_in_bits()? as i64 + offset; |
1829 | 0 | assert!(new_pos >= 0, "The final position should be greater than 0"); |
1830 | 0 | self.seek_bits(io::SeekFrom::Start(new_pos as u64)) |
1831 | | } |
1832 | | } |
1833 | 0 | } |
1834 | | |
1835 | | /// # Example |
1836 | | /// ``` |
1837 | | /// use std::fs::read; |
1838 | | /// use std::io::{Read, Cursor, SeekFrom}; |
1839 | | /// use bitstream_io::{BigEndian, BitReader, BitRead}; |
1840 | | /// let data = [0x00, 0xFF]; |
1841 | | /// let mut reader = BitReader::endian(Cursor::new(&data), BigEndian); |
1842 | | /// assert_eq!(reader.position_in_bits().unwrap(), 0); |
1843 | | /// |
1844 | | /// let _: i32 = reader.read_signed::<5, _>().unwrap(); |
1845 | | /// assert_eq!(reader.position_in_bits().unwrap(), 5); |
1846 | | /// |
1847 | | /// reader.read_bit().unwrap(); |
1848 | | /// assert_eq!(reader.position_in_bits().unwrap(), 6); |
1849 | | /// ``` |
1850 | | #[inline] |
1851 | | #[allow(clippy::seek_from_current)] |
1852 | 0 | pub fn position_in_bits(&mut self) -> io::Result<u64> { |
1853 | | // no_std_io2 doesn't have `seek_from_current` |
1854 | 0 | let bytes = self.reader.seek(io::SeekFrom::Current(0))?; |
1855 | 0 | Ok(bytes * 8 - (self.bits as u64)) |
1856 | 0 | } |
1857 | | } |
1858 | | |
1859 | 0 | fn skip_aligned<R>(reader: R, bytes: u32) -> io::Result<()> |
1860 | 0 | where |
1861 | 0 | R: io::Read, |
1862 | | { |
1863 | 0 | fn skip_chunks<const SIZE: usize, R>(mut reader: R, mut bytes: usize) -> io::Result<()> |
1864 | 0 | where |
1865 | 0 | R: io::Read, |
1866 | | { |
1867 | 0 | let mut buf = [0; SIZE]; |
1868 | 0 | while bytes > 0 { |
1869 | 0 | let to_read = bytes.min(SIZE); |
1870 | 0 | reader.read_exact(&mut buf[0..to_read])?; |
1871 | 0 | bytes -= to_read; |
1872 | | } |
1873 | 0 | Ok(()) |
1874 | 0 | } |
1875 | | |
1876 | 0 | match bytes { |
1877 | 0 | 0..256 => skip_chunks::<8, R>(reader, bytes as usize), |
1878 | 0 | 256..1024 => skip_chunks::<256, R>(reader, bytes as usize), |
1879 | 0 | 1024..4096 => skip_chunks::<1024, R>(reader, bytes as usize), |
1880 | 0 | _ => skip_chunks::<4096, R>(reader, bytes as usize), |
1881 | | } |
1882 | 0 | } |
1883 | | |
1884 | | /// A trait for anything that can read aligned values from an input stream |
1885 | | pub trait ByteRead { |
1886 | | /// Reads whole numeric value from stream |
1887 | | /// |
1888 | | /// # Errors |
1889 | | /// |
1890 | | /// Passes along any I/O error from the underlying stream. |
1891 | | /// |
1892 | | /// # Examples |
1893 | | /// ``` |
1894 | | /// use std::io::Read; |
1895 | | /// use bitstream_io::{BigEndian, ByteReader, ByteRead}; |
1896 | | /// let data = [0b00000000, 0b11111111]; |
1897 | | /// let mut reader = ByteReader::endian(data.as_slice(), BigEndian); |
1898 | | /// assert_eq!(reader.read::<u16>().unwrap(), 0b0000000011111111); |
1899 | | /// ``` |
1900 | | /// |
1901 | | /// ``` |
1902 | | /// use std::io::Read; |
1903 | | /// use bitstream_io::{LittleEndian, ByteReader, ByteRead}; |
1904 | | /// let data = [0b00000000, 0b11111111]; |
1905 | | /// let mut reader = ByteReader::endian(data.as_slice(), LittleEndian); |
1906 | | /// assert_eq!(reader.read::<u16>().unwrap(), 0b1111111100000000); |
1907 | | /// ``` |
1908 | | fn read<V>(&mut self) -> Result<V, io::Error> |
1909 | | where |
1910 | | V: Primitive; |
1911 | | |
1912 | | /// Reads whole numeric value from stream in a potentially different endianness |
1913 | | /// |
1914 | | /// # Errors |
1915 | | /// |
1916 | | /// Passes along any I/O error from the underlying stream. |
1917 | | /// |
1918 | | /// # Examples |
1919 | | /// ``` |
1920 | | /// use std::io::Read; |
1921 | | /// use bitstream_io::{BigEndian, ByteReader, ByteRead, LittleEndian}; |
1922 | | /// let data = [0b00000000, 0b11111111]; |
1923 | | /// let mut reader = ByteReader::endian(data.as_slice(), BigEndian); |
1924 | | /// assert_eq!(reader.read_as::<LittleEndian, u16>().unwrap(), 0b1111111100000000); |
1925 | | /// ``` |
1926 | | /// |
1927 | | /// ``` |
1928 | | /// use std::io::Read; |
1929 | | /// use bitstream_io::{BigEndian, ByteReader, ByteRead, LittleEndian}; |
1930 | | /// let data = [0b00000000, 0b11111111]; |
1931 | | /// let mut reader = ByteReader::endian(data.as_slice(), LittleEndian); |
1932 | | /// assert_eq!(reader.read_as::<BigEndian, u16>().unwrap(), 0b0000000011111111); |
1933 | | /// ``` |
1934 | | fn read_as<F, V>(&mut self) -> Result<V, io::Error> |
1935 | | where |
1936 | | F: Endianness, |
1937 | | V: Primitive; |
1938 | | |
1939 | | /// Completely fills the given buffer with whole bytes. |
1940 | | /// |
1941 | | /// # Errors |
1942 | | /// |
1943 | | /// Passes along any I/O error from the underlying stream. |
1944 | 0 | fn read_bytes(&mut self, buf: &mut [u8]) -> io::Result<()> { |
1945 | 0 | for b in buf.iter_mut() { |
1946 | 0 | *b = self.read()?; |
1947 | | } |
1948 | 0 | Ok(()) |
1949 | 0 | } |
1950 | | |
1951 | | /// Completely fills a whole buffer with bytes and returns it. |
1952 | | /// |
1953 | | /// # Errors |
1954 | | /// |
1955 | | /// Passes along any I/O error from the underlying stream. |
1956 | | #[inline(always)] |
1957 | | #[deprecated(since = "1.8.0", note = "use read() method instead")] |
1958 | 0 | fn read_to_bytes<const SIZE: usize>(&mut self) -> io::Result<[u8; SIZE]> { |
1959 | 0 | self.read() |
1960 | 0 | } |
1961 | | |
1962 | | /// Completely fills a vector of bytes and returns it. |
1963 | | /// |
1964 | | /// # Errors |
1965 | | /// |
1966 | | /// Passes along any I/O error from the underlying stream. |
1967 | | #[cfg(feature = "alloc")] |
1968 | 0 | fn read_to_vec(&mut self, bytes: usize) -> io::Result<Vec<u8>> { |
1969 | 0 | read_to_vec(|buf| self.read_bytes(buf), bytes) |
1970 | 0 | } |
1971 | | |
1972 | | /// Skips the given number of bytes in the stream. |
1973 | | /// |
1974 | | /// # Errors |
1975 | | /// |
1976 | | /// Passes along any I/O error from the underlying stream. |
1977 | | fn skip(&mut self, bytes: u32) -> io::Result<()>; |
1978 | | |
1979 | | /// Parses and returns complex type |
1980 | 0 | fn parse<F: FromByteStream>(&mut self) -> Result<F, F::Error> { |
1981 | 0 | F::from_reader(self) |
1982 | 0 | } |
1983 | | |
1984 | | /// Parses and returns complex type with context |
1985 | 0 | fn parse_with<'a, F: FromByteStreamWith<'a>>( |
1986 | 0 | &mut self, |
1987 | 0 | context: &F::Context, |
1988 | 0 | ) -> Result<F, F::Error> { |
1989 | 0 | F::from_reader(self, context) |
1990 | 0 | } |
1991 | | |
1992 | | /// Parses and returns complex type with owned context |
1993 | 0 | fn parse_using<F: FromByteStreamUsing>(&mut self, context: F::Context) -> Result<F, F::Error> { |
1994 | 0 | F::from_reader(self, context) |
1995 | 0 | } |
1996 | | |
1997 | | /// Returns mutable reference to underlying reader |
1998 | | fn reader_ref(&mut self) -> &mut dyn io::Read; |
1999 | | } |
2000 | | |
2001 | | /// For reading aligned bytes from a stream of bytes in a given endianness. |
2002 | | /// |
2003 | | /// This only reads aligned values and maintains no internal state. |
2004 | | #[derive(Debug)] |
2005 | | pub struct ByteReader<R: io::Read, E: Endianness> { |
2006 | | phantom: PhantomData<E>, |
2007 | | reader: R, |
2008 | | } |
2009 | | |
2010 | | impl<R: io::Read, E: Endianness> ByteReader<R, E> { |
2011 | | /// Wraps a ByteReader around something that implements `Read` |
2012 | 0 | pub fn new(reader: R) -> ByteReader<R, E> { |
2013 | 0 | ByteReader { |
2014 | 0 | phantom: PhantomData, |
2015 | 0 | reader, |
2016 | 0 | } |
2017 | 0 | } |
2018 | | |
2019 | | /// Wraps a ByteReader around something that implements `Read` |
2020 | | /// with the given endianness. |
2021 | 0 | pub fn endian(reader: R, _endian: E) -> ByteReader<R, E> { |
2022 | 0 | ByteReader { |
2023 | 0 | phantom: PhantomData, |
2024 | 0 | reader, |
2025 | 0 | } |
2026 | 0 | } |
2027 | | |
2028 | | /// Unwraps internal reader and disposes of `ByteReader`. |
2029 | | #[inline] |
2030 | 0 | pub fn into_reader(self) -> R { |
2031 | 0 | self.reader |
2032 | 0 | } |
2033 | | |
2034 | | /// Provides mutable reference to internal reader |
2035 | | #[inline] |
2036 | 0 | pub fn reader(&mut self) -> &mut R { |
2037 | 0 | &mut self.reader |
2038 | 0 | } |
2039 | | |
2040 | | /// Converts `ByteReader` to `BitReader` in the same endianness. |
2041 | | #[inline] |
2042 | 0 | pub fn into_bitreader(self) -> BitReader<R, E> { |
2043 | 0 | BitReader::new(self.into_reader()) |
2044 | 0 | } |
2045 | | |
2046 | | /// Provides temporary `BitReader` in the same endianness. |
2047 | | /// |
2048 | | /// # Warning |
2049 | | /// |
2050 | | /// Any unread bits left over when `BitReader` is dropped are lost. |
2051 | | #[inline] |
2052 | 0 | pub fn bitreader(&mut self) -> BitReader<&mut R, E> { |
2053 | 0 | BitReader::new(self.reader()) |
2054 | 0 | } |
2055 | | } |
2056 | | |
2057 | | impl<R: io::Read, E: Endianness> ByteRead for ByteReader<R, E> { |
2058 | | #[inline] |
2059 | 0 | fn read<V>(&mut self) -> Result<V, io::Error> |
2060 | 0 | where |
2061 | 0 | V: Primitive, |
2062 | | { |
2063 | 0 | let mut buf = V::buffer(); |
2064 | 0 | self.read_bytes(buf.as_mut())?; |
2065 | 0 | Ok(E::bytes_to_primitive(buf)) |
2066 | 0 | } |
2067 | | |
2068 | | #[inline] |
2069 | 0 | fn read_as<F, V>(&mut self) -> Result<V, io::Error> |
2070 | 0 | where |
2071 | 0 | F: Endianness, |
2072 | 0 | V: Primitive, |
2073 | | { |
2074 | 0 | let mut buf = V::buffer(); |
2075 | 0 | self.read_bytes(buf.as_mut())?; |
2076 | 0 | Ok(F::bytes_to_primitive(buf)) |
2077 | 0 | } |
2078 | | |
2079 | | #[inline] |
2080 | 0 | fn read_bytes(&mut self, buf: &mut [u8]) -> io::Result<()> { |
2081 | 0 | self.reader.read_exact(buf) |
2082 | 0 | } |
2083 | | |
2084 | | #[inline] |
2085 | 0 | fn skip(&mut self, bytes: u32) -> io::Result<()> { |
2086 | 0 | skip_aligned(&mut self.reader, bytes) |
2087 | 0 | } |
2088 | | |
2089 | | #[inline] |
2090 | 0 | fn reader_ref(&mut self) -> &mut dyn io::Read { |
2091 | 0 | &mut self.reader |
2092 | 0 | } |
2093 | | } |
2094 | | |
2095 | | impl<R: io::Read + io::Seek, E: Endianness> io::Seek for ByteReader<R, E> { |
2096 | 0 | fn seek(&mut self, pos: io::SeekFrom) -> io::Result<u64> { |
2097 | 0 | self.reader().seek(pos) |
2098 | 0 | } |
2099 | | } |
2100 | | |
2101 | | /// Implemented by complex types that don't require any additional context |
2102 | | /// to parse themselves from a reader. Analogous to [`std::str::FromStr`]. |
2103 | | /// |
2104 | | /// # Example |
2105 | | /// ``` |
2106 | | /// use std::io::Read; |
2107 | | /// use bitstream_io::{BigEndian, BitRead, BitReader, FromBitStream}; |
2108 | | /// |
2109 | | /// #[derive(Debug, PartialEq, Eq)] |
2110 | | /// struct BlockHeader { |
2111 | | /// last_block: bool, |
2112 | | /// block_type: u8, |
2113 | | /// block_size: u32, |
2114 | | /// } |
2115 | | /// |
2116 | | /// impl FromBitStream for BlockHeader { |
2117 | | /// type Error = std::io::Error; |
2118 | | /// |
2119 | | /// fn from_reader<R: BitRead + ?Sized>(r: &mut R) -> std::io::Result<Self> { |
2120 | | /// Ok(Self { |
2121 | | /// last_block: r.read_bit()?, |
2122 | | /// block_type: r.read::<7, _>()?, |
2123 | | /// block_size: r.read::<24, _>()?, |
2124 | | /// }) |
2125 | | /// } |
2126 | | /// } |
2127 | | /// |
2128 | | /// let mut reader = BitReader::endian(b"\x04\x00\x00\x7A".as_slice(), BigEndian); |
2129 | | /// assert_eq!( |
2130 | | /// reader.parse::<BlockHeader>().unwrap(), |
2131 | | /// BlockHeader { last_block: false, block_type: 4, block_size: 122 } |
2132 | | /// ); |
2133 | | /// ``` |
2134 | | pub trait FromBitStream { |
2135 | | /// Error generated during parsing, such as `io::Error` |
2136 | | type Error; |
2137 | | |
2138 | | /// Parse Self from reader |
2139 | | fn from_reader<R: BitRead + ?Sized>(r: &mut R) -> Result<Self, Self::Error> |
2140 | | where |
2141 | | Self: Sized; |
2142 | | } |
2143 | | |
2144 | | /// Implemented by complex types that require some immutable context |
2145 | | /// to parse themselves from a reader. |
2146 | | /// |
2147 | | /// # Example |
2148 | | /// ``` |
2149 | | /// use std::io::Read; |
2150 | | /// use bitstream_io::{BigEndian, BitRead, BitReader, FromBitStreamWith}; |
2151 | | /// |
2152 | | /// #[derive(Default)] |
2153 | | /// struct Streaminfo { |
2154 | | /// minimum_block_size: u16, |
2155 | | /// maximum_block_size: u16, |
2156 | | /// minimum_frame_size: u32, |
2157 | | /// maximum_frame_size: u32, |
2158 | | /// sample_rate: u32, |
2159 | | /// channels: u8, |
2160 | | /// bits_per_sample: u8, |
2161 | | /// total_samples: u64, |
2162 | | /// md5: [u8; 16], |
2163 | | /// } |
2164 | | /// |
2165 | | /// #[derive(Debug, PartialEq, Eq)] |
2166 | | /// struct FrameHeader { |
2167 | | /// variable_block_size: bool, |
2168 | | /// block_size: u32, |
2169 | | /// sample_rate: u32, |
2170 | | /// channel_assignment: u8, |
2171 | | /// sample_size: u8, |
2172 | | /// frame_number: u64, |
2173 | | /// crc8: u8, |
2174 | | /// } |
2175 | | /// |
2176 | | /// impl FromBitStreamWith<'_> for FrameHeader { |
2177 | | /// type Context = Streaminfo; |
2178 | | /// |
2179 | | /// type Error = FrameHeaderError; |
2180 | | /// |
2181 | | /// fn from_reader<R: BitRead + ?Sized>( |
2182 | | /// r: &mut R, |
2183 | | /// streaminfo: &Streaminfo, |
2184 | | /// ) -> Result<Self, Self::Error> { |
2185 | | /// if r.read::<14, u16>()? != 0b11111111111110 { |
2186 | | /// return Err(FrameHeaderError::InvalidSync); |
2187 | | /// } |
2188 | | /// |
2189 | | /// if r.read_bit()? != false { |
2190 | | /// return Err(FrameHeaderError::InvalidReservedBit); |
2191 | | /// } |
2192 | | /// |
2193 | | /// let variable_block_size = r.read_bit()?; |
2194 | | /// |
2195 | | /// let block_size_bits = r.read::<4, u8>()?; |
2196 | | /// |
2197 | | /// let sample_rate_bits = r.read::<4, u8>()?; |
2198 | | /// |
2199 | | /// let channel_assignment = r.read::<4, u8>()?; |
2200 | | /// |
2201 | | /// let sample_size = match r.read::<3, u8>()? { |
2202 | | /// 0b000 => streaminfo.bits_per_sample, |
2203 | | /// 0b001 => 8, |
2204 | | /// 0b010 => 12, |
2205 | | /// 0b011 => return Err(FrameHeaderError::InvalidSampleSize), |
2206 | | /// 0b100 => 16, |
2207 | | /// 0b101 => 20, |
2208 | | /// 0b110 => 24, |
2209 | | /// 0b111 => 32, |
2210 | | /// _ => unreachable!(), |
2211 | | /// }; |
2212 | | /// |
2213 | | /// if r.read_bit()? != false { |
2214 | | /// return Err(FrameHeaderError::InvalidReservedBit); |
2215 | | /// } |
2216 | | /// |
2217 | | /// let frame_number = read_utf8(r)?; |
2218 | | /// |
2219 | | /// Ok(FrameHeader { |
2220 | | /// variable_block_size, |
2221 | | /// block_size: match block_size_bits { |
2222 | | /// 0b0000 => return Err(FrameHeaderError::InvalidBlockSize), |
2223 | | /// 0b0001 => 192, |
2224 | | /// n @ 0b010..=0b0101 => 576 * (1 << (n - 2)), |
2225 | | /// 0b0110 => r.read::<8, u32>()? + 1, |
2226 | | /// 0b0111 => r.read::<16, u32>()? + 1, |
2227 | | /// n @ 0b1000..=0b1111 => 256 * (1 << (n - 8)), |
2228 | | /// _ => unreachable!(), |
2229 | | /// }, |
2230 | | /// sample_rate: match sample_rate_bits { |
2231 | | /// 0b0000 => streaminfo.sample_rate, |
2232 | | /// 0b0001 => 88200, |
2233 | | /// 0b0010 => 176400, |
2234 | | /// 0b0011 => 192000, |
2235 | | /// 0b0100 => 8000, |
2236 | | /// 0b0101 => 16000, |
2237 | | /// 0b0110 => 22050, |
2238 | | /// 0b0111 => 24000, |
2239 | | /// 0b1000 => 32000, |
2240 | | /// 0b1001 => 44100, |
2241 | | /// 0b1010 => 48000, |
2242 | | /// 0b1011 => 96000, |
2243 | | /// 0b1100 => r.read::<8, u32>()? * 1000, |
2244 | | /// 0b1101 => r.read::<16, u32>()?, |
2245 | | /// 0b1110 => r.read::<16, u32>()? * 10, |
2246 | | /// 0b1111 => return Err(FrameHeaderError::InvalidSampleRate), |
2247 | | /// _ => unreachable!(), |
2248 | | /// }, |
2249 | | /// channel_assignment, |
2250 | | /// sample_size, |
2251 | | /// frame_number, |
2252 | | /// crc8: r.read::<8, _>()? |
2253 | | /// }) |
2254 | | /// } |
2255 | | /// } |
2256 | | /// |
2257 | | /// #[derive(Debug)] |
2258 | | /// enum FrameHeaderError { |
2259 | | /// Io(std::io::Error), |
2260 | | /// InvalidSync, |
2261 | | /// InvalidReservedBit, |
2262 | | /// InvalidSampleSize, |
2263 | | /// InvalidBlockSize, |
2264 | | /// InvalidSampleRate, |
2265 | | /// } |
2266 | | /// |
2267 | | /// impl From<std::io::Error> for FrameHeaderError { |
2268 | | /// fn from(err: std::io::Error) -> Self { |
2269 | | /// Self::Io(err) |
2270 | | /// } |
2271 | | /// } |
2272 | | /// |
2273 | | /// fn read_utf8<R: BitRead + ?Sized>(r: &mut R) -> Result<u64, std::io::Error> { |
2274 | | /// r.read::<8, _>() // left unimplimented in this example |
2275 | | /// } |
2276 | | /// |
2277 | | /// let mut reader = BitReader::endian(b"\xFF\xF8\xC9\x18\x00\xC2".as_slice(), BigEndian); |
2278 | | /// assert_eq!( |
2279 | | /// reader.parse_with::<FrameHeader>(&Streaminfo::default()).unwrap(), |
2280 | | /// FrameHeader { |
2281 | | /// variable_block_size: false, |
2282 | | /// block_size: 4096, |
2283 | | /// sample_rate: 44100, |
2284 | | /// channel_assignment: 1, |
2285 | | /// sample_size: 16, |
2286 | | /// frame_number: 0, |
2287 | | /// crc8: 0xC2, |
2288 | | /// } |
2289 | | /// ); |
2290 | | /// ``` |
2291 | | /// |
2292 | | /// # Example with lifetime-contrained `Context` |
2293 | | /// |
2294 | | /// In some cases, the `Context` can depend on a reference to another `struct`. |
2295 | | /// |
2296 | | /// ``` |
2297 | | /// use std::io::Read; |
2298 | | /// use bitstream_io::{BigEndian, BitRead, BitReader, FromBitStreamWith}; |
2299 | | /// |
2300 | | /// #[derive(Default)] |
2301 | | /// struct ModeParameters { |
2302 | | /// size_len: u8, |
2303 | | /// index_len: u8, |
2304 | | /// index_delta_len: u8, |
2305 | | /// // ... |
2306 | | /// } |
2307 | | /// |
2308 | | /// struct AuHeaderParseContext<'a> { |
2309 | | /// params: &'a ModeParameters, |
2310 | | /// base_index: Option<u32>, |
2311 | | /// } |
2312 | | /// |
2313 | | /// #[derive(Debug, PartialEq, Eq)] |
2314 | | /// struct AuHeader { |
2315 | | /// size: u32, |
2316 | | /// index: u32, |
2317 | | /// // ... |
2318 | | /// } |
2319 | | /// |
2320 | | /// impl<'a> FromBitStreamWith<'a> for AuHeader { |
2321 | | /// type Context = AuHeaderParseContext<'a>; |
2322 | | /// |
2323 | | /// type Error = AuHeaderError; |
2324 | | /// |
2325 | | /// fn from_reader<R: BitRead + ?Sized>( |
2326 | | /// r: &mut R, |
2327 | | /// ctx: &AuHeaderParseContext<'a>, |
2328 | | /// ) -> Result<Self, Self::Error> { |
2329 | | /// let size = r.read_var::<u32>(ctx.params.size_len as u32)?; |
2330 | | /// let index = match ctx.base_index { |
2331 | | /// None => r.read_var::<u32>(ctx.params.index_len as u32)?, |
2332 | | /// Some(base_index) => { |
2333 | | /// base_index |
2334 | | /// + 1 |
2335 | | /// + r.read_var::<u32>(ctx.params.index_delta_len as u32)? |
2336 | | /// } |
2337 | | /// }; |
2338 | | /// |
2339 | | /// Ok(AuHeader { |
2340 | | /// size, |
2341 | | /// index, |
2342 | | /// // ... |
2343 | | /// }) |
2344 | | /// } |
2345 | | /// } |
2346 | | /// |
2347 | | /// #[derive(Debug)] |
2348 | | /// enum AuHeaderError { |
2349 | | /// Io(std::io::Error), |
2350 | | /// } |
2351 | | /// |
2352 | | /// impl From<std::io::Error> for AuHeaderError { |
2353 | | /// fn from(err: std::io::Error) -> Self { |
2354 | | /// Self::Io(err) |
2355 | | /// } |
2356 | | /// } |
2357 | | /// |
2358 | | /// let mut reader = BitReader::endian(b"\xFF\xEA\xFF\x10".as_slice(), BigEndian); |
2359 | | /// |
2360 | | /// let mode_params = ModeParameters { |
2361 | | /// size_len: 10, |
2362 | | /// index_len: 6, |
2363 | | /// index_delta_len: 2, |
2364 | | /// // ... |
2365 | | /// }; |
2366 | | /// |
2367 | | /// let mut ctx = AuHeaderParseContext { |
2368 | | /// params: &mode_params, |
2369 | | /// base_index: None, |
2370 | | /// }; |
2371 | | /// |
2372 | | /// let header1 = reader.parse_with::<AuHeader>(&ctx).unwrap(); |
2373 | | /// assert_eq!( |
2374 | | /// header1, |
2375 | | /// AuHeader { |
2376 | | /// size: 1023, |
2377 | | /// index: 42, |
2378 | | /// } |
2379 | | /// ); |
2380 | | /// |
2381 | | /// ctx.base_index = Some(header1.index); |
2382 | | /// |
2383 | | /// assert_eq!( |
2384 | | /// reader.parse_with::<AuHeader>(&ctx).unwrap(), |
2385 | | /// AuHeader { |
2386 | | /// size: 1020, |
2387 | | /// index: 44, |
2388 | | /// } |
2389 | | /// ); |
2390 | | /// ``` |
2391 | | pub trait FromBitStreamWith<'a> { |
2392 | | /// Some context to use when parsing |
2393 | | type Context: 'a; |
2394 | | |
2395 | | /// Error generated during parsing, such as `io::Error` |
2396 | | type Error; |
2397 | | |
2398 | | /// Parse Self from reader with the given context |
2399 | | fn from_reader<R: BitRead + ?Sized>( |
2400 | | r: &mut R, |
2401 | | context: &Self::Context, |
2402 | | ) -> Result<Self, Self::Error> |
2403 | | where |
2404 | | Self: Sized; |
2405 | | } |
2406 | | |
2407 | | /// Implemented by complex types that consume some immutable context |
2408 | | /// to parse themselves from a reader. |
2409 | | /// |
2410 | | /// Like [`FromBitStreamWith`], but consumes its context |
2411 | | /// rather than taking a shared reference to it. |
2412 | | pub trait FromBitStreamUsing { |
2413 | | /// Some context to consume when parsing |
2414 | | type Context; |
2415 | | |
2416 | | /// Error generated during parsing, such as `io::Error` |
2417 | | type Error; |
2418 | | |
2419 | | /// Parse Self from reader with the given context |
2420 | | fn from_reader<R: BitRead + ?Sized>( |
2421 | | r: &mut R, |
2422 | | context: Self::Context, |
2423 | | ) -> Result<Self, Self::Error> |
2424 | | where |
2425 | | Self: Sized; |
2426 | | } |
2427 | | |
2428 | | /// Implemented by complex types that don't require any additional context |
2429 | | /// to parse themselves from a reader. Analagous to `FromStr`. |
2430 | | pub trait FromByteStream { |
2431 | | /// Error generated during parsing, such as `io::Error` |
2432 | | type Error; |
2433 | | |
2434 | | /// Parse Self from reader |
2435 | | fn from_reader<R: ByteRead + ?Sized>(r: &mut R) -> Result<Self, Self::Error> |
2436 | | where |
2437 | | Self: Sized; |
2438 | | } |
2439 | | |
2440 | | /// Implemented by complex types that require some additional context |
2441 | | /// to parse themselves from a reader. Analagous to `FromStr`. |
2442 | | pub trait FromByteStreamWith<'a> { |
2443 | | /// Some context to use when parsing |
2444 | | type Context: 'a; |
2445 | | |
2446 | | /// Error generated during parsing, such as `io::Error` |
2447 | | type Error; |
2448 | | |
2449 | | /// Parse Self from reader |
2450 | | fn from_reader<R: ByteRead + ?Sized>( |
2451 | | r: &mut R, |
2452 | | context: &Self::Context, |
2453 | | ) -> Result<Self, Self::Error> |
2454 | | where |
2455 | | Self: Sized; |
2456 | | } |
2457 | | |
2458 | | /// Implemented by complex types that consume some additional context |
2459 | | /// to parse themselves from a reader. |
2460 | | /// |
2461 | | /// Like [`FromByteStreamWith`], but consumes the context. |
2462 | | pub trait FromByteStreamUsing { |
2463 | | /// Some context to use when parsing |
2464 | | type Context; |
2465 | | |
2466 | | /// Error generated during parsing, such as `io::Error` |
2467 | | type Error; |
2468 | | |
2469 | | /// Parse Self from reader |
2470 | | fn from_reader<R: ByteRead + ?Sized>( |
2471 | | r: &mut R, |
2472 | | context: Self::Context, |
2473 | | ) -> Result<Self, Self::Error> |
2474 | | where |
2475 | | Self: Sized; |
2476 | | } |
2477 | | |
2478 | | #[cfg(feature = "alloc")] |
2479 | 0 | fn read_to_vec( |
2480 | 0 | mut read: impl FnMut(&mut [u8]) -> io::Result<()>, |
2481 | 0 | bytes: usize, |
2482 | 0 | ) -> io::Result<Vec<u8>> { |
2483 | | const MAX_CHUNK: usize = 4096; |
2484 | | |
2485 | 0 | match bytes { |
2486 | 0 | 0 => Ok(Vec::new()), |
2487 | 0 | bytes if bytes <= MAX_CHUNK => { |
2488 | 0 | let mut buf = vec![0; bytes]; |
2489 | 0 | read(&mut buf)?; |
2490 | 0 | Ok(buf) |
2491 | | } |
2492 | 0 | mut bytes => { |
2493 | 0 | let mut whole = Vec::with_capacity(MAX_CHUNK); |
2494 | 0 | let mut chunk: [u8; MAX_CHUNK] = [0; MAX_CHUNK]; |
2495 | 0 | while bytes > 0 { |
2496 | 0 | let chunk_size = bytes.min(MAX_CHUNK); |
2497 | 0 | let chunk = &mut chunk[0..chunk_size]; |
2498 | 0 | read(chunk)?; |
2499 | 0 | whole.extend_from_slice(chunk); |
2500 | 0 | bytes -= chunk_size; |
2501 | | } |
2502 | 0 | Ok(whole) |
2503 | | } |
2504 | | } |
2505 | 0 | } |