bitstream_io/
read.rs

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