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}