Coverage Report

Created: 2026-05-16 07:04

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