/rust/registry/src/index.crates.io-6f17d22bba15001f/bitstream-io-1.10.0/src/read.rs
Line | Count | Source (jump to first uncovered line) |
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 | | //! ## Example |
12 | | //! |
13 | | //! Reading the initial STREAMINFO block from a FLAC file, |
14 | | //! as documented in its |
15 | | //! [specification](https://xiph.org/flac/format.html#stream). |
16 | | //! |
17 | | //! ``` |
18 | | //! use std::io::{Cursor, Read}; |
19 | | //! use bitstream_io::{BigEndian, BitReader, BitRead, ByteReader, ByteRead, FromBitStream, FromByteStream, LittleEndian}; |
20 | | //! |
21 | | //! let flac: Vec<u8> = vec![0x66,0x4c,0x61,0x43,0x00,0x00,0x00,0x22, |
22 | | //! 0x10,0x00,0x10,0x00,0x00,0x06,0x06,0x00, |
23 | | //! 0x21,0x62,0x0a,0xc4,0x42,0xf0,0x00,0x04, |
24 | | //! 0xa6,0xcc,0xfa,0xf2,0x69,0x2f,0xfd,0xec, |
25 | | //! 0x2d,0x5b,0x30,0x01,0x76,0xb4,0x62,0x88, |
26 | | //! 0x7d,0x92,0x04,0x00,0x00,0x7a,0x20,0x00, |
27 | | //! 0x00,0x00,0x72,0x65,0x66,0x65,0x72,0x65, |
28 | | //! 0x6e,0x63,0x65,0x20,0x6c,0x69,0x62,0x46, |
29 | | //! 0x4c,0x41,0x43,0x20,0x31,0x2e,0x31,0x2e, |
30 | | //! 0x34,0x20,0x32,0x30,0x30,0x37,0x30,0x32, |
31 | | //! 0x31,0x33,0x04,0x00,0x00,0x00,0x16,0x00, |
32 | | //! 0x00,0x00,0x74,0x69,0x74,0x6c,0x65,0x3d, |
33 | | //! 0x32,0x63,0x68,0x20,0x34,0x34,0x31,0x30, |
34 | | //! 0x30,0x20,0x20,0x31,0x36,0x62,0x69,0x74, |
35 | | //! 0x10,0x00,0x00,0x00,0x61,0x6c,0x62,0x75, |
36 | | //! 0x6d,0x3d,0x54,0x65,0x73,0x74,0x20,0x41, |
37 | | //! 0x6c,0x62,0x75,0x6d,0x0f,0x00,0x00,0x00, |
38 | | //! 0x61,0x72,0x74,0x69,0x73,0x74,0x3d,0x41, |
39 | | //! 0x73,0x73,0x6f,0x72,0x74,0x65,0x64,0x0d, |
40 | | //! 0x00,0x00,0x00,0x74,0x72,0x61,0x63,0x6b, |
41 | | //! 0x6e,0x75,0x6d,0x62,0x65,0x72,0x3d,0x31]; |
42 | | //! |
43 | | //! #[derive(Debug, PartialEq, Eq)] |
44 | | //! struct BlockHeader { |
45 | | //! last_block: bool, |
46 | | //! block_type: u8, |
47 | | //! block_size: u32, |
48 | | //! } |
49 | | //! |
50 | | //! impl FromBitStream for BlockHeader { |
51 | | //! type Error = std::io::Error; |
52 | | //! |
53 | | //! fn from_reader<R: BitRead + ?Sized>(r: &mut R) -> std::io::Result<Self> { |
54 | | //! Ok(Self { |
55 | | //! last_block: r.read_bit()?, |
56 | | //! block_type: r.read(7)?, |
57 | | //! block_size: r.read(24)?, |
58 | | //! }) |
59 | | //! } |
60 | | //! } |
61 | | //! |
62 | | //! #[derive(Debug, PartialEq, Eq)] |
63 | | //! struct Streaminfo { |
64 | | //! minimum_block_size: u16, |
65 | | //! maximum_block_size: u16, |
66 | | //! minimum_frame_size: u32, |
67 | | //! maximum_frame_size: u32, |
68 | | //! sample_rate: u32, |
69 | | //! channels: u8, |
70 | | //! bits_per_sample: u8, |
71 | | //! total_samples: u64, |
72 | | //! md5: [u8; 16], |
73 | | //! } |
74 | | //! |
75 | | //! impl FromBitStream for Streaminfo { |
76 | | //! type Error = std::io::Error; |
77 | | //! |
78 | | //! fn from_reader<R: BitRead + ?Sized>(r: &mut R) -> std::io::Result<Self> { |
79 | | //! Ok(Self { |
80 | | //! minimum_block_size: r.read_to()?, |
81 | | //! maximum_block_size: r.read_to()?, |
82 | | //! minimum_frame_size: r.read(24)?, |
83 | | //! maximum_frame_size: r.read(24)?, |
84 | | //! sample_rate: r.read(20)?, |
85 | | //! channels: r.read::<u8>(3)? + 1, |
86 | | //! bits_per_sample: r.read::<u8>(5)? + 1, |
87 | | //! total_samples: r.read(36)?, |
88 | | //! md5: r.read_to()?, |
89 | | //! }) |
90 | | //! } |
91 | | //! } |
92 | | //! |
93 | | //! #[derive(Debug, PartialEq, Eq)] |
94 | | //! struct VorbisComment { |
95 | | //! vendor: String, |
96 | | //! comment: Vec<String>, |
97 | | //! } |
98 | | //! |
99 | | //! impl FromByteStream for VorbisComment { |
100 | | //! type Error = Box<dyn std::error::Error>; |
101 | | //! |
102 | | //! fn from_reader<R: ByteRead + ?Sized>(r: &mut R) -> Result<Self, Self::Error> { |
103 | | //! fn read_entry<R: ByteRead + ?Sized>( |
104 | | //! r: &mut R, |
105 | | //! ) -> Result<String, Box<dyn std::error::Error>> { |
106 | | //! use std::convert::TryInto; |
107 | | //! let size = r.read::<u32>()?.try_into()?; |
108 | | //! Ok(String::from_utf8(r.read_to_vec(size)?)?) |
109 | | //! } |
110 | | //! |
111 | | //! Ok(Self { |
112 | | //! vendor: read_entry(r)?, |
113 | | //! comment: (0..r.read::<u32>()?) |
114 | | //! .map(|_| read_entry(r)) |
115 | | //! .collect::<Result<Vec<_>, _>>()?, |
116 | | //! }) |
117 | | //! } |
118 | | //! } |
119 | | //! |
120 | | //! let mut cursor = Cursor::new(&flac); |
121 | | //! |
122 | | //! let mut reader = BitReader::endian(&mut cursor, BigEndian); |
123 | | //! |
124 | | //! // stream marker |
125 | | //! assert_eq!(&reader.read_to::<[u8; 4]>().unwrap(), b"fLaC"); |
126 | | //! |
127 | | //! // metadata block header |
128 | | //! assert_eq!( |
129 | | //! reader.parse::<BlockHeader>().unwrap(), |
130 | | //! BlockHeader { last_block: false, block_type: 0, block_size: 34 } |
131 | | //! ); |
132 | | //! |
133 | | //! // STREAMINFO block |
134 | | //! assert_eq!( |
135 | | //! reader.parse::<Streaminfo>().unwrap(), |
136 | | //! Streaminfo { |
137 | | //! minimum_block_size: 4096, |
138 | | //! maximum_block_size: 4096, |
139 | | //! minimum_frame_size: 1542, |
140 | | //! maximum_frame_size: 8546, |
141 | | //! sample_rate: 44100, |
142 | | //! channels: 2, |
143 | | //! bits_per_sample: 16, |
144 | | //! total_samples: 304844, |
145 | | //! md5: *b"\xFA\xF2\x69\x2F\xFD\xEC\x2D\x5B\x30\x01\x76\xB4\x62\x88\x7D\x92", |
146 | | //! } |
147 | | //! ); |
148 | | //! |
149 | | //! // metadata block header |
150 | | //! assert_eq!( |
151 | | //! reader.parse::<BlockHeader>().unwrap(), |
152 | | //! BlockHeader { last_block: false, block_type: 4, block_size: 122 } |
153 | | //! ); |
154 | | //! |
155 | | //! // VORBIS_COMMENT block (little endian) |
156 | | //! assert_eq!( |
157 | | //! ByteReader::endian(reader.reader().unwrap(), LittleEndian).parse::<VorbisComment>().unwrap(), |
158 | | //! VorbisComment { |
159 | | //! vendor: "reference libFLAC 1.1.4 20070213".to_string(), |
160 | | //! comment: vec![ |
161 | | //! "title=2ch 44100 16bit".to_string(), |
162 | | //! "album=Test Album".to_string(), |
163 | | //! "artist=Assorted".to_string(), |
164 | | //! "tracknumber=1".to_string(), |
165 | | //! ], |
166 | | //! } |
167 | | //! ); |
168 | | |
169 | | #![warn(missing_docs)] |
170 | | |
171 | | use std::io; |
172 | | |
173 | | use super::{ |
174 | | huffman::ReadHuffmanTree, BitQueue, Endianness, Numeric, PhantomData, Primitive, SignedNumeric, |
175 | | }; |
176 | | |
177 | | /// A trait for anything that can read a variable number of |
178 | | /// potentially un-aligned values from an input stream |
179 | | pub trait BitRead { |
180 | | /// Reads a single bit from the stream. |
181 | | /// `true` indicates 1, `false` indicates 0 |
182 | | /// |
183 | | /// # Errors |
184 | | /// |
185 | | /// Passes along any I/O error from the underlying stream. |
186 | | fn read_bit(&mut self) -> io::Result<bool>; |
187 | | |
188 | | /// Reads an unsigned value from the stream with |
189 | | /// the given number of bits. |
190 | | /// |
191 | | /// # Errors |
192 | | /// |
193 | | /// Passes along any I/O error from the underlying stream. |
194 | | /// Also returns an error if the output type is too small |
195 | | /// to hold the requested number of bits. |
196 | | fn read<U>(&mut self, bits: u32) -> io::Result<U> |
197 | | where |
198 | | U: Numeric; |
199 | | |
200 | | /// Reads a twos-complement signed value from the stream with |
201 | | /// the given number of bits. |
202 | | /// |
203 | | /// # Errors |
204 | | /// |
205 | | /// Passes along any I/O error from the underlying stream. |
206 | | /// Also returns an error if the output type is too small |
207 | | /// to hold the requested number of bits. |
208 | | fn read_signed<S>(&mut self, bits: u32) -> io::Result<S> |
209 | | where |
210 | | S: SignedNumeric; |
211 | | |
212 | | /// Reads whole value from the stream whose size in bits is equal |
213 | | /// to its type's size. |
214 | | /// |
215 | | /// # Errors |
216 | | /// |
217 | | /// Passes along any I/O error from the underlying stream. |
218 | | fn read_to<V>(&mut self) -> io::Result<V> |
219 | | where |
220 | | V: Primitive; |
221 | | |
222 | | /// Skips the given number of bits in the stream. |
223 | | /// Since this method does not need an accumulator, |
224 | | /// it may be slightly faster than reading to an empty variable. |
225 | | /// In addition, since there is no accumulator, |
226 | | /// there is no upper limit on the number of bits |
227 | | /// which may be skipped. |
228 | | /// These bits are still read from the stream, however, |
229 | | /// and are never skipped via a `seek` method. |
230 | | /// |
231 | | /// # Errors |
232 | | /// |
233 | | /// Passes along any I/O error from the underlying stream. |
234 | | fn skip(&mut self, bits: u32) -> io::Result<()>; |
235 | | |
236 | | /// Completely fills the given buffer with whole bytes. |
237 | | /// If the stream is already byte-aligned, it will map |
238 | | /// to a faster `read_exact` call. Otherwise it will read |
239 | | /// bytes individually in 8-bit increments. |
240 | | /// |
241 | | /// # Errors |
242 | | /// |
243 | | /// Passes along any I/O error from the underlying stream. |
244 | 0 | fn read_bytes(&mut self, buf: &mut [u8]) -> io::Result<()> { |
245 | 0 | for b in buf.iter_mut() { |
246 | 0 | *b = self.read(8)?; |
247 | | } |
248 | 0 | Ok(()) |
249 | 0 | } |
250 | | |
251 | | /// Completely fills a whole buffer with bytes and returns it. |
252 | | /// If the stream is already byte-aligned, it will map |
253 | | /// to a faster `read_exact` call. Otherwise it will read |
254 | | /// bytes individually in 8-bit increments. |
255 | | /// |
256 | | /// # Errors |
257 | | /// |
258 | | /// Passes along any I/O error from the underlying stream. |
259 | | #[inline(always)] |
260 | | #[deprecated(since = "1.8.0", note = "use read_to() method instead")] |
261 | 0 | fn read_to_bytes<const SIZE: usize>(&mut self) -> io::Result<[u8; SIZE]> { |
262 | 0 | self.read_to() |
263 | 0 | } |
264 | | |
265 | | /// Completely fills a vector of bytes and returns it. |
266 | | /// If the stream is already byte-aligned, it will map |
267 | | /// to a faster `read_exact` call. Otherwise it will read |
268 | | /// bytes individually in 8-bit increments. |
269 | | /// |
270 | | /// # Errors |
271 | | /// |
272 | | /// Passes along any I/O error from the underlying stream. |
273 | 0 | fn read_to_vec(&mut self, bytes: usize) -> io::Result<Vec<u8>> { |
274 | 0 | let mut buf = vec![0; bytes]; |
275 | 0 | self.read_bytes(&mut buf)?; |
276 | 0 | Ok(buf) |
277 | 0 | } |
278 | | |
279 | | /// Counts the number of 1 bits in the stream until the next |
280 | | /// 0 bit and returns the amount read. |
281 | | /// Because this field is variably-sized and may be large, |
282 | | /// its output is always a `u32` type. |
283 | | /// |
284 | | /// # Errors |
285 | | /// |
286 | | /// Passes along any I/O error from the underlying stream. |
287 | 0 | fn read_unary0(&mut self) -> io::Result<u32> { |
288 | 0 | let mut unary = 0; |
289 | 0 | while self.read_bit()? { |
290 | 0 | unary += 1; |
291 | 0 | } |
292 | 0 | Ok(unary) |
293 | 0 | } |
294 | | |
295 | | /// Counts the number of 0 bits in the stream until the next |
296 | | /// 1 bit and returns the amount read. |
297 | | /// Because this field is variably-sized and may be large, |
298 | | /// its output is always a `u32` type. |
299 | | /// |
300 | | /// # Errors |
301 | | /// |
302 | | /// Passes along any I/O error from the underlying stream. |
303 | 0 | fn read_unary1(&mut self) -> io::Result<u32> { |
304 | 0 | let mut unary = 0; |
305 | 0 | while !(self.read_bit()?) { |
306 | 0 | unary += 1; |
307 | 0 | } |
308 | 0 | Ok(unary) |
309 | 0 | } |
310 | | |
311 | | /// Parses and returns complex type |
312 | 0 | fn parse<F: FromBitStream>(&mut self) -> Result<F, F::Error> { |
313 | 0 | F::from_reader(self) |
314 | 0 | } |
315 | | |
316 | | /// Parses and returns complex type with context |
317 | 0 | fn parse_with<F: FromBitStreamWith>(&mut self, context: &F::Context) -> Result<F, F::Error> { |
318 | 0 | F::from_reader(self, context) |
319 | 0 | } |
320 | | |
321 | | /// Returns true if the stream is aligned at a whole byte. |
322 | | fn byte_aligned(&self) -> bool; |
323 | | |
324 | | /// Throws away all unread bit values until the next whole byte. |
325 | | /// Does nothing if the stream is already aligned. |
326 | | fn byte_align(&mut self); |
327 | | } |
328 | | |
329 | | /// A trait for anything that can read Huffman codes |
330 | | /// of a given endianness from an input stream |
331 | | pub trait HuffmanRead<E: Endianness> { |
332 | | /// Given a compiled Huffman tree, reads bits from the stream |
333 | | /// until the next symbol is encountered. |
334 | | /// |
335 | | /// # Errors |
336 | | /// |
337 | | /// Passes along any I/O error from the underlying stream. |
338 | | fn read_huffman<T>(&mut self, tree: &[ReadHuffmanTree<E, T>]) -> io::Result<T> |
339 | | where |
340 | | T: Clone; |
341 | | } |
342 | | |
343 | | /// For reading non-aligned bits from a stream of bytes in a given endianness. |
344 | | /// |
345 | | /// This will read exactly as many whole bytes needed to return |
346 | | /// the requested number of bits. It may cache up to a single partial byte |
347 | | /// but no more. |
348 | | #[derive(Clone)] |
349 | | pub struct BitReader<R: io::Read, E: Endianness> { |
350 | | reader: R, |
351 | | bitqueue: BitQueue<E, u8>, |
352 | | } |
353 | | |
354 | | impl<R: io::Read, E: Endianness> BitReader<R, E> { |
355 | | /// Wraps a BitReader around something that implements `Read` |
356 | 32.6k | pub fn new(reader: R) -> BitReader<R, E> { |
357 | 32.6k | BitReader { |
358 | 32.6k | reader, |
359 | 32.6k | bitqueue: BitQueue::new(), |
360 | 32.6k | } |
361 | 32.6k | } <bitstream_io::read::BitReader<std::io::cursor::Cursor<[u8; 5]>, bitstream_io::LittleEndian>>::new Line | Count | Source | 356 | 3.09k | pub fn new(reader: R) -> BitReader<R, E> { | 357 | 3.09k | BitReader { | 358 | 3.09k | reader, | 359 | 3.09k | bitqueue: BitQueue::new(), | 360 | 3.09k | } | 361 | 3.09k | } |
<bitstream_io::read::BitReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>, bitstream_io::LittleEndian>>::new Line | Count | Source | 356 | 29.5k | pub fn new(reader: R) -> BitReader<R, E> { | 357 | 29.5k | BitReader { | 358 | 29.5k | reader, | 359 | 29.5k | bitqueue: BitQueue::new(), | 360 | 29.5k | } | 361 | 29.5k | } |
Unexecuted instantiation: <bitstream_io::read::BitReader<_, _>>::new |
362 | | |
363 | | /// Wraps a BitReader around something that implements `Read` |
364 | | /// with the given endianness. |
365 | 0 | pub fn endian(reader: R, _endian: E) -> BitReader<R, E> { |
366 | 0 | BitReader { |
367 | 0 | reader, |
368 | 0 | bitqueue: BitQueue::new(), |
369 | 0 | } |
370 | 0 | } |
371 | | |
372 | | /// Unwraps internal reader and disposes of BitReader. |
373 | | /// |
374 | | /// # Warning |
375 | | /// |
376 | | /// Any unread partial bits are discarded. |
377 | | #[inline] |
378 | 12.0k | pub fn into_reader(self) -> R { |
379 | 12.0k | self.reader |
380 | 12.0k | } <bitstream_io::read::BitReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>, bitstream_io::LittleEndian>>::into_reader Line | Count | Source | 378 | 12.0k | pub fn into_reader(self) -> R { | 379 | 12.0k | self.reader | 380 | 12.0k | } |
Unexecuted instantiation: <bitstream_io::read::BitReader<_, _>>::into_reader |
381 | | |
382 | | /// If stream is byte-aligned, provides mutable reference |
383 | | /// to internal reader. Otherwise returns `None` |
384 | | #[inline] |
385 | 0 | pub fn reader(&mut self) -> Option<&mut R> { |
386 | 0 | if self.byte_aligned() { |
387 | 0 | Some(&mut self.reader) |
388 | | } else { |
389 | 0 | None |
390 | | } |
391 | 0 | } |
392 | | |
393 | | /// Converts `BitReader` to `ByteReader` in the same endianness. |
394 | | /// |
395 | | /// # Warning |
396 | | /// |
397 | | /// Any unread partial bits are discarded. |
398 | | #[inline] |
399 | 0 | pub fn into_bytereader(self) -> ByteReader<R, E> { |
400 | 0 | ByteReader::new(self.into_reader()) |
401 | 0 | } |
402 | | |
403 | | /// If stream is byte-aligned, provides temporary `ByteReader` |
404 | | /// in the same endianness. Otherwise returns `None` |
405 | | /// |
406 | | /// # Warning |
407 | | /// |
408 | | /// Any reader bits left over when `ByteReader` is dropped are lost. |
409 | | #[inline] |
410 | 0 | pub fn bytereader(&mut self) -> Option<ByteReader<&mut R, E>> { |
411 | 0 | self.reader().map(ByteReader::new) |
412 | 0 | } |
413 | | |
414 | | /// Consumes reader and returns any un-read partial byte |
415 | | /// as a `(bits, value)` tuple. |
416 | | /// |
417 | | /// # Examples |
418 | | /// ``` |
419 | | /// use std::io::{Read, Cursor}; |
420 | | /// use bitstream_io::{BigEndian, BitReader, BitRead}; |
421 | | /// let data = [0b1010_0101, 0b0101_1010]; |
422 | | /// let mut reader = BitReader::endian(Cursor::new(&data), BigEndian); |
423 | | /// assert_eq!(reader.read::<u16>(9).unwrap(), 0b1010_0101_0); |
424 | | /// let (bits, value) = reader.into_unread(); |
425 | | /// assert_eq!(bits, 7); |
426 | | /// assert_eq!(value, 0b101_1010); |
427 | | /// ``` |
428 | | /// |
429 | | /// ``` |
430 | | /// use std::io::{Read, Cursor}; |
431 | | /// use bitstream_io::{BigEndian, BitReader, BitRead}; |
432 | | /// let data = [0b1010_0101, 0b0101_1010]; |
433 | | /// let mut reader = BitReader::endian(Cursor::new(&data), BigEndian); |
434 | | /// assert_eq!(reader.read::<u16>(8).unwrap(), 0b1010_0101); |
435 | | /// let (bits, value) = reader.into_unread(); |
436 | | /// assert_eq!(bits, 0); |
437 | | /// assert_eq!(value, 0); |
438 | | /// ``` |
439 | | #[inline] |
440 | 0 | pub fn into_unread(self) -> (u32, u8) { |
441 | 0 | (self.bitqueue.len(), self.bitqueue.value()) |
442 | 0 | } |
443 | | } |
444 | | |
445 | | impl<R: io::Read, E: Endianness> BitRead for BitReader<R, E> { |
446 | | /// # Examples |
447 | | /// |
448 | | /// ``` |
449 | | /// use std::io::{Read, Cursor}; |
450 | | /// use bitstream_io::{BigEndian, BitReader, BitRead}; |
451 | | /// let data = [0b10110111]; |
452 | | /// let mut reader = BitReader::endian(Cursor::new(&data), BigEndian); |
453 | | /// assert_eq!(reader.read_bit().unwrap(), true); |
454 | | /// assert_eq!(reader.read_bit().unwrap(), false); |
455 | | /// assert_eq!(reader.read_bit().unwrap(), true); |
456 | | /// assert_eq!(reader.read_bit().unwrap(), true); |
457 | | /// assert_eq!(reader.read_bit().unwrap(), false); |
458 | | /// assert_eq!(reader.read_bit().unwrap(), true); |
459 | | /// assert_eq!(reader.read_bit().unwrap(), true); |
460 | | /// assert_eq!(reader.read_bit().unwrap(), true); |
461 | | /// ``` |
462 | | /// |
463 | | /// ``` |
464 | | /// use std::io::{Read, Cursor}; |
465 | | /// use bitstream_io::{LittleEndian, BitReader, BitRead}; |
466 | | /// let data = [0b10110111]; |
467 | | /// let mut reader = BitReader::endian(Cursor::new(&data), LittleEndian); |
468 | | /// assert_eq!(reader.read_bit().unwrap(), true); |
469 | | /// assert_eq!(reader.read_bit().unwrap(), true); |
470 | | /// assert_eq!(reader.read_bit().unwrap(), true); |
471 | | /// assert_eq!(reader.read_bit().unwrap(), false); |
472 | | /// assert_eq!(reader.read_bit().unwrap(), true); |
473 | | /// assert_eq!(reader.read_bit().unwrap(), true); |
474 | | /// assert_eq!(reader.read_bit().unwrap(), false); |
475 | | /// assert_eq!(reader.read_bit().unwrap(), true); |
476 | | /// ``` |
477 | | #[inline(always)] |
478 | 5.27M | fn read_bit(&mut self) -> io::Result<bool> { |
479 | 5.27M | if self.bitqueue.is_empty() { |
480 | 706k | self.bitqueue.set(read_byte(&mut self.reader)?, 8); |
481 | 4.57M | } |
482 | 5.27M | Ok(self.bitqueue.pop(1) == 1) |
483 | 5.27M | } <bitstream_io::read::BitReader<std::io::cursor::Cursor<[u8; 5]>, bitstream_io::LittleEndian> as bitstream_io::read::BitRead>::read_bit Line | Count | Source | 478 | 3.08k | fn read_bit(&mut self) -> io::Result<bool> { | 479 | 3.08k | if self.bitqueue.is_empty() { | 480 | 0 | self.bitqueue.set(read_byte(&mut self.reader)?, 8); | 481 | 3.08k | } | 482 | 3.08k | Ok(self.bitqueue.pop(1) == 1) | 483 | 3.08k | } |
<bitstream_io::read::BitReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>, bitstream_io::LittleEndian> as bitstream_io::read::BitRead>::read_bit Line | Count | Source | 478 | 5.27M | fn read_bit(&mut self) -> io::Result<bool> { | 479 | 5.27M | if self.bitqueue.is_empty() { | 480 | 706k | self.bitqueue.set(read_byte(&mut self.reader)?, 8); | 481 | 4.56M | } | 482 | 5.27M | Ok(self.bitqueue.pop(1) == 1) | 483 | 5.27M | } |
Unexecuted instantiation: <bitstream_io::read::BitReader<_, _> as bitstream_io::read::BitRead>::read_bit |
484 | | |
485 | | /// # Examples |
486 | | /// ``` |
487 | | /// use std::io::{Read, Cursor}; |
488 | | /// use bitstream_io::{BigEndian, BitReader, BitRead}; |
489 | | /// let data = [0b10110111]; |
490 | | /// let mut reader = BitReader::endian(Cursor::new(&data), BigEndian); |
491 | | /// assert_eq!(reader.read::<u8>(1).unwrap(), 0b1); |
492 | | /// assert_eq!(reader.read::<u8>(2).unwrap(), 0b01); |
493 | | /// assert_eq!(reader.read::<u8>(5).unwrap(), 0b10111); |
494 | | /// ``` |
495 | | /// |
496 | | /// ``` |
497 | | /// use std::io::{Read, Cursor}; |
498 | | /// use bitstream_io::{LittleEndian, BitReader, BitRead}; |
499 | | /// let data = [0b10110111]; |
500 | | /// let mut reader = BitReader::endian(Cursor::new(&data), LittleEndian); |
501 | | /// assert_eq!(reader.read::<u8>(1).unwrap(), 0b1); |
502 | | /// assert_eq!(reader.read::<u8>(2).unwrap(), 0b11); |
503 | | /// assert_eq!(reader.read::<u8>(5).unwrap(), 0b10110); |
504 | | /// ``` |
505 | | /// |
506 | | /// ``` |
507 | | /// use std::io::{Read, Cursor}; |
508 | | /// use bitstream_io::{BigEndian, BitReader, BitRead}; |
509 | | /// let data = [0;10]; |
510 | | /// let mut reader = BitReader::endian(Cursor::new(&data), BigEndian); |
511 | | /// assert!(reader.read::<u8>(9).is_err()); // can't read 9 bits to u8 |
512 | | /// assert!(reader.read::<u16>(17).is_err()); // can't read 17 bits to u16 |
513 | | /// assert!(reader.read::<u32>(33).is_err()); // can't read 33 bits to u32 |
514 | | /// assert!(reader.read::<u64>(65).is_err()); // can't read 65 bits to u64 |
515 | | /// ``` |
516 | 3.46M | fn read<U>(&mut self, mut bits: u32) -> io::Result<U> |
517 | 3.46M | where |
518 | 3.46M | U: Numeric, |
519 | 3.46M | { |
520 | 3.46M | if bits <= U::BITS_SIZE { |
521 | 3.46M | let bitqueue_len = self.bitqueue.len(); |
522 | 3.46M | if bits <= bitqueue_len { |
523 | 1.52M | Ok(U::from_u8(self.bitqueue.pop(bits))) |
524 | | } else { |
525 | 1.94M | let mut acc = |
526 | 1.94M | BitQueue::from_value(U::from_u8(self.bitqueue.pop_all()), bitqueue_len); |
527 | 1.94M | bits -= bitqueue_len; |
528 | 1.94M | |
529 | 1.94M | read_aligned(&mut self.reader, bits / 8, &mut acc)?; |
530 | 1.94M | read_unaligned(&mut self.reader, bits % 8, &mut acc, &mut self.bitqueue)?; |
531 | 1.93M | Ok(acc.value()) |
532 | | } |
533 | | } else { |
534 | 0 | Err(io::Error::new( |
535 | 0 | io::ErrorKind::InvalidInput, |
536 | 0 | "excessive bits for type read", |
537 | 0 | )) |
538 | | } |
539 | 3.46M | } <bitstream_io::read::BitReader<std::io::cursor::Cursor<[u8; 5]>, bitstream_io::LittleEndian> as bitstream_io::read::BitRead>::read::<u8> Line | Count | Source | 516 | 6.18k | fn read<U>(&mut self, mut bits: u32) -> io::Result<U> | 517 | 6.18k | where | 518 | 6.18k | U: Numeric, | 519 | 6.18k | { | 520 | 6.18k | if bits <= U::BITS_SIZE { | 521 | 6.18k | let bitqueue_len = self.bitqueue.len(); | 522 | 6.18k | if bits <= bitqueue_len { | 523 | 3.08k | Ok(U::from_u8(self.bitqueue.pop(bits))) | 524 | | } else { | 525 | 3.09k | let mut acc = | 526 | 3.09k | BitQueue::from_value(U::from_u8(self.bitqueue.pop_all()), bitqueue_len); | 527 | 3.09k | bits -= bitqueue_len; | 528 | 3.09k | | 529 | 3.09k | read_aligned(&mut self.reader, bits / 8, &mut acc)?; | 530 | 3.09k | read_unaligned(&mut self.reader, bits % 8, &mut acc, &mut self.bitqueue)?; | 531 | 3.09k | Ok(acc.value()) | 532 | | } | 533 | | } else { | 534 | 0 | Err(io::Error::new( | 535 | 0 | io::ErrorKind::InvalidInput, | 536 | 0 | "excessive bits for type read", | 537 | 0 | )) | 538 | | } | 539 | 6.18k | } |
<bitstream_io::read::BitReader<std::io::cursor::Cursor<[u8; 5]>, bitstream_io::LittleEndian> as bitstream_io::read::BitRead>::read::<u16> Line | Count | Source | 516 | 6.17k | fn read<U>(&mut self, mut bits: u32) -> io::Result<U> | 517 | 6.17k | where | 518 | 6.17k | U: Numeric, | 519 | 6.17k | { | 520 | 6.17k | if bits <= U::BITS_SIZE { | 521 | 6.17k | let bitqueue_len = self.bitqueue.len(); | 522 | 6.17k | if bits <= bitqueue_len { | 523 | 0 | Ok(U::from_u8(self.bitqueue.pop(bits))) | 524 | | } else { | 525 | 6.17k | let mut acc = | 526 | 6.17k | BitQueue::from_value(U::from_u8(self.bitqueue.pop_all()), bitqueue_len); | 527 | 6.17k | bits -= bitqueue_len; | 528 | 6.17k | | 529 | 6.17k | read_aligned(&mut self.reader, bits / 8, &mut acc)?; | 530 | 6.17k | read_unaligned(&mut self.reader, bits % 8, &mut acc, &mut self.bitqueue)?; | 531 | 6.17k | Ok(acc.value()) | 532 | | } | 533 | | } else { | 534 | 0 | Err(io::Error::new( | 535 | 0 | io::ErrorKind::InvalidInput, | 536 | 0 | "excessive bits for type read", | 537 | 0 | )) | 538 | | } | 539 | 6.17k | } |
<bitstream_io::read::BitReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>, bitstream_io::LittleEndian> as bitstream_io::read::BitRead>::read::<u8> Line | Count | Source | 516 | 1.30M | fn read<U>(&mut self, mut bits: u32) -> io::Result<U> | 517 | 1.30M | where | 518 | 1.30M | U: Numeric, | 519 | 1.30M | { | 520 | 1.30M | if bits <= U::BITS_SIZE { | 521 | 1.30M | let bitqueue_len = self.bitqueue.len(); | 522 | 1.30M | if bits <= bitqueue_len { | 523 | 496k | Ok(U::from_u8(self.bitqueue.pop(bits))) | 524 | | } else { | 525 | 807k | let mut acc = | 526 | 807k | BitQueue::from_value(U::from_u8(self.bitqueue.pop_all()), bitqueue_len); | 527 | 807k | bits -= bitqueue_len; | 528 | 807k | | 529 | 807k | read_aligned(&mut self.reader, bits / 8, &mut acc)?; | 530 | 807k | read_unaligned(&mut self.reader, bits % 8, &mut acc, &mut self.bitqueue)?; | 531 | 806k | Ok(acc.value()) | 532 | | } | 533 | | } else { | 534 | 0 | Err(io::Error::new( | 535 | 0 | io::ErrorKind::InvalidInput, | 536 | 0 | "excessive bits for type read", | 537 | 0 | )) | 538 | | } | 539 | 1.30M | } |
<bitstream_io::read::BitReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>, bitstream_io::LittleEndian> as bitstream_io::read::BitRead>::read::<u32> Line | Count | Source | 516 | 1.93M | fn read<U>(&mut self, mut bits: u32) -> io::Result<U> | 517 | 1.93M | where | 518 | 1.93M | U: Numeric, | 519 | 1.93M | { | 520 | 1.93M | if bits <= U::BITS_SIZE { | 521 | 1.93M | let bitqueue_len = self.bitqueue.len(); | 522 | 1.93M | if bits <= bitqueue_len { | 523 | 1.02M | Ok(U::from_u8(self.bitqueue.pop(bits))) | 524 | | } else { | 525 | 907k | let mut acc = | 526 | 907k | BitQueue::from_value(U::from_u8(self.bitqueue.pop_all()), bitqueue_len); | 527 | 907k | bits -= bitqueue_len; | 528 | 907k | | 529 | 907k | read_aligned(&mut self.reader, bits / 8, &mut acc)?; | 530 | 907k | read_unaligned(&mut self.reader, bits % 8, &mut acc, &mut self.bitqueue)?; | 531 | 906k | Ok(acc.value()) | 532 | | } | 533 | | } else { | 534 | 0 | Err(io::Error::new( | 535 | 0 | io::ErrorKind::InvalidInput, | 536 | 0 | "excessive bits for type read", | 537 | 0 | )) | 538 | | } | 539 | 1.93M | } |
<bitstream_io::read::BitReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>, bitstream_io::LittleEndian> as bitstream_io::read::BitRead>::read::<u16> Line | Count | Source | 516 | 218k | fn read<U>(&mut self, mut bits: u32) -> io::Result<U> | 517 | 218k | where | 518 | 218k | U: Numeric, | 519 | 218k | { | 520 | 218k | if bits <= U::BITS_SIZE { | 521 | 218k | let bitqueue_len = self.bitqueue.len(); | 522 | 218k | if bits <= bitqueue_len { | 523 | 2.45k | Ok(U::from_u8(self.bitqueue.pop(bits))) | 524 | | } else { | 525 | 216k | let mut acc = | 526 | 216k | BitQueue::from_value(U::from_u8(self.bitqueue.pop_all()), bitqueue_len); | 527 | 216k | bits -= bitqueue_len; | 528 | 216k | | 529 | 216k | read_aligned(&mut self.reader, bits / 8, &mut acc)?; | 530 | 216k | read_unaligned(&mut self.reader, bits % 8, &mut acc, &mut self.bitqueue)?; | 531 | 216k | Ok(acc.value()) | 532 | | } | 533 | | } else { | 534 | 0 | Err(io::Error::new( | 535 | 0 | io::ErrorKind::InvalidInput, | 536 | 0 | "excessive bits for type read", | 537 | 0 | )) | 538 | | } | 539 | 218k | } |
Unexecuted instantiation: <bitstream_io::read::BitReader<_, _> as bitstream_io::read::BitRead>::read::<_> |
540 | | |
541 | | /// # Examples |
542 | | /// ``` |
543 | | /// use std::io::{Read, Cursor}; |
544 | | /// use bitstream_io::{BigEndian, BitReader, BitRead}; |
545 | | /// let data = [0b10110111]; |
546 | | /// let mut reader = BitReader::endian(Cursor::new(&data), BigEndian); |
547 | | /// assert_eq!(reader.read_signed::<i8>(4).unwrap(), -5); |
548 | | /// assert_eq!(reader.read_signed::<i8>(4).unwrap(), 7); |
549 | | /// ``` |
550 | | /// |
551 | | /// ``` |
552 | | /// use std::io::{Read, Cursor}; |
553 | | /// use bitstream_io::{LittleEndian, BitReader, BitRead}; |
554 | | /// let data = [0b10110111]; |
555 | | /// let mut reader = BitReader::endian(Cursor::new(&data), LittleEndian); |
556 | | /// assert_eq!(reader.read_signed::<i8>(4).unwrap(), 7); |
557 | | /// assert_eq!(reader.read_signed::<i8>(4).unwrap(), -5); |
558 | | /// ``` |
559 | | /// |
560 | | /// ``` |
561 | | /// use std::io::{Read, Cursor}; |
562 | | /// use bitstream_io::{BigEndian, BitReader, BitRead}; |
563 | | /// let data = [0;10]; |
564 | | /// let mut r = BitReader::endian(Cursor::new(&data), BigEndian); |
565 | | /// assert!(r.read_signed::<i8>(9).is_err()); // can't read 9 bits to i8 |
566 | | /// assert!(r.read_signed::<i16>(17).is_err()); // can't read 17 bits to i16 |
567 | | /// assert!(r.read_signed::<i32>(33).is_err()); // can't read 33 bits to i32 |
568 | | /// assert!(r.read_signed::<i64>(65).is_err()); // can't read 65 bits to i64 |
569 | | /// ``` |
570 | | #[inline] |
571 | 0 | fn read_signed<S>(&mut self, bits: u32) -> io::Result<S> |
572 | 0 | where |
573 | 0 | S: SignedNumeric, |
574 | 0 | { |
575 | 0 | E::read_signed(self, bits) |
576 | 0 | } |
577 | | |
578 | | #[inline] |
579 | 0 | fn read_to<V>(&mut self) -> io::Result<V> |
580 | 0 | where |
581 | 0 | V: Primitive, |
582 | 0 | { |
583 | 0 | E::read_primitive(self) |
584 | 0 | } |
585 | | |
586 | | /// # Examples |
587 | | /// ``` |
588 | | /// use std::io::{Read, Cursor}; |
589 | | /// use bitstream_io::{BigEndian, BitReader, BitRead}; |
590 | | /// let data = [0b10110111]; |
591 | | /// let mut reader = BitReader::endian(Cursor::new(&data), BigEndian); |
592 | | /// assert!(reader.skip(3).is_ok()); |
593 | | /// assert_eq!(reader.read::<u8>(5).unwrap(), 0b10111); |
594 | | /// ``` |
595 | | /// |
596 | | /// ``` |
597 | | /// use std::io::{Read, Cursor}; |
598 | | /// use bitstream_io::{LittleEndian, BitReader, BitRead}; |
599 | | /// let data = [0b10110111]; |
600 | | /// let mut reader = BitReader::endian(Cursor::new(&data), LittleEndian); |
601 | | /// assert!(reader.skip(3).is_ok()); |
602 | | /// assert_eq!(reader.read::<u8>(5).unwrap(), 0b10110); |
603 | | /// ``` |
604 | 12.0k | fn skip(&mut self, mut bits: u32) -> io::Result<()> { |
605 | | use std::cmp::min; |
606 | | |
607 | 12.0k | let to_drop = min(self.bitqueue.len(), bits); |
608 | 12.0k | if to_drop != 0 { |
609 | 0 | self.bitqueue.drop(to_drop); |
610 | 0 | bits -= to_drop; |
611 | 12.0k | } |
612 | | |
613 | 12.0k | skip_aligned(&mut self.reader, bits / 8)?; |
614 | 12.0k | skip_unaligned(&mut self.reader, bits % 8, &mut self.bitqueue) |
615 | 12.0k | } <bitstream_io::read::BitReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>, bitstream_io::LittleEndian> as bitstream_io::read::BitRead>::skip Line | Count | Source | 604 | 12.0k | fn skip(&mut self, mut bits: u32) -> io::Result<()> { | 605 | | use std::cmp::min; | 606 | | | 607 | 12.0k | let to_drop = min(self.bitqueue.len(), bits); | 608 | 12.0k | if to_drop != 0 { | 609 | 0 | self.bitqueue.drop(to_drop); | 610 | 0 | bits -= to_drop; | 611 | 12.0k | } | 612 | | | 613 | 12.0k | skip_aligned(&mut self.reader, bits / 8)?; | 614 | 12.0k | skip_unaligned(&mut self.reader, bits % 8, &mut self.bitqueue) | 615 | 12.0k | } |
Unexecuted instantiation: <bitstream_io::read::BitReader<_, _> as bitstream_io::read::BitRead>::skip |
616 | | |
617 | | /// # Example |
618 | | /// ``` |
619 | | /// use std::io::{Read, Cursor}; |
620 | | /// use bitstream_io::{BigEndian, BitReader, BitRead}; |
621 | | /// let data = b"foobar"; |
622 | | /// let mut reader = BitReader::endian(Cursor::new(data), BigEndian); |
623 | | /// assert!(reader.skip(24).is_ok()); |
624 | | /// let mut buf = [0;3]; |
625 | | /// assert!(reader.read_bytes(&mut buf).is_ok()); |
626 | | /// assert_eq!(&buf, b"bar"); |
627 | | /// ``` |
628 | 0 | fn read_bytes(&mut self, buf: &mut [u8]) -> io::Result<()> { |
629 | 0 | if self.byte_aligned() { |
630 | 0 | self.reader.read_exact(buf) |
631 | | } else { |
632 | 0 | for b in buf.iter_mut() { |
633 | 0 | *b = self.read(8)?; |
634 | | } |
635 | 0 | Ok(()) |
636 | | } |
637 | 0 | } |
638 | | |
639 | | /// # Examples |
640 | | /// ``` |
641 | | /// use std::io::{Read, Cursor}; |
642 | | /// use bitstream_io::{BigEndian, BitReader, BitRead}; |
643 | | /// let data = [0b01110111, 0b11111110]; |
644 | | /// let mut reader = BitReader::endian(Cursor::new(&data), BigEndian); |
645 | | /// assert_eq!(reader.read_unary0().unwrap(), 0); |
646 | | /// assert_eq!(reader.read_unary0().unwrap(), 3); |
647 | | /// assert_eq!(reader.read_unary0().unwrap(), 10); |
648 | | /// ``` |
649 | | /// |
650 | | /// ``` |
651 | | /// use std::io::{Read, Cursor}; |
652 | | /// use bitstream_io::{LittleEndian, BitReader, BitRead}; |
653 | | /// let data = [0b11101110, 0b01111111]; |
654 | | /// let mut reader = BitReader::endian(Cursor::new(&data), LittleEndian); |
655 | | /// assert_eq!(reader.read_unary0().unwrap(), 0); |
656 | | /// assert_eq!(reader.read_unary0().unwrap(), 3); |
657 | | /// assert_eq!(reader.read_unary0().unwrap(), 10); |
658 | | /// ``` |
659 | 0 | fn read_unary0(&mut self) -> io::Result<u32> { |
660 | 0 | if self.bitqueue.is_empty() { |
661 | 0 | read_aligned_unary(&mut self.reader, 0b1111_1111, &mut self.bitqueue) |
662 | 0 | .map(|u| u + self.bitqueue.pop_1()) |
663 | 0 | } else if self.bitqueue.all_1() { |
664 | 0 | let base = self.bitqueue.len(); |
665 | 0 | self.bitqueue.clear(); |
666 | 0 | read_aligned_unary(&mut self.reader, 0b1111_1111, &mut self.bitqueue) |
667 | 0 | .map(|u| base + u + self.bitqueue.pop_1()) |
668 | | } else { |
669 | 0 | Ok(self.bitqueue.pop_1()) |
670 | | } |
671 | 0 | } |
672 | | |
673 | | /// # Examples |
674 | | /// ``` |
675 | | /// use std::io::{Read, Cursor}; |
676 | | /// use bitstream_io::{BigEndian, BitReader, BitRead}; |
677 | | /// let data = [0b10001000, 0b00000001]; |
678 | | /// let mut reader = BitReader::endian(Cursor::new(&data), BigEndian); |
679 | | /// assert_eq!(reader.read_unary1().unwrap(), 0); |
680 | | /// assert_eq!(reader.read_unary1().unwrap(), 3); |
681 | | /// assert_eq!(reader.read_unary1().unwrap(), 10); |
682 | | /// ``` |
683 | | /// |
684 | | /// ``` |
685 | | /// use std::io::{Read, Cursor}; |
686 | | /// use bitstream_io::{LittleEndian, BitReader, BitRead}; |
687 | | /// let data = [0b00010001, 0b10000000]; |
688 | | /// let mut reader = BitReader::endian(Cursor::new(&data), LittleEndian); |
689 | | /// assert_eq!(reader.read_unary1().unwrap(), 0); |
690 | | /// assert_eq!(reader.read_unary1().unwrap(), 3); |
691 | | /// assert_eq!(reader.read_unary1().unwrap(), 10); |
692 | | /// ``` |
693 | 0 | fn read_unary1(&mut self) -> io::Result<u32> { |
694 | 0 | if self.bitqueue.is_empty() { |
695 | 0 | read_aligned_unary(&mut self.reader, 0b0000_0000, &mut self.bitqueue) |
696 | 0 | .map(|u| u + self.bitqueue.pop_0()) |
697 | 0 | } else if self.bitqueue.all_0() { |
698 | 0 | let base = self.bitqueue.len(); |
699 | 0 | self.bitqueue.clear(); |
700 | 0 | read_aligned_unary(&mut self.reader, 0b0000_0000, &mut self.bitqueue) |
701 | 0 | .map(|u| base + u + self.bitqueue.pop_0()) |
702 | | } else { |
703 | 0 | Ok(self.bitqueue.pop_0()) |
704 | | } |
705 | 0 | } |
706 | | |
707 | | /// # Example |
708 | | /// ``` |
709 | | /// use std::io::{Read, Cursor}; |
710 | | /// use bitstream_io::{BigEndian, BitReader, BitRead}; |
711 | | /// let data = [0]; |
712 | | /// let mut reader = BitReader::endian(Cursor::new(&data), BigEndian); |
713 | | /// assert_eq!(reader.byte_aligned(), true); |
714 | | /// assert!(reader.skip(1).is_ok()); |
715 | | /// assert_eq!(reader.byte_aligned(), false); |
716 | | /// assert!(reader.skip(7).is_ok()); |
717 | | /// assert_eq!(reader.byte_aligned(), true); |
718 | | /// ``` |
719 | | #[inline] |
720 | 0 | fn byte_aligned(&self) -> bool { |
721 | 0 | self.bitqueue.is_empty() |
722 | 0 | } |
723 | | |
724 | | /// # Example |
725 | | /// ``` |
726 | | /// use std::io::{Read, Cursor}; |
727 | | /// use bitstream_io::{BigEndian, BitReader, BitRead}; |
728 | | /// let data = [0x00, 0xFF]; |
729 | | /// let mut reader = BitReader::endian(Cursor::new(&data), BigEndian); |
730 | | /// assert_eq!(reader.read::<u8>(4).unwrap(), 0); |
731 | | /// reader.byte_align(); |
732 | | /// assert_eq!(reader.read::<u8>(8).unwrap(), 0xFF); |
733 | | /// ``` |
734 | | #[inline] |
735 | 0 | fn byte_align(&mut self) { |
736 | 0 | self.bitqueue.clear() |
737 | 0 | } |
738 | | } |
739 | | |
740 | | impl<R, E> BitReader<R, E> |
741 | | where |
742 | | E: Endianness, |
743 | | R: io::Read + io::Seek, |
744 | | { |
745 | | /// # Example |
746 | | /// ``` |
747 | | /// use std::io::{Read, Cursor, SeekFrom}; |
748 | | /// use bitstream_io::{BigEndian, BitReader, BitRead}; |
749 | | /// let data = [0x00, 0xFF]; |
750 | | /// let mut reader = BitReader::endian(Cursor::new(&data), BigEndian); |
751 | | /// assert_eq!(reader.position_in_bits().unwrap(), 0); |
752 | | /// |
753 | | /// let pos = reader.seek_bits(SeekFrom::Start(5)).unwrap(); |
754 | | /// assert!(pos == 5 && 5 == reader.position_in_bits().unwrap()); |
755 | | /// |
756 | | /// let pos = reader.seek_bits(SeekFrom::Current(-2)).unwrap(); |
757 | | /// assert!(pos == 3 && 3 == reader.position_in_bits().unwrap()); /// |
758 | | /// |
759 | | /// let pos = reader.seek_bits(SeekFrom::End(5)).unwrap(); |
760 | | /// assert!(pos == 11 && 11 == reader.position_in_bits().unwrap()); |
761 | | /// ``` |
762 | 0 | pub fn seek_bits(&mut self, from: io::SeekFrom) -> io::Result<u64> { |
763 | 0 | match from { |
764 | 0 | io::SeekFrom::Start(from_start_pos) => { |
765 | 0 | let (bytes, bits) = (from_start_pos / 8, (from_start_pos % 8) as u32); |
766 | 0 | self.byte_align(); |
767 | 0 | self.reader.seek(io::SeekFrom::Start(bytes))?; |
768 | 0 | self.skip(bits)?; |
769 | 0 | Ok(from_start_pos) |
770 | | } |
771 | 0 | io::SeekFrom::End(from_end_pos) => { |
772 | 0 | let reader_end = self.reader.seek(io::SeekFrom::End(0))?; |
773 | 0 | let new_pos = (reader_end * 8) as i64 - from_end_pos; |
774 | 0 | assert!(new_pos >= 0, "The final position should be greater than 0"); |
775 | 0 | self.seek_bits(io::SeekFrom::Start(new_pos as u64)) |
776 | | } |
777 | 0 | io::SeekFrom::Current(offset) => { |
778 | 0 | let new_pos = self.position_in_bits()? as i64 + offset; |
779 | 0 | assert!(new_pos >= 0, "The final position should be greater than 0"); |
780 | 0 | self.seek_bits(io::SeekFrom::Start(new_pos as u64)) |
781 | | } |
782 | | } |
783 | 0 | } |
784 | | |
785 | | /// # Example |
786 | | /// ``` |
787 | | /// use std::fs::read; |
788 | | /// use std::io::{Read, Cursor, SeekFrom}; |
789 | | /// use bitstream_io::{BigEndian, BitReader, BitRead}; |
790 | | /// let data = [0x00, 0xFF]; |
791 | | /// let mut reader = BitReader::endian(Cursor::new(&data), BigEndian); |
792 | | /// assert_eq!(reader.position_in_bits().unwrap(), 0); |
793 | | /// |
794 | | /// let _: i32 = reader.read_signed(5).unwrap(); |
795 | | /// assert_eq!(reader.position_in_bits().unwrap(), 5); |
796 | | /// |
797 | | /// reader.read_bit().unwrap(); |
798 | | /// assert_eq!(reader.position_in_bits().unwrap(), 6); |
799 | | /// ``` |
800 | | #[inline] |
801 | 50.6M | pub fn position_in_bits(&mut self) -> io::Result<u64> { |
802 | 50.6M | let bytes = self.reader.stream_position()?; |
803 | 50.6M | Ok(bytes * 8 - (self.bitqueue.len() as u64)) |
804 | 50.6M | } <bitstream_io::read::BitReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>, bitstream_io::LittleEndian>>::position_in_bits Line | Count | Source | 801 | 50.6M | pub fn position_in_bits(&mut self) -> io::Result<u64> { | 802 | 50.6M | let bytes = self.reader.stream_position()?; | 803 | 50.6M | Ok(bytes * 8 - (self.bitqueue.len() as u64)) | 804 | 50.6M | } |
Unexecuted instantiation: <bitstream_io::read::BitReader<_, _>>::position_in_bits |
805 | | } |
806 | | |
807 | | impl<R: io::Read, E: Endianness> HuffmanRead<E> for BitReader<R, E> { |
808 | | /// # Example |
809 | | /// ``` |
810 | | /// use std::io::{Read, Cursor}; |
811 | | /// use bitstream_io::{BigEndian, BitReader, HuffmanRead}; |
812 | | /// use bitstream_io::huffman::compile_read_tree; |
813 | | /// let tree = compile_read_tree( |
814 | | /// vec![('a', vec![0]), |
815 | | /// ('b', vec![1, 0]), |
816 | | /// ('c', vec![1, 1, 0]), |
817 | | /// ('d', vec![1, 1, 1])]).unwrap(); |
818 | | /// let data = [0b10110111]; |
819 | | /// let mut reader = BitReader::endian(Cursor::new(&data), BigEndian); |
820 | | /// assert_eq!(reader.read_huffman(&tree).unwrap(), 'b'); |
821 | | /// assert_eq!(reader.read_huffman(&tree).unwrap(), 'c'); |
822 | | /// assert_eq!(reader.read_huffman(&tree).unwrap(), 'd'); |
823 | | /// ``` |
824 | 164M | fn read_huffman<T>(&mut self, tree: &[ReadHuffmanTree<E, T>]) -> io::Result<T> |
825 | 164M | where |
826 | 164M | T: Clone, |
827 | 164M | { |
828 | 164M | let mut result: &ReadHuffmanTree<E, T> = &tree[self.bitqueue.to_state()]; |
829 | | loop { |
830 | 176M | match result { |
831 | 164M | ReadHuffmanTree::Done(ref value, ref queue_val, ref queue_bits, _) => { |
832 | 164M | self.bitqueue.set(*queue_val, *queue_bits); |
833 | 164M | return Ok(value.clone()); |
834 | | } |
835 | 11.9M | ReadHuffmanTree::Continue(ref tree) => { |
836 | 11.9M | result = &tree[read_byte(&mut self.reader)? as usize]; |
837 | | } |
838 | | ReadHuffmanTree::InvalidState => { |
839 | 0 | panic!("invalid state"); |
840 | | } |
841 | | } |
842 | | } |
843 | 164M | } <bitstream_io::read::BitReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>, bitstream_io::LittleEndian> as bitstream_io::read::HuffmanRead<bitstream_io::LittleEndian>>::read_huffman::<u8> Line | Count | Source | 824 | 120M | fn read_huffman<T>(&mut self, tree: &[ReadHuffmanTree<E, T>]) -> io::Result<T> | 825 | 120M | where | 826 | 120M | T: Clone, | 827 | 120M | { | 828 | 120M | let mut result: &ReadHuffmanTree<E, T> = &tree[self.bitqueue.to_state()]; | 829 | | loop { | 830 | 124M | match result { | 831 | 120M | ReadHuffmanTree::Done(ref value, ref queue_val, ref queue_bits, _) => { | 832 | 120M | self.bitqueue.set(*queue_val, *queue_bits); | 833 | 120M | return Ok(value.clone()); | 834 | | } | 835 | 3.48M | ReadHuffmanTree::Continue(ref tree) => { | 836 | 3.48M | result = &tree[read_byte(&mut self.reader)? as usize]; | 837 | | } | 838 | | ReadHuffmanTree::InvalidState => { | 839 | 0 | panic!("invalid state"); | 840 | | } | 841 | | } | 842 | | } | 843 | 120M | } |
<bitstream_io::read::BitReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>, bitstream_io::LittleEndian> as bitstream_io::read::HuffmanRead<bitstream_io::LittleEndian>>::read_huffman::<u16> Line | Count | Source | 824 | 43.0M | fn read_huffman<T>(&mut self, tree: &[ReadHuffmanTree<E, T>]) -> io::Result<T> | 825 | 43.0M | where | 826 | 43.0M | T: Clone, | 827 | 43.0M | { | 828 | 43.0M | let mut result: &ReadHuffmanTree<E, T> = &tree[self.bitqueue.to_state()]; | 829 | | loop { | 830 | 51.5M | match result { | 831 | 43.0M | ReadHuffmanTree::Done(ref value, ref queue_val, ref queue_bits, _) => { | 832 | 43.0M | self.bitqueue.set(*queue_val, *queue_bits); | 833 | 43.0M | return Ok(value.clone()); | 834 | | } | 835 | 8.50M | ReadHuffmanTree::Continue(ref tree) => { | 836 | 8.50M | result = &tree[read_byte(&mut self.reader)? as usize]; | 837 | | } | 838 | | ReadHuffmanTree::InvalidState => { | 839 | 0 | panic!("invalid state"); | 840 | | } | 841 | | } | 842 | | } | 843 | 43.0M | } |
Unexecuted instantiation: <bitstream_io::read::BitReader<_, _> as bitstream_io::read::HuffmanRead<_>>::read_huffman::<_> |
844 | | } |
845 | | |
846 | | #[inline] |
847 | 14.0M | fn read_byte<R>(mut reader: R) -> io::Result<u8> |
848 | 14.0M | where |
849 | 14.0M | R: io::Read, |
850 | 14.0M | { |
851 | 14.0M | let mut byte = 0; |
852 | 14.0M | reader |
853 | 14.0M | .read_exact(std::slice::from_mut(&mut byte)) |
854 | 14.0M | .map(|()| byte) bitstream_io::read::read_byte::<&mut std::io::cursor::Cursor<[u8; 5]>>::{closure#0} Line | Count | Source | 854 | 6.17k | .map(|()| byte) |
bitstream_io::read::read_byte::<&mut std::io::cursor::Cursor<alloc::vec::Vec<u8>>>::{closure#0} Line | Count | Source | 854 | 14.0M | .map(|()| byte) |
Unexecuted instantiation: bitstream_io::read::read_byte::<_>::{closure#0} |
855 | 14.0M | } bitstream_io::read::read_byte::<&mut std::io::cursor::Cursor<[u8; 5]>> Line | Count | Source | 847 | 6.17k | fn read_byte<R>(mut reader: R) -> io::Result<u8> | 848 | 6.17k | where | 849 | 6.17k | R: io::Read, | 850 | 6.17k | { | 851 | 6.17k | let mut byte = 0; | 852 | 6.17k | reader | 853 | 6.17k | .read_exact(std::slice::from_mut(&mut byte)) | 854 | 6.17k | .map(|()| byte) | 855 | 6.17k | } |
bitstream_io::read::read_byte::<&mut std::io::cursor::Cursor<alloc::vec::Vec<u8>>> Line | Count | Source | 847 | 14.0M | fn read_byte<R>(mut reader: R) -> io::Result<u8> | 848 | 14.0M | where | 849 | 14.0M | R: io::Read, | 850 | 14.0M | { | 851 | 14.0M | let mut byte = 0; | 852 | 14.0M | reader | 853 | 14.0M | .read_exact(std::slice::from_mut(&mut byte)) | 854 | 14.0M | .map(|()| byte) | 855 | 14.0M | } |
Unexecuted instantiation: bitstream_io::read::read_byte::<_> |
856 | | |
857 | 1.94M | fn read_aligned<R, E, N>(mut reader: R, bytes: u32, acc: &mut BitQueue<E, N>) -> io::Result<()> |
858 | 1.94M | where |
859 | 1.94M | R: io::Read, |
860 | 1.94M | E: Endianness, |
861 | 1.94M | N: Numeric, |
862 | 1.94M | { |
863 | 1.94M | if bytes > 0 { |
864 | 794k | let mut buf = N::buffer(); |
865 | 794k | reader.read_exact(&mut buf.as_mut()[0..bytes as usize])?; |
866 | 796k | for b in &buf.as_ref()[0..bytes as usize] { |
867 | 796k | acc.push(8, N::from_u8(*b)); |
868 | 796k | } |
869 | 1.14M | } |
870 | 1.94M | Ok(()) |
871 | 1.94M | } bitstream_io::read::read_aligned::<&mut std::io::cursor::Cursor<[u8; 5]>, bitstream_io::LittleEndian, u8> Line | Count | Source | 857 | 3.09k | fn read_aligned<R, E, N>(mut reader: R, bytes: u32, acc: &mut BitQueue<E, N>) -> io::Result<()> | 858 | 3.09k | where | 859 | 3.09k | R: io::Read, | 860 | 3.09k | E: Endianness, | 861 | 3.09k | N: Numeric, | 862 | 3.09k | { | 863 | 3.09k | if bytes > 0 { | 864 | 3.09k | let mut buf = N::buffer(); | 865 | 3.09k | reader.read_exact(&mut buf.as_mut()[0..bytes as usize])?; | 866 | 3.09k | for b in &buf.as_ref()[0..bytes as usize] { | 867 | 3.09k | acc.push(8, N::from_u8(*b)); | 868 | 3.09k | } | 869 | 0 | } | 870 | 3.09k | Ok(()) | 871 | 3.09k | } |
bitstream_io::read::read_aligned::<&mut std::io::cursor::Cursor<[u8; 5]>, bitstream_io::LittleEndian, u16> Line | Count | Source | 857 | 6.17k | fn read_aligned<R, E, N>(mut reader: R, bytes: u32, acc: &mut BitQueue<E, N>) -> io::Result<()> | 858 | 6.17k | where | 859 | 6.17k | R: io::Read, | 860 | 6.17k | E: Endianness, | 861 | 6.17k | N: Numeric, | 862 | 6.17k | { | 863 | 6.17k | if bytes > 0 { | 864 | 6.17k | let mut buf = N::buffer(); | 865 | 6.17k | reader.read_exact(&mut buf.as_mut()[0..bytes as usize])?; | 866 | 6.17k | for b in &buf.as_ref()[0..bytes as usize] { | 867 | 6.17k | acc.push(8, N::from_u8(*b)); | 868 | 6.17k | } | 869 | 0 | } | 870 | 6.17k | Ok(()) | 871 | 6.17k | } |
bitstream_io::read::read_aligned::<&mut std::io::cursor::Cursor<alloc::vec::Vec<u8>>, bitstream_io::LittleEndian, u8> Line | Count | Source | 857 | 807k | fn read_aligned<R, E, N>(mut reader: R, bytes: u32, acc: &mut BitQueue<E, N>) -> io::Result<()> | 858 | 807k | where | 859 | 807k | R: io::Read, | 860 | 807k | E: Endianness, | 861 | 807k | N: Numeric, | 862 | 807k | { | 863 | 807k | if bytes > 0 { | 864 | 397k | let mut buf = N::buffer(); | 865 | 397k | reader.read_exact(&mut buf.as_mut()[0..bytes as usize])?; | 866 | 397k | for b in &buf.as_ref()[0..bytes as usize] { | 867 | 397k | acc.push(8, N::from_u8(*b)); | 868 | 397k | } | 869 | 409k | } | 870 | 807k | Ok(()) | 871 | 807k | } |
bitstream_io::read::read_aligned::<&mut std::io::cursor::Cursor<alloc::vec::Vec<u8>>, bitstream_io::LittleEndian, u32> Line | Count | Source | 857 | 907k | fn read_aligned<R, E, N>(mut reader: R, bytes: u32, acc: &mut BitQueue<E, N>) -> io::Result<()> | 858 | 907k | where | 859 | 907k | R: io::Read, | 860 | 907k | E: Endianness, | 861 | 907k | N: Numeric, | 862 | 907k | { | 863 | 907k | if bytes > 0 { | 864 | 287k | let mut buf = N::buffer(); | 865 | 287k | reader.read_exact(&mut buf.as_mut()[0..bytes as usize])?; | 866 | 289k | for b in &buf.as_ref()[0..bytes as usize] { | 867 | 289k | acc.push(8, N::from_u8(*b)); | 868 | 289k | } | 869 | 619k | } | 870 | 907k | Ok(()) | 871 | 907k | } |
bitstream_io::read::read_aligned::<&mut std::io::cursor::Cursor<alloc::vec::Vec<u8>>, bitstream_io::LittleEndian, u16> Line | Count | Source | 857 | 216k | fn read_aligned<R, E, N>(mut reader: R, bytes: u32, acc: &mut BitQueue<E, N>) -> io::Result<()> | 858 | 216k | where | 859 | 216k | R: io::Read, | 860 | 216k | E: Endianness, | 861 | 216k | N: Numeric, | 862 | 216k | { | 863 | 216k | if bytes > 0 { | 864 | 99.6k | let mut buf = N::buffer(); | 865 | 99.6k | reader.read_exact(&mut buf.as_mut()[0..bytes as usize])?; | 866 | 99.6k | for b in &buf.as_ref()[0..bytes as usize] { | 867 | 99.6k | acc.push(8, N::from_u8(*b)); | 868 | 99.6k | } | 869 | 116k | } | 870 | 216k | Ok(()) | 871 | 216k | } |
Unexecuted instantiation: bitstream_io::read::read_aligned::<_, _, _> |
872 | | |
873 | 12.0k | fn skip_aligned<R>(mut reader: R, mut bytes: u32) -> io::Result<()> |
874 | 12.0k | where |
875 | 12.0k | R: io::Read, |
876 | 12.0k | { |
877 | | use std::cmp::min; |
878 | | |
879 | | /*skip up to 8 bytes at a time |
880 | | (unlike with read_aligned, "bytes" may be larger than any native type)*/ |
881 | 12.0k | let mut buf = [0; 8]; |
882 | 12.0k | while bytes > 0 { |
883 | 0 | let to_read = min(8, bytes); |
884 | 0 | reader.read_exact(&mut buf[0..to_read as usize])?; |
885 | 0 | bytes -= to_read; |
886 | | } |
887 | 12.0k | Ok(()) |
888 | 12.0k | } bitstream_io::read::skip_aligned::<&mut std::io::cursor::Cursor<alloc::vec::Vec<u8>>> Line | Count | Source | 873 | 12.0k | fn skip_aligned<R>(mut reader: R, mut bytes: u32) -> io::Result<()> | 874 | 12.0k | where | 875 | 12.0k | R: io::Read, | 876 | 12.0k | { | 877 | | use std::cmp::min; | 878 | | | 879 | | /*skip up to 8 bytes at a time | 880 | | (unlike with read_aligned, "bytes" may be larger than any native type)*/ | 881 | 12.0k | let mut buf = [0; 8]; | 882 | 12.0k | while bytes > 0 { | 883 | 0 | let to_read = min(8, bytes); | 884 | 0 | reader.read_exact(&mut buf[0..to_read as usize])?; | 885 | 0 | bytes -= to_read; | 886 | | } | 887 | 12.0k | Ok(()) | 888 | 12.0k | } |
Unexecuted instantiation: bitstream_io::read::skip_aligned::<_> |
889 | | |
890 | | #[inline] |
891 | 1.94M | fn read_unaligned<R, E, N>( |
892 | 1.94M | reader: R, |
893 | 1.94M | bits: u32, |
894 | 1.94M | acc: &mut BitQueue<E, N>, |
895 | 1.94M | rem: &mut BitQueue<E, u8>, |
896 | 1.94M | ) -> io::Result<()> |
897 | 1.94M | where |
898 | 1.94M | R: io::Read, |
899 | 1.94M | E: Endianness, |
900 | 1.94M | N: Numeric, |
901 | 1.94M | { |
902 | 1.94M | debug_assert!(bits <= 8); |
903 | | |
904 | 1.94M | if bits > 0 { |
905 | 1.34M | rem.set(read_byte(reader)?, 8); |
906 | 1.34M | acc.push(bits, N::from_u8(rem.pop(bits))); |
907 | 596k | } |
908 | 1.93M | Ok(()) |
909 | 1.94M | } bitstream_io::read::read_unaligned::<&mut std::io::cursor::Cursor<[u8; 5]>, bitstream_io::LittleEndian, u8> Line | Count | Source | 891 | 3.09k | fn read_unaligned<R, E, N>( | 892 | 3.09k | reader: R, | 893 | 3.09k | bits: u32, | 894 | 3.09k | acc: &mut BitQueue<E, N>, | 895 | 3.09k | rem: &mut BitQueue<E, u8>, | 896 | 3.09k | ) -> io::Result<()> | 897 | 3.09k | where | 898 | 3.09k | R: io::Read, | 899 | 3.09k | E: Endianness, | 900 | 3.09k | N: Numeric, | 901 | 3.09k | { | 902 | 3.09k | debug_assert!(bits <= 8); | 903 | | | 904 | 3.09k | if bits > 0 { | 905 | 0 | rem.set(read_byte(reader)?, 8); | 906 | 0 | acc.push(bits, N::from_u8(rem.pop(bits))); | 907 | 3.09k | } | 908 | 3.09k | Ok(()) | 909 | 3.09k | } |
bitstream_io::read::read_unaligned::<&mut std::io::cursor::Cursor<[u8; 5]>, bitstream_io::LittleEndian, u16> Line | Count | Source | 891 | 6.17k | fn read_unaligned<R, E, N>( | 892 | 6.17k | reader: R, | 893 | 6.17k | bits: u32, | 894 | 6.17k | acc: &mut BitQueue<E, N>, | 895 | 6.17k | rem: &mut BitQueue<E, u8>, | 896 | 6.17k | ) -> io::Result<()> | 897 | 6.17k | where | 898 | 6.17k | R: io::Read, | 899 | 6.17k | E: Endianness, | 900 | 6.17k | N: Numeric, | 901 | 6.17k | { | 902 | 6.17k | debug_assert!(bits <= 8); | 903 | | | 904 | 6.17k | if bits > 0 { | 905 | 6.17k | rem.set(read_byte(reader)?, 8); | 906 | 6.17k | acc.push(bits, N::from_u8(rem.pop(bits))); | 907 | 0 | } | 908 | 6.17k | Ok(()) | 909 | 6.17k | } |
bitstream_io::read::read_unaligned::<&mut std::io::cursor::Cursor<alloc::vec::Vec<u8>>, bitstream_io::LittleEndian, u8> Line | Count | Source | 891 | 807k | fn read_unaligned<R, E, N>( | 892 | 807k | reader: R, | 893 | 807k | bits: u32, | 894 | 807k | acc: &mut BitQueue<E, N>, | 895 | 807k | rem: &mut BitQueue<E, u8>, | 896 | 807k | ) -> io::Result<()> | 897 | 807k | where | 898 | 807k | R: io::Read, | 899 | 807k | E: Endianness, | 900 | 807k | N: Numeric, | 901 | 807k | { | 902 | 807k | debug_assert!(bits <= 8); | 903 | | | 904 | 807k | if bits > 0 { | 905 | 409k | rem.set(read_byte(reader)?, 8); | 906 | 408k | acc.push(bits, N::from_u8(rem.pop(bits))); | 907 | 397k | } | 908 | 806k | Ok(()) | 909 | 807k | } |
bitstream_io::read::read_unaligned::<&mut std::io::cursor::Cursor<alloc::vec::Vec<u8>>, bitstream_io::LittleEndian, u32> Line | Count | Source | 891 | 907k | fn read_unaligned<R, E, N>( | 892 | 907k | reader: R, | 893 | 907k | bits: u32, | 894 | 907k | acc: &mut BitQueue<E, N>, | 895 | 907k | rem: &mut BitQueue<E, u8>, | 896 | 907k | ) -> io::Result<()> | 897 | 907k | where | 898 | 907k | R: io::Read, | 899 | 907k | E: Endianness, | 900 | 907k | N: Numeric, | 901 | 907k | { | 902 | 907k | debug_assert!(bits <= 8); | 903 | | | 904 | 907k | if bits > 0 { | 905 | 810k | rem.set(read_byte(reader)?, 8); | 906 | 810k | acc.push(bits, N::from_u8(rem.pop(bits))); | 907 | 96.2k | } | 908 | 906k | Ok(()) | 909 | 907k | } |
bitstream_io::read::read_unaligned::<&mut std::io::cursor::Cursor<alloc::vec::Vec<u8>>, bitstream_io::LittleEndian, u16> Line | Count | Source | 891 | 216k | fn read_unaligned<R, E, N>( | 892 | 216k | reader: R, | 893 | 216k | bits: u32, | 894 | 216k | acc: &mut BitQueue<E, N>, | 895 | 216k | rem: &mut BitQueue<E, u8>, | 896 | 216k | ) -> io::Result<()> | 897 | 216k | where | 898 | 216k | R: io::Read, | 899 | 216k | E: Endianness, | 900 | 216k | N: Numeric, | 901 | 216k | { | 902 | 216k | debug_assert!(bits <= 8); | 903 | | | 904 | 216k | if bits > 0 { | 905 | 116k | rem.set(read_byte(reader)?, 8); | 906 | 116k | acc.push(bits, N::from_u8(rem.pop(bits))); | 907 | 99.5k | } | 908 | 216k | Ok(()) | 909 | 216k | } |
Unexecuted instantiation: bitstream_io::read::read_unaligned::<_, _, _> |
910 | | |
911 | | #[inline] |
912 | 12.0k | fn skip_unaligned<R, E>(reader: R, bits: u32, rem: &mut BitQueue<E, u8>) -> io::Result<()> |
913 | 12.0k | where |
914 | 12.0k | R: io::Read, |
915 | 12.0k | E: Endianness, |
916 | 12.0k | { |
917 | 12.0k | debug_assert!(bits <= 8); |
918 | | |
919 | 12.0k | if bits > 0 { |
920 | 4.60k | rem.set(read_byte(reader)?, 8); |
921 | 4.60k | rem.pop(bits); |
922 | 7.42k | } |
923 | 12.0k | Ok(()) |
924 | 12.0k | } bitstream_io::read::skip_unaligned::<&mut std::io::cursor::Cursor<alloc::vec::Vec<u8>>, bitstream_io::LittleEndian> Line | Count | Source | 912 | 12.0k | fn skip_unaligned<R, E>(reader: R, bits: u32, rem: &mut BitQueue<E, u8>) -> io::Result<()> | 913 | 12.0k | where | 914 | 12.0k | R: io::Read, | 915 | 12.0k | E: Endianness, | 916 | 12.0k | { | 917 | 12.0k | debug_assert!(bits <= 8); | 918 | | | 919 | 12.0k | if bits > 0 { | 920 | 4.60k | rem.set(read_byte(reader)?, 8); | 921 | 4.60k | rem.pop(bits); | 922 | 7.42k | } | 923 | 12.0k | Ok(()) | 924 | 12.0k | } |
Unexecuted instantiation: bitstream_io::read::skip_unaligned::<_, _> |
925 | | |
926 | | #[inline] |
927 | 0 | fn read_aligned_unary<R, E>( |
928 | 0 | mut reader: R, |
929 | 0 | continue_val: u8, |
930 | 0 | rem: &mut BitQueue<E, u8>, |
931 | 0 | ) -> io::Result<u32> |
932 | 0 | where |
933 | 0 | R: io::Read, |
934 | 0 | E: Endianness, |
935 | 0 | { |
936 | 0 | let mut acc = 0; |
937 | 0 | let mut byte = read_byte(reader.by_ref())?; |
938 | 0 | while byte == continue_val { |
939 | 0 | acc += 8; |
940 | 0 | byte = read_byte(reader.by_ref())?; |
941 | | } |
942 | 0 | rem.set(byte, 8); |
943 | 0 | Ok(acc) |
944 | 0 | } |
945 | | |
946 | | /// A trait for anything that can read aligned values from an input stream |
947 | | pub trait ByteRead { |
948 | | /// Reads whole numeric value from stream |
949 | | /// |
950 | | /// # Errors |
951 | | /// |
952 | | /// Passes along any I/O error from the underlying stream. |
953 | | /// |
954 | | /// # Examples |
955 | | /// ``` |
956 | | /// use std::io::{Read, Cursor}; |
957 | | /// use bitstream_io::{BigEndian, ByteReader, ByteRead}; |
958 | | /// let data = [0b00000000, 0b11111111]; |
959 | | /// let mut reader = ByteReader::endian(Cursor::new(&data), BigEndian); |
960 | | /// assert_eq!(reader.read::<u16>().unwrap(), 0b0000000011111111); |
961 | | /// ``` |
962 | | /// |
963 | | /// ``` |
964 | | /// use std::io::{Read, Cursor}; |
965 | | /// use bitstream_io::{LittleEndian, ByteReader, ByteRead}; |
966 | | /// let data = [0b00000000, 0b11111111]; |
967 | | /// let mut reader = ByteReader::endian(Cursor::new(&data), LittleEndian); |
968 | | /// assert_eq!(reader.read::<u16>().unwrap(), 0b1111111100000000); |
969 | | /// ``` |
970 | | fn read<V: Primitive>(&mut self) -> Result<V, io::Error>; |
971 | | |
972 | | /// Completely fills the given buffer with whole bytes. |
973 | | /// |
974 | | /// # Errors |
975 | | /// |
976 | | /// Passes along any I/O error from the underlying stream. |
977 | 0 | fn read_bytes(&mut self, buf: &mut [u8]) -> io::Result<()> { |
978 | 0 | for b in buf.iter_mut() { |
979 | 0 | *b = self.read()?; |
980 | | } |
981 | 0 | Ok(()) |
982 | 0 | } |
983 | | |
984 | | /// Completely fills a whole buffer with bytes and returns it. |
985 | | /// |
986 | | /// # Errors |
987 | | /// |
988 | | /// Passes along any I/O error from the underlying stream. |
989 | | #[inline(always)] |
990 | | #[deprecated(since = "1.8.0", note = "use read() method instead")] |
991 | 0 | fn read_to_bytes<const SIZE: usize>(&mut self) -> io::Result<[u8; SIZE]> { |
992 | 0 | self.read() |
993 | 0 | } |
994 | | |
995 | | /// Completely fills a vector of bytes and returns it. |
996 | | /// |
997 | | /// # Errors |
998 | | /// |
999 | | /// Passes along any I/O error from the underlying stream. |
1000 | 0 | fn read_to_vec(&mut self, bytes: usize) -> io::Result<Vec<u8>> { |
1001 | 0 | let mut buf = vec![0; bytes]; |
1002 | 0 | self.read_bytes(&mut buf)?; |
1003 | 0 | Ok(buf) |
1004 | 0 | } |
1005 | | |
1006 | | /// Skips the given number of bytes in the stream. |
1007 | | /// |
1008 | | /// # Errors |
1009 | | /// |
1010 | | /// Passes along any I/O error from the underlying stream. |
1011 | | fn skip(&mut self, bytes: u32) -> io::Result<()>; |
1012 | | |
1013 | | /// Parses and returns complex type |
1014 | 0 | fn parse<F: FromByteStream>(&mut self) -> Result<F, F::Error> { |
1015 | 0 | F::from_reader(self) |
1016 | 0 | } |
1017 | | |
1018 | | /// Parses and returns complex type with context |
1019 | 0 | fn parse_with<F: FromByteStreamWith>(&mut self, context: &F::Context) -> Result<F, F::Error> { |
1020 | 0 | F::from_reader(self, context) |
1021 | 0 | } |
1022 | | |
1023 | | /// Returns mutable reference to underlying reader |
1024 | | fn reader_ref(&mut self) -> &mut dyn io::Read; |
1025 | | } |
1026 | | |
1027 | | /// For reading aligned bytes from a stream of bytes in a given endianness. |
1028 | | /// |
1029 | | /// This only reads aligned values and maintains no internal state. |
1030 | | pub struct ByteReader<R: io::Read, E: Endianness> { |
1031 | | phantom: PhantomData<E>, |
1032 | | reader: R, |
1033 | | } |
1034 | | |
1035 | | impl<R: io::Read, E: Endianness> ByteReader<R, E> { |
1036 | | /// Wraps a ByteReader around something that implements `Read` |
1037 | 0 | pub fn new(reader: R) -> ByteReader<R, E> { |
1038 | 0 | ByteReader { |
1039 | 0 | phantom: PhantomData, |
1040 | 0 | reader, |
1041 | 0 | } |
1042 | 0 | } |
1043 | | |
1044 | | /// Wraps a ByteReader around something that implements `Read` |
1045 | | /// with the given endianness. |
1046 | 0 | pub fn endian(reader: R, _endian: E) -> ByteReader<R, E> { |
1047 | 0 | ByteReader { |
1048 | 0 | phantom: PhantomData, |
1049 | 0 | reader, |
1050 | 0 | } |
1051 | 0 | } |
1052 | | |
1053 | | /// Unwraps internal reader and disposes of `ByteReader`. |
1054 | | #[inline] |
1055 | 0 | pub fn into_reader(self) -> R { |
1056 | 0 | self.reader |
1057 | 0 | } |
1058 | | |
1059 | | /// Provides mutable reference to internal reader |
1060 | | #[inline] |
1061 | 0 | pub fn reader(&mut self) -> &mut R { |
1062 | 0 | &mut self.reader |
1063 | 0 | } |
1064 | | |
1065 | | /// Converts `ByteReader` to `BitReader` in the same endianness. |
1066 | | #[inline] |
1067 | 0 | pub fn into_bitreader(self) -> BitReader<R, E> { |
1068 | 0 | BitReader::new(self.into_reader()) |
1069 | 0 | } |
1070 | | |
1071 | | /// Provides temporary `BitReader` in the same endianness. |
1072 | | /// |
1073 | | /// # Warning |
1074 | | /// |
1075 | | /// Any unread bits left over when `BitReader` is dropped are lost. |
1076 | | #[inline] |
1077 | 0 | pub fn bitreader(&mut self) -> BitReader<&mut R, E> { |
1078 | 0 | BitReader::new(self.reader()) |
1079 | 0 | } |
1080 | | } |
1081 | | |
1082 | | impl<R: io::Read, E: Endianness> ByteRead for ByteReader<R, E> { |
1083 | | #[inline] |
1084 | 0 | fn read<V: Primitive>(&mut self) -> Result<V, io::Error> { |
1085 | 0 | E::read_numeric(&mut self.reader) |
1086 | 0 | } |
1087 | | |
1088 | | #[inline] |
1089 | 0 | fn read_bytes(&mut self, buf: &mut [u8]) -> io::Result<()> { |
1090 | 0 | self.reader.read_exact(buf) |
1091 | 0 | } |
1092 | | |
1093 | | #[inline] |
1094 | 0 | fn skip(&mut self, bytes: u32) -> io::Result<()> { |
1095 | 0 | skip_aligned(&mut self.reader, bytes) |
1096 | 0 | } |
1097 | | |
1098 | | #[inline] |
1099 | 0 | fn reader_ref(&mut self) -> &mut dyn io::Read { |
1100 | 0 | &mut self.reader |
1101 | 0 | } |
1102 | | } |
1103 | | |
1104 | | /// Implemented by complex types that don't require any additional context |
1105 | | /// to parse themselves from a reader. Analagous to `FromStr`. |
1106 | | /// |
1107 | | /// # Example |
1108 | | /// ``` |
1109 | | /// use std::io::{Cursor, Read}; |
1110 | | /// use bitstream_io::{BigEndian, BitRead, BitReader, FromBitStream}; |
1111 | | /// |
1112 | | /// #[derive(Debug, PartialEq, Eq)] |
1113 | | /// struct BlockHeader { |
1114 | | /// last_block: bool, |
1115 | | /// block_type: u8, |
1116 | | /// block_size: u32, |
1117 | | /// } |
1118 | | /// |
1119 | | /// impl FromBitStream for BlockHeader { |
1120 | | /// type Error = std::io::Error; |
1121 | | /// |
1122 | | /// fn from_reader<R: BitRead + ?Sized>(r: &mut R) -> std::io::Result<Self> { |
1123 | | /// Ok(Self { |
1124 | | /// last_block: r.read_bit()?, |
1125 | | /// block_type: r.read(7)?, |
1126 | | /// block_size: r.read(24)?, |
1127 | | /// }) |
1128 | | /// } |
1129 | | /// } |
1130 | | /// |
1131 | | /// let mut reader = BitReader::endian(Cursor::new(b"\x04\x00\x00\x7A"), BigEndian); |
1132 | | /// assert_eq!( |
1133 | | /// reader.parse::<BlockHeader>().unwrap(), |
1134 | | /// BlockHeader { last_block: false, block_type: 4, block_size: 122 } |
1135 | | /// ); |
1136 | | /// ``` |
1137 | | pub trait FromBitStream { |
1138 | | /// Error generated during parsing, such as `io::Error` |
1139 | | type Error; |
1140 | | |
1141 | | /// Parse Self from reader |
1142 | | fn from_reader<R: BitRead + ?Sized>(r: &mut R) -> Result<Self, Self::Error> |
1143 | | where |
1144 | | Self: Sized; |
1145 | | } |
1146 | | |
1147 | | /// Implemented by complex types that require some immutable context |
1148 | | /// to parse themselves from a reader. |
1149 | | /// |
1150 | | /// # Example |
1151 | | /// ``` |
1152 | | /// use std::io::{Cursor, Read}; |
1153 | | /// use bitstream_io::{BigEndian, BitRead, BitReader, FromBitStreamWith}; |
1154 | | /// |
1155 | | /// #[derive(Default)] |
1156 | | /// struct Streaminfo { |
1157 | | /// minimum_block_size: u16, |
1158 | | /// maximum_block_size: u16, |
1159 | | /// minimum_frame_size: u32, |
1160 | | /// maximum_frame_size: u32, |
1161 | | /// sample_rate: u32, |
1162 | | /// channels: u8, |
1163 | | /// bits_per_sample: u8, |
1164 | | /// total_samples: u64, |
1165 | | /// md5: [u8; 16], |
1166 | | /// } |
1167 | | /// |
1168 | | /// #[derive(Debug, PartialEq, Eq)] |
1169 | | /// struct FrameHeader { |
1170 | | /// variable_block_size: bool, |
1171 | | /// block_size: u32, |
1172 | | /// sample_rate: u32, |
1173 | | /// channel_assignment: u8, |
1174 | | /// sample_size: u8, |
1175 | | /// frame_number: u64, |
1176 | | /// crc8: u8, |
1177 | | /// } |
1178 | | /// |
1179 | | /// impl FromBitStreamWith for FrameHeader { |
1180 | | /// type Context = Streaminfo; |
1181 | | /// |
1182 | | /// type Error = FrameHeaderError; |
1183 | | /// |
1184 | | /// fn from_reader<R: BitRead + ?Sized>( |
1185 | | /// r: &mut R, |
1186 | | /// streaminfo: &Streaminfo, |
1187 | | /// ) -> Result<Self, Self::Error> { |
1188 | | /// if r.read::<u16>(14)? != 0b11111111111110 { |
1189 | | /// return Err(FrameHeaderError::InvalidSync); |
1190 | | /// } |
1191 | | /// |
1192 | | /// if r.read_bit()? != false { |
1193 | | /// return Err(FrameHeaderError::InvalidReservedBit); |
1194 | | /// } |
1195 | | /// |
1196 | | /// let variable_block_size = r.read_bit()?; |
1197 | | /// |
1198 | | /// let block_size_bits = r.read::<u8>(4)?; |
1199 | | /// |
1200 | | /// let sample_rate_bits = r.read::<u8>(4)?; |
1201 | | /// |
1202 | | /// let channel_assignment = r.read::<u8>(4)?; |
1203 | | /// |
1204 | | /// let sample_size = match r.read::<u8>(3)? { |
1205 | | /// 0b000 => streaminfo.bits_per_sample, |
1206 | | /// 0b001 => 8, |
1207 | | /// 0b010 => 12, |
1208 | | /// 0b011 => return Err(FrameHeaderError::InvalidSampleSize), |
1209 | | /// 0b100 => 16, |
1210 | | /// 0b101 => 20, |
1211 | | /// 0b110 => 24, |
1212 | | /// 0b111 => 32, |
1213 | | /// _ => unreachable!(), |
1214 | | /// }; |
1215 | | /// |
1216 | | /// if r.read_bit()? != false { |
1217 | | /// return Err(FrameHeaderError::InvalidReservedBit); |
1218 | | /// } |
1219 | | /// |
1220 | | /// let frame_number = read_utf8(r)?; |
1221 | | /// |
1222 | | /// Ok(FrameHeader { |
1223 | | /// variable_block_size, |
1224 | | /// block_size: match block_size_bits { |
1225 | | /// 0b0000 => return Err(FrameHeaderError::InvalidBlockSize), |
1226 | | /// 0b0001 => 192, |
1227 | | /// n @ 0b010..=0b0101 => 576 * (1 << (n - 2)), |
1228 | | /// 0b0110 => r.read::<u32>(8)? + 1, |
1229 | | /// 0b0111 => r.read::<u32>(16)? + 1, |
1230 | | /// n @ 0b1000..=0b1111 => 256 * (1 << (n - 8)), |
1231 | | /// _ => unreachable!(), |
1232 | | /// }, |
1233 | | /// sample_rate: match sample_rate_bits { |
1234 | | /// 0b0000 => streaminfo.sample_rate, |
1235 | | /// 0b0001 => 88200, |
1236 | | /// 0b0010 => 176400, |
1237 | | /// 0b0011 => 192000, |
1238 | | /// 0b0100 => 8000, |
1239 | | /// 0b0101 => 16000, |
1240 | | /// 0b0110 => 22050, |
1241 | | /// 0b0111 => 24000, |
1242 | | /// 0b1000 => 32000, |
1243 | | /// 0b1001 => 44100, |
1244 | | /// 0b1010 => 48000, |
1245 | | /// 0b1011 => 96000, |
1246 | | /// 0b1100 => r.read::<u32>(8)? * 1000, |
1247 | | /// 0b1101 => r.read::<u32>(16)?, |
1248 | | /// 0b1110 => r.read::<u32>(16)? * 10, |
1249 | | /// 0b1111 => return Err(FrameHeaderError::InvalidSampleRate), |
1250 | | /// _ => unreachable!(), |
1251 | | /// }, |
1252 | | /// channel_assignment, |
1253 | | /// sample_size, |
1254 | | /// frame_number, |
1255 | | /// crc8: r.read(8)? |
1256 | | /// }) |
1257 | | /// } |
1258 | | /// } |
1259 | | /// |
1260 | | /// #[derive(Debug)] |
1261 | | /// enum FrameHeaderError { |
1262 | | /// Io(std::io::Error), |
1263 | | /// InvalidSync, |
1264 | | /// InvalidReservedBit, |
1265 | | /// InvalidSampleSize, |
1266 | | /// InvalidBlockSize, |
1267 | | /// InvalidSampleRate, |
1268 | | /// } |
1269 | | /// |
1270 | | /// impl From<std::io::Error> for FrameHeaderError { |
1271 | | /// fn from(err: std::io::Error) -> Self { |
1272 | | /// Self::Io(err) |
1273 | | /// } |
1274 | | /// } |
1275 | | /// |
1276 | | /// fn read_utf8<R: BitRead + ?Sized>(r: &mut R) -> Result<u64, std::io::Error> { |
1277 | | /// r.read(8) // left unimplimented in this example |
1278 | | /// } |
1279 | | /// |
1280 | | /// let mut reader = BitReader::endian(Cursor::new(b"\xFF\xF8\xC9\x18\x00\xC2"), BigEndian); |
1281 | | /// assert_eq!( |
1282 | | /// reader.parse_with::<FrameHeader>(&Streaminfo::default()).unwrap(), |
1283 | | /// FrameHeader { |
1284 | | /// variable_block_size: false, |
1285 | | /// block_size: 4096, |
1286 | | /// sample_rate: 44100, |
1287 | | /// channel_assignment: 1, |
1288 | | /// sample_size: 16, |
1289 | | /// frame_number: 0, |
1290 | | /// crc8: 0xC2, |
1291 | | /// } |
1292 | | /// ); |
1293 | | /// ``` |
1294 | | pub trait FromBitStreamWith { |
1295 | | /// Some context to use when parsing |
1296 | | type Context; |
1297 | | |
1298 | | /// Error generated during parsing, such as `io::Error` |
1299 | | type Error; |
1300 | | |
1301 | | /// Parse Self from reader with the given context |
1302 | | fn from_reader<R: BitRead + ?Sized>( |
1303 | | r: &mut R, |
1304 | | context: &Self::Context, |
1305 | | ) -> Result<Self, Self::Error> |
1306 | | where |
1307 | | Self: Sized; |
1308 | | } |
1309 | | |
1310 | | /// Implemented by complex types that don't require any additional context |
1311 | | /// to parse themselves from a reader. Analagous to `FromStr`. |
1312 | | pub trait FromByteStream { |
1313 | | /// Error generated during parsing, such as `io::Error` |
1314 | | type Error; |
1315 | | |
1316 | | /// Parse Self from reader |
1317 | | fn from_reader<R: ByteRead + ?Sized>(r: &mut R) -> Result<Self, Self::Error> |
1318 | | where |
1319 | | Self: Sized; |
1320 | | } |
1321 | | |
1322 | | /// Implemented by complex types that require some additional context |
1323 | | /// to parse themselves from a reader. Analagous to `FromStr`. |
1324 | | pub trait FromByteStreamWith { |
1325 | | /// Some context to use when parsing |
1326 | | type Context; |
1327 | | |
1328 | | /// Error generated during parsing, such as `io::Error` |
1329 | | type Error; |
1330 | | |
1331 | | /// Parse Self from reader |
1332 | | fn from_reader<R: ByteRead + ?Sized>( |
1333 | | r: &mut R, |
1334 | | context: &Self::Context, |
1335 | | ) -> Result<Self, Self::Error> |
1336 | | where |
1337 | | Self: Sized; |
1338 | | } |