bitstream_reader/
stream.rs

1use std::mem::size_of;
2use std::ops::BitOrAssign;
3
4use num_traits::{Float, PrimInt};
5
6use crate::endianness::Endianness;
7use crate::is_signed::IsSigned;
8use crate::unchecked_primitive::{UncheckedPrimitiveFloat, UncheckedPrimitiveInt};
9use crate::BitBuffer;
10use crate::{BitRead, BitReadSized, ReadError, Result};
11use std::cmp::min;
12
13/// Stream that provides an easy way to iterate trough a [`BitBuffer`]
14///
15/// # Examples
16///
17/// ```
18/// use bitstream_reader::{BitBuffer, BitStream, LittleEndian};
19///
20/// let bytes = vec![
21///     0b1011_0101, 0b0110_1010, 0b1010_1100, 0b1001_1001,
22///     0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
23/// ];
24/// let buffer = BitBuffer::new(bytes, LittleEndian);
25/// let mut stream = BitStream::new(buffer);
26/// ```
27///
28/// [`BitBuffer`]: struct.BitBuffer.html
29#[derive(Debug)]
30pub struct BitStream<E>
31where
32    E: Endianness,
33{
34    buffer: BitBuffer<E>,
35    start_pos: usize,
36    pos: usize,
37}
38
39impl<E> BitStream<E>
40where
41    E: Endianness,
42{
43    /// Create a new stream for a [`BitBuffer`]
44    ///
45    /// # Examples
46    ///
47    /// ```
48    /// use bitstream_reader::{BitBuffer, BitStream, LittleEndian};
49    ///
50    /// let bytes = vec![
51    ///     0b1011_0101, 0b0110_1010, 0b1010_1100, 0b1001_1001,
52    ///     0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
53    /// ];
54    /// let buffer = BitBuffer::new(bytes, LittleEndian);
55    /// let mut stream = BitStream::new(buffer);
56    /// ```
57    ///
58    /// [`BitBuffer`]: struct.BitBuffer.html
59    pub fn new(buffer: BitBuffer<E>) -> Self {
60        BitStream {
61            start_pos: 0,
62            pos: 0,
63            buffer,
64        }
65    }
66
67    /// Read a single bit from the stream as boolean
68    ///
69    /// # Errors
70    ///
71    /// - [`ReadError::NotEnoughData`]: not enough bits available in the stream
72    ///
73    /// # Examples
74    ///
75    /// ```
76    /// # use bitstream_reader::{BitBuffer, BitStream, LittleEndian, Result};
77    /// #
78    /// # fn main() -> Result<()> {
79    /// # let bytes = vec![
80    /// #     0b1011_0101, 0b0110_1010, 0b1010_1100, 0b1001_1001,
81    /// #     0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
82    /// # ];
83    /// # let buffer = BitBuffer::new(bytes, LittleEndian);
84    /// # let mut stream = BitStream::new(buffer);
85    /// assert_eq!(stream.read_bool()?, true);
86    /// assert_eq!(stream.read_bool()?, false);
87    /// assert_eq!(stream.pos(), 2);
88    /// #
89    /// #     Ok(())
90    /// # }
91    /// ```
92    ///
93    /// [`ReadError::NotEnoughData`]: enum.ReadError.html#variant.NotEnoughData
94    #[inline]
95    pub fn read_bool(&mut self) -> Result<bool> {
96        let result = self.buffer.read_bool(self.pos);
97        if result.is_ok() {
98            self.pos += 1;
99        }
100        result
101    }
102
103    #[doc(hidden)]
104    #[inline]
105    pub unsafe fn read_bool_unchecked(&mut self) -> bool {
106        let result = self.buffer.read_bool_unchecked(self.pos);
107        self.pos += 1;
108        result
109    }
110
111    /// Read a sequence of bits from the stream as integer
112    ///
113    /// # Errors
114    ///
115    /// - [`ReadError::NotEnoughData`]: not enough bits available in the stream
116    /// - [`ReadError::TooManyBits`]: to many bits requested for the chosen integer type
117    ///
118    /// # Examples
119    ///
120    /// ```
121    /// # use bitstream_reader::{BitBuffer, BitStream, LittleEndian, Result};
122    /// #
123    /// # fn main() -> Result<()> {
124    /// # let bytes = vec![
125    /// #     0b1011_0101, 0b0110_1010, 0b1010_1100, 0b1001_1001,
126    /// #     0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
127    /// # ];
128    /// # let buffer = BitBuffer::new(bytes, LittleEndian);
129    /// # let mut stream = BitStream::new(buffer);
130    /// assert_eq!(stream.read_int::<u16>(3)?, 0b101);
131    /// assert_eq!(stream.read_int::<u16>(3)?, 0b110);
132    /// assert_eq!(stream.pos(), 6);
133    /// #
134    /// #     Ok(())
135    /// # }
136    /// ```
137    ///
138    /// [`ReadError::NotEnoughData`]: enum.ReadError.html#variant.NotEnoughData
139    /// [`ReadError::TooManyBits`]: enum.ReadError.html#variant.TooManyBits
140    #[inline]
141    pub fn read_int<T>(&mut self, count: usize) -> Result<T>
142    where
143        T: PrimInt + BitOrAssign + IsSigned + UncheckedPrimitiveInt,
144    {
145        let result = self.buffer.read_int(self.pos, count);
146        if result.is_ok() {
147            self.pos += count;
148        }
149        result
150    }
151
152    #[doc(hidden)]
153    #[inline]
154    pub unsafe fn read_int_unchecked<T>(&mut self, count: usize) -> T
155    where
156        T: PrimInt + BitOrAssign + IsSigned + UncheckedPrimitiveInt,
157    {
158        let result = self.buffer.read_int_unchecked(self.pos, count);
159        self.pos += count;
160        result
161    }
162
163    /// Read a sequence of bits from the stream as float
164    ///
165    /// # Errors
166    ///
167    /// - [`ReadError::NotEnoughData`]: not enough bits available in the stream
168    ///
169    /// # Examples
170    ///
171    /// ```
172    /// # use bitstream_reader::{BitBuffer, BitStream, LittleEndian, Result};
173    /// #
174    /// # fn main() -> Result<()> {
175    /// # let bytes = vec![
176    /// #     0b1011_0101, 0b0110_1010, 0b1010_1100, 0b1001_1001,
177    /// #     0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
178    /// # ];
179    /// # let buffer = BitBuffer::new(bytes, LittleEndian);
180    /// # let mut stream = BitStream::new(buffer);
181    /// let result = stream.read_float::<f32>()?;
182    /// assert_eq!(stream.pos(), 32);
183    /// #
184    /// #     Ok(())
185    /// # }
186    /// ```
187    ///
188    /// [`ReadError::NotEnoughData`]: enum.ReadError.html#variant.NotEnoughData
189    #[inline]
190    pub fn read_float<T>(&mut self) -> Result<T>
191    where
192        T: Float + UncheckedPrimitiveFloat,
193    {
194        let count = size_of::<T>() * 8;
195        let result = self.buffer.read_float(self.pos);
196        if result.is_ok() {
197            self.pos += count;
198        }
199        result
200    }
201
202    #[doc(hidden)]
203    #[inline]
204    pub unsafe fn read_float_unchecked<T>(&mut self) -> T
205    where
206        T: Float + UncheckedPrimitiveFloat,
207    {
208        let count = size_of::<T>() * 8;
209        let result = self.buffer.read_float_unchecked(self.pos);
210        self.pos += count;
211        result
212    }
213
214    /// Read a series of bytes from the stream
215    ///
216    /// # Errors
217    ///
218    /// - [`ReadError::NotEnoughData`]: not enough bits available in the stream
219    ///
220    /// # Examples
221    ///
222    /// ```
223    /// # use bitstream_reader::{BitBuffer, BitStream, LittleEndian, Result};
224    /// #
225    /// # fn main() -> Result<()> {
226    /// # let bytes = vec![
227    /// #     0b1011_0101, 0b0110_1010, 0b1010_1100, 0b1001_1001,
228    /// #     0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
229    /// # ];
230    /// # let buffer = BitBuffer::new(bytes, LittleEndian);
231    /// # let mut stream = BitStream::new(buffer);
232    /// assert_eq!(stream.read_bytes(3)?, &[0b1011_0101, 0b0110_1010, 0b1010_1100]);
233    /// assert_eq!(stream.pos(), 24);
234    /// #
235    /// #     Ok(())
236    /// # }
237    /// ```
238    ///
239    /// [`ReadError::NotEnoughData`]: enum.ReadError.html#variant.NotEnoughData
240    #[inline]
241    pub fn read_bytes(&mut self, byte_count: usize) -> Result<Vec<u8>> {
242        let count = byte_count * 8;
243        let result = self.buffer.read_bytes(self.pos, byte_count);
244        if result.is_ok() {
245            self.pos += count;
246        }
247        result
248    }
249
250    #[doc(hidden)]
251    #[inline]
252    pub unsafe fn read_bytes_unchecked(&mut self, byte_count: usize) -> Vec<u8> {
253        let count = byte_count * 8;
254        let result = self.buffer.read_bytes_unchecked(self.pos, byte_count);
255        self.pos += count;
256        result
257    }
258
259    /// Read a series of bytes from the stream as utf8 string
260    ///
261    /// You can either read a fixed number of bytes, or a dynamic length null-terminated string
262    ///
263    /// # Errors
264    ///
265    /// - [`ReadError::NotEnoughData`]: not enough bits available in the stream
266    /// - [`ReadError::Utf8Error`]: the read bytes are not valid utf8
267    ///
268    /// # Examples
269    ///
270    /// ```
271    /// # use bitstream_reader::{BitBuffer, BitStream, LittleEndian, Result};
272    /// #
273    /// # fn main() -> Result<()> {
274    /// # let bytes = vec![
275    /// #     0x48, 0x65, 0x6c, 0x6c,
276    /// #     0x6f, 0x20, 0x77, 0x6f,
277    /// #     0x72, 0x6c, 0x64, 0,
278    /// #     0,    0,    0,    0
279    /// # ];
280    /// # let buffer = BitBuffer::new(bytes, LittleEndian);
281    /// # let mut stream = BitStream::new(buffer);
282    /// // Fixed length string
283    /// stream.set_pos(0);
284    /// assert_eq!(stream.read_string(Some(11))?, "Hello world".to_owned());
285    /// assert_eq!(11 * 8, stream.pos());
286    /// // fixed length with null padding
287    /// stream.set_pos(0);
288    /// assert_eq!(stream.read_string(Some(16))?, "Hello world".to_owned());
289    /// assert_eq!(16 * 8, stream.pos());
290    /// // null terminated
291    /// stream.set_pos(0);
292    /// assert_eq!(stream.read_string(None)?, "Hello world".to_owned());
293    /// assert_eq!(12 * 8, stream.pos()); // 1 more for the terminating null byte
294    /// #
295    /// #     Ok(())
296    /// # }
297    /// ```
298    ///
299    /// [`ReadError::NotEnoughData`]: enum.ReadError.html#variant.NotEnoughData
300    /// [`ReadError::Utf8Error`]: enum.ReadError.html#variant.Utf8Error
301    #[inline]
302    pub fn read_string(&mut self, byte_len: Option<usize>) -> Result<String> {
303        let max_length = self.bits_left() / 8;
304
305        let result = self.buffer.read_string(self.pos, byte_len).map_err(|err| {
306            // still advance the stream on malformed utf8
307            if let ReadError::Utf8Error(err) = &err {
308                self.pos += match byte_len {
309                    Some(len) => len * 8,
310                    None => min((err.as_bytes().len() + 1) * 8, max_length),
311                };
312            }
313            err
314        })?;
315        let read = match byte_len {
316            Some(len) => len * 8,
317            None => (result.len() + 1) * 8,
318        };
319
320        // due to how sub buffer/streams work, the result string can be longer than the current stream
321        // (but not the top level buffer)
322        // thus we trim the resulting string to make sure it fits in the source stream
323        if read > self.bits_left() {
324            // find the maximum well-formed utf8 string that fits in max_len
325            let mut acc = String::new();
326            for c in result.chars() {
327                if acc.len() + c.len_utf8() > max_length {
328                    break;
329                }
330                acc.push(c);
331            }
332            self.pos += acc.len() * 8;
333            return Ok(acc);
334        }
335        self.pos += read;
336        Ok(result)
337    }
338
339    /// Read a sequence of bits from the stream as a BitStream
340    ///
341    /// # Errors
342    ///
343    /// - [`ReadError::NotEnoughData`]: not enough bits available in the stream
344    ///
345    /// # Examples
346    ///
347    /// ```
348    /// # use bitstream_reader::{BitBuffer, BitStream, LittleEndian, Result};
349    /// #
350    /// # fn main() -> Result<()> {
351    /// # let bytes = vec![
352    /// #     0b1011_0101, 0b0110_1010, 0b1010_1100, 0b1001_1001,
353    /// #     0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
354    /// # ];
355    /// # let buffer = BitBuffer::new(bytes, LittleEndian);
356    /// # let mut stream = BitStream::new(buffer);
357    /// let mut bits = stream.read_bits(3)?;
358    /// assert_eq!(stream.pos(), 3);
359    /// assert_eq!(bits.pos(), 0);
360    /// assert_eq!(bits.bit_len(), 3);
361    /// assert_eq!(stream.read_int::<u8>(3)?, 0b110);
362    /// assert_eq!(bits.read_int::<u8>(3)?, 0b101);
363    /// assert_eq!(true, bits.read_int::<u8>(1).is_err());
364    /// #
365    /// #     Ok(())
366    /// # }
367    /// ```
368    ///
369    /// [`ReadError::NotEnoughData`]: enum.ReadError.html#variant.NotEnoughData
370    pub fn read_bits(&mut self, count: usize) -> Result<Self> {
371        let result = BitStream {
372            buffer: self.buffer.get_sub_buffer(self.pos + count)?,
373            start_pos: self.pos,
374            pos: self.pos,
375        };
376        self.pos += count;
377        Ok(result)
378    }
379
380    /// Skip a number of bits in the stream
381    ///
382    /// # Errors
383    ///
384    /// - [`ReadError::NotEnoughData`]: not enough bits available in the stream to skip
385    ///
386    /// # Examples
387    ///
388    /// ```
389    /// # use bitstream_reader::{BitBuffer, BitStream, LittleEndian, Result};
390    /// #
391    /// # fn main() -> Result<()> {
392    /// # let bytes = vec![
393    /// #     0b1011_0101, 0b0110_1010, 0b1010_1100, 0b1001_1001,
394    /// #     0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
395    /// # ];
396    /// # let buffer = BitBuffer::new(bytes, LittleEndian);
397    /// # let mut stream = BitStream::new(buffer);
398    /// stream.skip_bits(3)?;
399    /// assert_eq!(stream.pos(), 3);
400    /// assert_eq!(stream.read_int::<u8>(3)?, 0b110);
401    /// #
402    /// #     Ok(())
403    /// # }
404    /// ```
405    ///
406    /// [`ReadError::NotEnoughData`]: enum.ReadError.html#variant.NotEnoughData
407    pub fn skip_bits(&mut self, count: usize) -> Result<()> {
408        if count <= self.bits_left() {
409            self.pos += count;
410            Ok(())
411        } else {
412            Err(ReadError::NotEnoughData {
413                requested: count,
414                bits_left: self.bits_left(),
415            })
416        }
417    }
418
419    /// Set the position of the stream
420    ///
421    /// # Errors
422    ///
423    /// - [`ReadError::IndexOutOfBounds`]: new position is outside the bounds of the stream
424    ///
425    /// # Examples
426    ///
427    /// ```
428    /// # use bitstream_reader::{BitBuffer, BitStream, LittleEndian, Result};
429    /// #
430    /// # fn main() -> Result<()> {
431    /// # let bytes = vec![
432    /// #     0b1011_0101, 0b0110_1010, 0b1010_1100, 0b1001_1001,
433    /// #     0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
434    /// # ];
435    /// # let buffer = BitBuffer::new(bytes, LittleEndian);
436    /// # let mut stream = BitStream::new(buffer);
437    /// stream.set_pos(3)?;
438    /// assert_eq!(stream.pos(), 3);
439    /// assert_eq!(stream.read_int::<u8>(3)?, 0b110);
440    /// #
441    /// #     Ok(())
442    /// # }
443    /// ```
444    ///
445    /// [`ReadError::IndexOutOfBounds`]: enum.ReadError.html#variant.IndexOutOfBounds
446    pub fn set_pos(&mut self, pos: usize) -> Result<()> {
447        if pos > self.bit_len() {
448            return Err(ReadError::IndexOutOfBounds {
449                pos,
450                size: self.bit_len(),
451            });
452        }
453        self.pos = pos + self.start_pos;
454        Ok(())
455    }
456
457    /// Get the length of the stream in bits
458    ///
459    /// # Examples
460    ///
461    /// ```
462    /// # use bitstream_reader::{BitBuffer, BitStream, LittleEndian, Result};
463    /// #
464    /// # fn main() -> Result<()> {
465    /// # let bytes = vec![
466    /// #     0b1011_0101, 0b0110_1010, 0b1010_1100, 0b1001_1001,
467    /// #     0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
468    /// # ];
469    /// # let buffer = BitBuffer::new(bytes, LittleEndian);
470    /// # let mut stream = BitStream::new(buffer);
471    /// assert_eq!(stream.bit_len(), 64);
472    /// #
473    /// #     Ok(())
474    /// # }
475    /// ```
476    pub fn bit_len(&self) -> usize {
477        self.buffer.bit_len() - self.start_pos
478    }
479
480    /// Get the current position in the stream
481    ///
482    /// # Examples
483    ///
484    /// ```
485    /// # use bitstream_reader::{BitBuffer, BitStream, LittleEndian, Result};
486    /// #
487    /// # fn main() -> Result<()> {
488    /// # let bytes = vec![
489    /// #     0b1011_0101, 0b0110_1010, 0b1010_1100, 0b1001_1001,
490    /// #     0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
491    /// # ];
492    /// # let buffer = BitBuffer::new(bytes, LittleEndian);
493    /// # let mut stream = BitStream::new(buffer);
494    /// assert_eq!(stream.pos(), 0);
495    /// stream.skip_bits(5)?;
496    /// assert_eq!(stream.pos(), 5);
497    /// #
498    /// #     Ok(())
499    /// # }
500    /// ```
501    pub fn pos(&self) -> usize {
502        self.pos - self.start_pos
503    }
504
505    /// Get the number of bits left in the stream
506    ///
507    /// # Examples
508    ///
509    /// ```
510    /// # use bitstream_reader::{BitBuffer, BitStream, LittleEndian, Result};
511    /// #
512    /// # fn main() -> Result<()> {
513    /// # let bytes = vec![
514    /// #     0b1011_0101, 0b0110_1010, 0b1010_1100, 0b1001_1001,
515    /// #     0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
516    /// # ];
517    /// # let buffer = BitBuffer::new(bytes, LittleEndian);
518    /// # let mut stream = BitStream::new(buffer);
519    /// assert_eq!(stream.bits_left(), 64);
520    /// stream.skip_bits(5)?;
521    /// assert_eq!(stream.bits_left(), 59);
522    /// #
523    /// #     Ok(())
524    /// # }
525    /// ```
526    pub fn bits_left(&self) -> usize {
527        self.bit_len() - self.pos()
528    }
529
530    /// Read a value based on the provided type
531    ///
532    /// # Examples
533    ///
534    /// ```
535    /// # use bitstream_reader::{BitBuffer, BitStream, LittleEndian, Result};
536    /// #
537    /// # fn main() -> Result<()> {
538    /// # let bytes = vec![
539    /// #     0b1011_0101, 0b0110_1010, 0b1010_1100, 0b1001_1001,
540    /// #     0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
541    /// # ];
542    /// # let buffer = BitBuffer::new(bytes, LittleEndian);
543    /// # let mut stream = BitStream::new(buffer);
544    /// let int: u8 = stream.read()?;
545    /// assert_eq!(int, 0b1011_0101);
546    /// let boolean: bool = stream.read()?;
547    /// assert_eq!(false, boolean);
548    /// #
549    /// #     Ok(())
550    /// # }
551    /// ```
552    ///
553    /// ```
554    /// # use bitstream_reader::{BitBuffer, BitStream, LittleEndian, Result};
555    /// use bitstream_reader::BitRead;
556    /// #
557    /// #[derive(BitRead, Debug, PartialEq)]
558    /// struct ComplexType {
559    ///     first: u8,
560    ///     #[size = 15]
561    ///     second: u16,
562    ///     third: bool,
563    /// }
564    /// #
565    /// # fn main() -> Result<()> {
566    /// # let bytes = vec![
567    /// #     0b1011_0101, 0b0110_1010, 0b1010_1100, 0b1001_1001,
568    /// #     0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
569    /// # ];
570    /// # let buffer = BitBuffer::new(bytes, LittleEndian);
571    /// # let mut stream = BitStream::new(buffer);
572    /// let data: ComplexType = stream.read()?;
573    /// assert_eq!(data, ComplexType {
574    ///     first: 0b1011_0101,
575    ///     second: 0b010_1100_0110_1010,
576    ///     third: true,
577    /// });
578    /// #
579    /// #     Ok(())
580    /// # }
581    /// ```
582    #[inline]
583    pub fn read<T: BitRead<E>>(&mut self) -> Result<T> {
584        T::read(self)
585    }
586
587    #[doc(hidden)]
588    #[inline]
589    pub unsafe fn read_unchecked<T: BitRead<E>>(&mut self) -> Result<T> {
590        T::read_unchecked(self)
591    }
592
593    /// Read a value based on the provided type and size
594    ///
595    /// The meaning of the size parameter differs depending on the type that is being read
596    ///
597    /// # Examples
598    ///
599    /// ```
600    /// # use bitstream_reader::{BitBuffer, BitStream, LittleEndian, Result};
601    /// #
602    /// # fn main() -> Result<()> {
603    /// # let bytes = vec![
604    /// #     0b1011_0101, 0b0110_1010, 0b1010_1100, 0b1001_1001,
605    /// #     0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
606    /// # ];
607    /// # let buffer = BitBuffer::new(bytes, LittleEndian);
608    /// # let mut stream = BitStream::new(buffer);
609    /// let int: u8 = stream.read_sized(7)?;
610    /// assert_eq!(int, 0b011_0101);
611    /// #
612    /// #     Ok(())
613    /// # }
614    /// ```
615    ///
616    /// ```
617    /// # use bitstream_reader::{BitBuffer, BitStream, LittleEndian, Result};
618    /// #
619    /// # fn main() -> Result<()> {
620    /// # let bytes = vec![
621    /// #     0b1011_0101, 0b0110_1010, 0b1010_1100, 0b1001_1001,
622    /// #     0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
623    /// # ];
624    /// # let buffer = BitBuffer::new(bytes, LittleEndian);
625    /// # let mut stream = BitStream::new(buffer);
626    /// let data: Vec<u16> = stream.read_sized(3)?;
627    /// assert_eq!(data, vec![0b0110_1010_1011_0101, 0b1001_1001_1010_1100, 0b1001_1001_1001_1001]);
628    /// #
629    /// #     Ok(())
630    /// # }
631    /// ```
632    #[inline]
633    pub fn read_sized<T: BitReadSized<E>>(&mut self, size: usize) -> Result<T> {
634        T::read(self, size)
635    }
636
637    #[doc(hidden)]
638    #[inline]
639    pub unsafe fn read_sized_unchecked<T: BitReadSized<E>>(&mut self, size: usize) -> Result<T> {
640        T::read_unchecked(self, size)
641    }
642
643    /// Check if we can read a number of bits from the stream
644    pub fn check_read(&self, count: usize) -> Result<()> {
645        if self.bits_left() < count {
646            Err(ReadError::NotEnoughData {
647                requested: count,
648                bits_left: self.bits_left(),
649            })
650        } else {
651            Ok(())
652        }
653    }
654}
655
656impl<E: Endianness> Clone for BitStream<E> {
657    fn clone(&self) -> Self {
658        BitStream {
659            buffer: self.buffer.clone(),
660            start_pos: self.pos,
661            pos: self.pos,
662        }
663    }
664}
665
666impl<E: Endianness> From<BitBuffer<E>> for BitStream<E> {
667    fn from(buffer: BitBuffer<E>) -> Self {
668        BitStream::new(buffer)
669    }
670}
671
672impl<E: Endianness> From<Vec<u8>> for BitStream<E> {
673    fn from(bytes: Vec<u8>) -> Self {
674        BitStream::new(BitBuffer::from(bytes))
675    }
676}