dsi_bitstream/impls/
buf_bit_reader.rs

1/*
2 * SPDX-FileCopyrightText: 2023 Tommaso Fontana
3 * SPDX-FileCopyrightText: 2023 Inria
4 * SPDX-FileCopyrightText: 2023 Sebastiano Vigna
5 *
6 * SPDX-License-Identifier: Apache-2.0 OR LGPL-2.1-or-later
7 */
8
9use common_traits::*;
10
11use crate::codes::params::{DefaultReadParams, ReadParams};
12use crate::traits::*;
13use core::convert::Infallible;
14use core::error::Error;
15use core::{mem, ptr};
16#[cfg(feature = "mem_dbg")]
17use mem_dbg::{MemDbg, MemSize};
18
19/// An internal shortcut to the double type of the word of a
20/// [`WordRead`].
21type BB<WR> = <<WR as WordRead>::Word as DoubleType>::DoubleType;
22
23/// An implementation of [`BitRead`] and [`BitSeek`] for a [`WordRead`] and a
24/// [`WordSeek`].
25///
26/// This implementation uses a bit buffer to store bits that are not yet read.
27/// The buffer is sized as twice the word size of the underlying [`WordRead`].
28/// Typically, the best choice is to have a buffer that is sized as `usize`,
29/// which means that the word of the underlying [`WordRead`] should be half of
30/// that (i.e., `u32` for a 64-bit architecture). However, results will vary
31/// depending on the CPU.
32///
33/// The peek word is equal to the bit buffer. The value returned
34/// by [`peek_bits`](crate::traits::BitRead::peek_bits) contains at least as
35/// many bits as the word size plus one (extended with zeros beyond end of
36/// stream).
37///
38/// This implementation is usually faster than
39/// [`BitReader`](crate::impls::BitReader).
40///
41/// The additional type parameter `RP` is used to select the parameters for the
42/// instantanous codes, but the casual user should be happy with the default
43/// value. See [`ReadParams`] for more details.
44///
45/// For additional flexibility, this structures implements [`std::io::Read`].
46/// Note that because of coherence rules it is not possible to implement
47/// [`std::io::Read`] for a generic [`BitRead`].
48
49#[derive(Debug)]
50#[cfg_attr(feature = "mem_dbg", derive(MemDbg, MemSize))]
51pub struct BufBitReader<E: Endianness, WR: WordRead, RP: ReadParams = DefaultReadParams>
52where
53    WR::Word: DoubleType,
54{
55    /// The [`WordRead`] used to fill the buffer.
56    backend: WR,
57    /// The 2-word bit buffer that is used to read the codes. It is never full,
58    /// but it may be empty. Only the upper (BE) or lower (LE)
59    /// `bits_in_buffer` bits are valid; the other bits are always zeroes.
60    buffer: BB<WR>,
61    /// Number of valid upper (BE) or lower (LE) bits in the buffer.
62    /// It is always smaller than `BB::<WR>::BITS`.
63    bits_in_buffer: usize,
64    _marker: core::marker::PhantomData<(E, RP)>,
65}
66
67impl<E: Endianness, WR: WordRead + Clone, RP: ReadParams> core::clone::Clone
68    for BufBitReader<E, WR, RP>
69where
70    WR::Word: DoubleType,
71{
72    fn clone(&self) -> Self {
73        Self {
74            backend: self.backend.clone(),
75            buffer: self.buffer,
76            bits_in_buffer: self.bits_in_buffer,
77            _marker: core::marker::PhantomData,
78        }
79    }
80}
81
82impl<E: Endianness, WR: WordRead, RP: ReadParams> BufBitReader<E, WR, RP>
83where
84    WR::Word: DoubleType,
85{
86    /// Create a new [`BufBitReader`] around a [`WordRead`].
87    ///
88    /// # Example
89    /// ```
90    /// use dsi_bitstream::prelude::*;
91    /// let words: [u32; 2] = [0x0043b59f, 0xccf16077];
92    /// let word_reader = MemWordReader::new(&words);
93    /// let mut buf_bit_reader = <BufBitReader<BE, _>>::new(word_reader);
94    /// ```
95    #[must_use]
96    pub fn new(backend: WR) -> Self {
97        #[cfg(feature = "std")]
98        check_tables(WR::Word::BITS + 1);
99        Self {
100            backend,
101            buffer: BB::<WR>::ZERO,
102            bits_in_buffer: 0,
103            _marker: core::marker::PhantomData,
104        }
105    }
106
107    ///  Return the backend, consuming this reader.
108    pub fn into_inner(self) -> Result<WR, Infallible> {
109        // SAFETY: forget(self) prevents double dropping backend
110        let backend = unsafe { ptr::read(&self.backend) };
111        mem::forget(self);
112        Ok(backend)
113    }
114}
115
116//
117// Big-endian implementation
118//
119
120impl<WR: WordRead, RP: ReadParams> BufBitReader<BE, WR, RP>
121where
122    WR::Word: DoubleType,
123{
124    /// Ensure that in the buffer there are at least `WR::Word::BITS` bits to read.
125    /// This method can be called only if there are at least
126    /// `WR::Word::BITS` free bits in the buffer.
127    #[inline(always)]
128    fn refill(&mut self) -> Result<(), <WR as WordRead>::Error> {
129        debug_assert!(BB::<WR>::BITS - self.bits_in_buffer >= WR::Word::BITS);
130
131        let new_word: BB<WR> = self.backend.read_word()?.to_be().upcast();
132        self.bits_in_buffer += WR::Word::BITS;
133        self.buffer |= new_word << (BB::<WR>::BITS - self.bits_in_buffer);
134        Ok(())
135    }
136}
137
138impl<WR: WordRead, RP: ReadParams> BitRead<BE> for BufBitReader<BE, WR, RP>
139where
140    WR::Word: DoubleType + UpcastableInto<u64>,
141    BB<WR>: CastableInto<u64>,
142{
143    type Error = <WR as WordRead>::Error;
144    type PeekWord = BB<WR>;
145
146    #[inline(always)]
147    fn peek_bits(&mut self, n_bits: usize) -> Result<Self::PeekWord, Self::Error> {
148        debug_assert!(n_bits > 0);
149        debug_assert!(n_bits <= Self::PeekWord::BITS);
150
151        // A peek can do at most one refill, otherwise we might lose data
152        if n_bits > self.bits_in_buffer {
153            self.refill()?;
154        }
155
156        debug_assert!(n_bits <= self.bits_in_buffer);
157
158        // Move the n_bits highest bits of the buffer to the lowest
159        Ok(self.buffer >> (BB::<WR>::BITS - n_bits))
160    }
161
162    #[inline(always)]
163    fn skip_bits_after_peek(&mut self, n_bits: usize) {
164        self.bits_in_buffer -= n_bits;
165        self.buffer <<= n_bits;
166    }
167
168    #[inline]
169    fn read_bits(&mut self, mut n_bits: usize) -> Result<u64, Self::Error> {
170        debug_assert!(n_bits <= 64);
171        debug_assert!(self.bits_in_buffer < BB::<WR>::BITS);
172
173        // most common path, we just read the buffer
174        if n_bits <= self.bits_in_buffer {
175            // Valid right shift of BB::<WR>::BITS - n_bits, even when n_bits is zero
176            let result: u64 = (self.buffer >> (BB::<WR>::BITS - n_bits - 1) >> 1_u32).cast();
177            self.bits_in_buffer -= n_bits;
178            self.buffer <<= n_bits;
179            return Ok(result);
180        }
181
182        let mut result: u64 =
183            (self.buffer >> (BB::<WR>::BITS - 1 - self.bits_in_buffer) >> 1_u8).cast();
184        n_bits -= self.bits_in_buffer;
185
186        // Directly read to the result without updating the buffer
187        while n_bits > WR::Word::BITS {
188            let new_word: u64 = self.backend.read_word()?.to_be().upcast();
189            result = (result << WR::Word::BITS) | new_word;
190            n_bits -= WR::Word::BITS;
191        }
192
193        debug_assert!(n_bits > 0);
194        debug_assert!(n_bits <= WR::Word::BITS);
195
196        // get the final word
197        let new_word = self.backend.read_word()?.to_be();
198        self.bits_in_buffer = WR::Word::BITS - n_bits;
199        // compose the remaining bits
200        let upcasted: u64 = new_word.upcast();
201        let final_bits: u64 = (upcasted >> self.bits_in_buffer).downcast();
202        result = (result << (n_bits - 1) << 1) | final_bits;
203        // and put the rest in the buffer
204        self.buffer = (UpcastableInto::<BB<WR>>::upcast(new_word)
205            << (BB::<WR>::BITS - self.bits_in_buffer - 1))
206            << 1;
207
208        Ok(result)
209    }
210
211    #[inline]
212    fn read_unary(&mut self) -> Result<u64, Self::Error> {
213        debug_assert!(self.bits_in_buffer < BB::<WR>::BITS);
214
215        // count the zeros from the left
216        let zeros: usize = self.buffer.leading_zeros() as _;
217
218        // if we encountered an 1 in the bits_in_buffer we can return
219        if zeros < self.bits_in_buffer {
220            self.buffer = self.buffer << zeros << 1;
221            self.bits_in_buffer -= zeros + 1;
222            return Ok(zeros as u64);
223        }
224
225        let mut result: u64 = self.bits_in_buffer as _;
226
227        loop {
228            let new_word = self.backend.read_word()?.to_be();
229
230            if new_word != WR::Word::ZERO {
231                let zeros: usize = new_word.leading_zeros() as _;
232                self.buffer =
233                    UpcastableInto::<BB<WR>>::upcast(new_word) << (WR::Word::BITS + zeros) << 1;
234                self.bits_in_buffer = WR::Word::BITS - zeros - 1;
235                return Ok(result + zeros as u64);
236            }
237            result += WR::Word::BITS as u64;
238        }
239    }
240
241    #[inline]
242    fn skip_bits(&mut self, mut n_bits: usize) -> Result<(), Self::Error> {
243        debug_assert!(self.bits_in_buffer < BB::<WR>::BITS);
244        // happy case, just shift the buffer
245        if n_bits <= self.bits_in_buffer {
246            self.bits_in_buffer -= n_bits;
247            self.buffer <<= n_bits;
248            return Ok(());
249        }
250
251        n_bits -= self.bits_in_buffer;
252
253        // skip words as needed
254        while n_bits > WR::Word::BITS {
255            let _ = self.backend.read_word()?;
256            n_bits -= WR::Word::BITS;
257        }
258
259        // get the final word
260        let new_word = self.backend.read_word()?.to_be();
261        self.bits_in_buffer = WR::Word::BITS - n_bits;
262
263        self.buffer = UpcastableInto::<BB<WR>>::upcast(new_word)
264            << (BB::<WR>::BITS - 1 - self.bits_in_buffer)
265            << 1;
266
267        Ok(())
268    }
269
270    #[cfg(not(feature = "no_copy_impls"))]
271    fn copy_to<F: Endianness, W: BitWrite<F>>(
272        &mut self,
273        bit_write: &mut W,
274        mut n: u64,
275    ) -> Result<(), CopyError<Self::Error, W::Error>> {
276        let from_buffer = Ord::min(n, self.bits_in_buffer as _);
277        self.buffer = self.buffer.rotate_left(from_buffer as _);
278
279        #[allow(unused_mut)]
280        let mut self_buffer_u64: u64 = self.buffer.cast();
281
282        #[cfg(feature = "checks")]
283        {
284            // Clean up in case checks are enabled
285            if n < 64 {
286                self_buffer_u64 &= (1_u64 << n) - 1;
287            }
288        }
289
290        bit_write
291            .write_bits(self_buffer_u64, from_buffer as usize)
292            .map_err(CopyError::WriteError)?;
293        n -= from_buffer;
294
295        if n == 0 {
296            self.bits_in_buffer -= from_buffer as usize;
297            return Ok(());
298        }
299
300        while n > WR::Word::BITS as u64 {
301            bit_write
302                .write_bits(
303                    self.backend
304                        .read_word()
305                        .map_err(CopyError::ReadError)?
306                        .to_be()
307                        .upcast(),
308                    WR::Word::BITS,
309                )
310                .map_err(CopyError::WriteError)?;
311            n -= WR::Word::BITS as u64;
312        }
313
314        assert!(n > 0);
315        let new_word = self
316            .backend
317            .read_word()
318            .map_err(CopyError::ReadError)?
319            .to_be();
320        self.bits_in_buffer = WR::Word::BITS - n as usize;
321        bit_write
322            .write_bits((new_word >> self.bits_in_buffer).upcast(), n as usize)
323            .map_err(CopyError::WriteError)?;
324        self.buffer = UpcastableInto::<BB<WR>>::upcast(new_word)
325            .rotate_right(WR::Word::BITS as u32 - n as u32);
326
327        Ok(())
328    }
329}
330
331impl<
332        E: Error + Send + Sync + 'static,
333        WR: WordRead<Error = E> + WordSeek<Error = E>,
334        RP: ReadParams,
335    > BitSeek for BufBitReader<BE, WR, RP>
336where
337    WR::Word: DoubleType,
338{
339    type Error = <WR as WordSeek>::Error;
340
341    #[inline]
342    fn bit_pos(&mut self) -> Result<u64, Self::Error> {
343        Ok(self.backend.word_pos()? * WR::Word::BITS as u64 - self.bits_in_buffer as u64)
344    }
345
346    #[inline]
347    fn set_bit_pos(&mut self, bit_index: u64) -> Result<(), Self::Error> {
348        self.backend
349            .set_word_pos(bit_index / WR::Word::BITS as u64)?;
350        let bit_offset = (bit_index % WR::Word::BITS as u64) as usize;
351        self.buffer = BB::<WR>::ZERO;
352        self.bits_in_buffer = 0;
353        if bit_offset != 0 {
354            let new_word: BB<WR> = self.backend.read_word()?.to_be().upcast();
355            self.bits_in_buffer = WR::Word::BITS - bit_offset;
356            self.buffer = new_word << (BB::<WR>::BITS - self.bits_in_buffer);
357        }
358        Ok(())
359    }
360}
361
362//
363// Little-endian implementation
364//
365
366impl<WR: WordRead, RP: ReadParams> BufBitReader<LE, WR, RP>
367where
368    WR::Word: DoubleType,
369{
370    /// Ensure that in the buffer there are at least `WR::Word::BITS` bits to read.
371    /// This method can be called only if there are at least
372    /// `WR::Word::BITS` free bits in the buffer.
373    #[inline(always)]
374    fn refill(&mut self) -> Result<(), <WR as WordRead>::Error> {
375        debug_assert!(BB::<WR>::BITS - self.bits_in_buffer >= WR::Word::BITS);
376
377        let new_word: BB<WR> = self.backend.read_word()?.to_le().upcast();
378        self.buffer |= new_word << self.bits_in_buffer;
379        self.bits_in_buffer += WR::Word::BITS;
380        Ok(())
381    }
382}
383
384impl<WR: WordRead, RP: ReadParams> BitRead<LE> for BufBitReader<LE, WR, RP>
385where
386    WR::Word: DoubleType + UpcastableInto<u64>,
387    BB<WR>: CastableInto<u64>,
388{
389    type Error = <WR as WordRead>::Error;
390    type PeekWord = BB<WR>;
391
392    #[inline(always)]
393    fn peek_bits(&mut self, n_bits: usize) -> Result<Self::PeekWord, Self::Error> {
394        debug_assert!(n_bits > 0);
395        debug_assert!(n_bits <= Self::PeekWord::BITS);
396
397        // A peek can do at most one refill, otherwise we might lose data
398        if n_bits > self.bits_in_buffer {
399            self.refill()?;
400        }
401
402        debug_assert!(n_bits <= self.bits_in_buffer);
403
404        // Keep the n_bits lowest bits of the buffer
405        let shamt = BB::<WR>::BITS - n_bits;
406        Ok((self.buffer << shamt) >> shamt)
407    }
408
409    #[inline(always)]
410    fn skip_bits_after_peek(&mut self, n_bits: usize) {
411        self.bits_in_buffer -= n_bits;
412        self.buffer >>= n_bits;
413    }
414
415    #[inline]
416    fn read_bits(&mut self, mut n_bits: usize) -> Result<u64, Self::Error> {
417        debug_assert!(n_bits <= 64);
418        debug_assert!(self.bits_in_buffer < BB::<WR>::BITS);
419
420        // most common path, we just read the buffer
421        if n_bits <= self.bits_in_buffer {
422            let result: u64 = (self.buffer & ((BB::<WR>::ONE << n_bits) - BB::<WR>::ONE)).cast();
423            self.bits_in_buffer -= n_bits;
424            self.buffer >>= n_bits;
425            return Ok(result);
426        }
427
428        let mut result: u64 = self.buffer.cast();
429        let mut bits_in_res = self.bits_in_buffer;
430
431        // Directly read to the result without updating the buffer
432        while n_bits > WR::Word::BITS + bits_in_res {
433            let new_word: u64 = self.backend.read_word()?.to_le().upcast();
434            result |= new_word << bits_in_res;
435            bits_in_res += WR::Word::BITS;
436        }
437
438        n_bits -= bits_in_res;
439
440        debug_assert!(n_bits > 0);
441        debug_assert!(n_bits <= WR::Word::BITS);
442
443        // get the final word
444        let new_word = self.backend.read_word()?.to_le();
445        self.bits_in_buffer = WR::Word::BITS - n_bits;
446        // compose the remaining bits
447        let shamt = 64 - n_bits;
448        let upcasted: u64 = new_word.upcast();
449        let final_bits: u64 = ((upcasted << shamt) >> shamt).downcast();
450        result |= final_bits << bits_in_res;
451        // and put the rest in the buffer
452        self.buffer = UpcastableInto::<BB<WR>>::upcast(new_word) >> n_bits;
453
454        Ok(result)
455    }
456
457    #[inline]
458    fn read_unary(&mut self) -> Result<u64, Self::Error> {
459        debug_assert!(self.bits_in_buffer < BB::<WR>::BITS);
460
461        // count the zeros from the right
462        let zeros: usize = self.buffer.trailing_zeros() as usize;
463
464        // if we encountered an 1 in the bits_in_buffer we can return
465        if zeros < self.bits_in_buffer {
466            self.buffer = self.buffer >> zeros >> 1;
467            self.bits_in_buffer -= zeros + 1;
468            return Ok(zeros as u64);
469        }
470
471        let mut result: u64 = self.bits_in_buffer as _;
472
473        loop {
474            let new_word = self.backend.read_word()?.to_le();
475
476            if new_word != WR::Word::ZERO {
477                let zeros: usize = new_word.trailing_zeros() as _;
478                self.buffer = UpcastableInto::<BB<WR>>::upcast(new_word) >> zeros >> 1;
479                self.bits_in_buffer = WR::Word::BITS - zeros - 1;
480                return Ok(result + zeros as u64);
481            }
482            result += WR::Word::BITS as u64;
483        }
484    }
485
486    #[inline]
487    fn skip_bits(&mut self, mut n_bits: usize) -> Result<(), Self::Error> {
488        debug_assert!(self.bits_in_buffer < BB::<WR>::BITS);
489        // happy case, just shift the buffer
490        if n_bits <= self.bits_in_buffer {
491            self.bits_in_buffer -= n_bits;
492            self.buffer >>= n_bits;
493            return Ok(());
494        }
495
496        n_bits -= self.bits_in_buffer;
497
498        // skip words as needed
499        while n_bits > WR::Word::BITS {
500            let _ = self.backend.read_word()?;
501            n_bits -= WR::Word::BITS;
502        }
503
504        // get the final word
505        let new_word = self.backend.read_word()?.to_le();
506        self.bits_in_buffer = WR::Word::BITS - n_bits;
507        self.buffer = UpcastableInto::<BB<WR>>::upcast(new_word) >> n_bits;
508
509        Ok(())
510    }
511
512    #[cfg(not(feature = "no_copy_impls"))]
513    fn copy_to<F: Endianness, W: BitWrite<F>>(
514        &mut self,
515        bit_write: &mut W,
516        mut n: u64,
517    ) -> Result<(), CopyError<Self::Error, W::Error>> {
518        let from_buffer = Ord::min(n, self.bits_in_buffer as _);
519
520        #[allow(unused_mut)]
521        let mut self_buffer_u64: u64 = self.buffer.cast();
522
523        #[cfg(feature = "checks")]
524        {
525            // Clean up in case checks are enabled
526            if n < 64 {
527                self_buffer_u64 &= (1_u64 << n) - 1;
528            }
529        }
530
531        bit_write
532            .write_bits(self_buffer_u64, from_buffer as usize)
533            .map_err(CopyError::WriteError)?;
534
535        self.buffer >>= from_buffer;
536        n -= from_buffer;
537
538        if n == 0 {
539            self.bits_in_buffer -= from_buffer as usize;
540            return Ok(());
541        }
542
543        while n > WR::Word::BITS as u64 {
544            bit_write
545                .write_bits(
546                    self.backend
547                        .read_word()
548                        .map_err(CopyError::ReadError)?
549                        .to_le()
550                        .upcast(),
551                    WR::Word::BITS,
552                )
553                .map_err(CopyError::WriteError)?;
554            n -= WR::Word::BITS as u64;
555        }
556
557        assert!(n > 0);
558        let new_word = self
559            .backend
560            .read_word()
561            .map_err(CopyError::ReadError)?
562            .to_le();
563        self.bits_in_buffer = WR::Word::BITS - n as usize;
564
565        #[allow(unused_mut)]
566        let mut new_word_u64: u64 = new_word.upcast();
567
568        #[cfg(feature = "checks")]
569        {
570            // Clean up in case checks are enabled
571            if n < 64 {
572                new_word_u64 &= (1_u64 << n) - 1;
573            }
574        }
575
576        bit_write
577            .write_bits(new_word_u64, n as usize)
578            .map_err(CopyError::WriteError)?;
579        self.buffer = UpcastableInto::<BB<WR>>::upcast(new_word) >> n;
580        Ok(())
581    }
582}
583
584impl<
585        E: Error + Send + Sync + 'static,
586        WR: WordRead<Error = E> + WordSeek<Error = E>,
587        RP: ReadParams,
588    > BitSeek for BufBitReader<LE, WR, RP>
589where
590    WR::Word: DoubleType,
591{
592    type Error = <WR as WordSeek>::Error;
593
594    #[inline]
595    fn bit_pos(&mut self) -> Result<u64, Self::Error> {
596        Ok(self.backend.word_pos()? * WR::Word::BITS as u64 - self.bits_in_buffer as u64)
597    }
598
599    #[inline]
600    fn set_bit_pos(&mut self, bit_index: u64) -> Result<(), Self::Error> {
601        self.backend
602            .set_word_pos(bit_index / WR::Word::BITS as u64)?;
603
604        let bit_offset = (bit_index % WR::Word::BITS as u64) as usize;
605        self.buffer = BB::<WR>::ZERO;
606        self.bits_in_buffer = 0;
607        if bit_offset != 0 {
608            let new_word: BB<WR> = self.backend.read_word()?.to_le().upcast();
609            self.bits_in_buffer = WR::Word::BITS - bit_offset;
610            self.buffer = new_word >> bit_offset;
611        }
612        Ok(())
613    }
614}
615
616#[cfg(feature = "std")]
617impl<WR: WordRead, RP: ReadParams> std::io::Read for BufBitReader<LE, WR, RP>
618where
619    WR::Word: DoubleType + UpcastableInto<u64>,
620    BB<WR>: CastableInto<u64>,
621{
622    fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
623        let mut iter = buf.chunks_exact_mut(8);
624
625        for chunk in &mut iter {
626            let word = self
627                .read_bits(64)
628                .map_err(|_| std::io::ErrorKind::UnexpectedEof)?;
629            chunk.copy_from_slice(&word.to_le_bytes());
630        }
631
632        let rem = iter.into_remainder();
633        if !rem.is_empty() {
634            let word = self
635                .read_bits(rem.len() * 8)
636                .map_err(|_| std::io::ErrorKind::UnexpectedEof)?;
637            rem.copy_from_slice(&word.to_le_bytes()[..rem.len()]);
638        }
639
640        Ok(buf.len())
641    }
642}
643
644#[cfg(feature = "std")]
645impl<WR: WordRead, RP: ReadParams> std::io::Read for BufBitReader<BE, WR, RP>
646where
647    WR::Word: DoubleType + UpcastableInto<u64>,
648    BB<WR>: CastableInto<u64>,
649{
650    fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
651        let mut iter = buf.chunks_exact_mut(8);
652
653        for chunk in &mut iter {
654            let word = self
655                .read_bits(64)
656                .map_err(|_| std::io::ErrorKind::UnexpectedEof)?;
657            chunk.copy_from_slice(&word.to_be_bytes());
658        }
659
660        let rem = iter.into_remainder();
661        if !rem.is_empty() {
662            let word = self
663                .read_bits(rem.len() * 8)
664                .map_err(|_| std::io::ErrorKind::UnexpectedEof)?;
665            rem.copy_from_slice(&word.to_be_bytes()[8 - rem.len()..]);
666        }
667
668        Ok(buf.len())
669    }
670}
671
672#[cfg(test)]
673#[cfg(feature = "std")]
674mod test {
675    use super::*;
676    use crate::prelude::{MemWordReader, MemWordWriterVec};
677    use std::io::Read;
678
679    #[test]
680    fn test_read() {
681        let data = [
682            0x90, 0x2d, 0xd0, 0x26, 0xdf, 0x89, 0xbb, 0x7e, 0x3a, 0xd6, 0xc6, 0x96, 0x73, 0xe9,
683            0x9d, 0xc9, 0x2a, 0x77, 0x82, 0xa9, 0xe6, 0x4b, 0x53, 0xcc, 0x83, 0x80, 0x4a, 0xf3,
684            0xcd, 0xe3, 0x50, 0x4e, 0x45, 0x4a, 0x3a, 0x42, 0x00, 0x4b, 0x4d, 0xbe, 0x4c, 0x88,
685            0x24, 0xf2, 0x4b, 0x6b, 0xbd, 0x79, 0xeb, 0x74, 0xbc, 0xe8, 0x7d, 0xff, 0x4b, 0x3d,
686            0xa7, 0xd6, 0x0d, 0xef, 0x9c, 0x5b, 0xb3, 0xec, 0x94, 0x97, 0xcc, 0x8b, 0x41, 0xe1,
687            0x9c, 0xcc, 0x1a, 0x03, 0x58, 0xc4, 0xfb, 0xd0, 0xc0, 0x10, 0xe2, 0xa0, 0xc9, 0xac,
688            0xa7, 0xbb, 0x50, 0xf6, 0x5c, 0x87, 0x68, 0x0f, 0x42, 0x93, 0x3f, 0x2e, 0x28, 0x28,
689            0x76, 0x83, 0x9b, 0xeb, 0x12, 0xe0, 0x4f, 0xc5, 0xb0, 0x8d, 0x14, 0xda, 0x3b, 0xdf,
690            0xd3, 0x4b, 0x80, 0xd1, 0xfc, 0x87, 0x85, 0xae, 0x54, 0xc7, 0x45, 0xc9, 0x38, 0x43,
691            0xa7, 0x9f, 0xdd, 0xa9, 0x71, 0xa7, 0x52, 0x36, 0x82, 0xff, 0x49, 0x55, 0xdb, 0x84,
692            0xc2, 0x95, 0xad, 0x45, 0x80, 0xc6, 0x02, 0x80, 0xf8, 0xfc, 0x86, 0x79, 0xae, 0xb9,
693            0x57, 0xe7, 0x3b, 0x33, 0x64, 0xa8,
694        ];
695        let data_u32 = unsafe { data.align_to::<u32>().1 };
696
697        for i in 0..data.len() {
698            let mut reader = BufBitReader::<LE, _>::new(MemWordReader::new(&data_u32));
699            let mut buffer = vec![0; i];
700            assert_eq!(reader.read(&mut buffer).unwrap(), i);
701            assert_eq!(&buffer, &data[..i]);
702
703            let mut reader = BufBitReader::<BE, _>::new(MemWordReader::new(&data_u32));
704            let mut buffer = vec![0; i];
705            assert_eq!(reader.read(&mut buffer).unwrap(), i);
706            assert_eq!(&buffer, &data[..i]);
707        }
708    }
709
710    macro_rules! test_buf_bit_reader {
711        ($f: ident, $word:ty) => {
712            #[test]
713            fn $f() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
714                #[allow(unused_imports)]
715                use crate::{
716                    codes::{GammaRead, GammaWrite},
717                    prelude::{
718                        len_delta, len_gamma, BufBitWriter, DeltaRead, DeltaWrite, MemWordReader,
719                    },
720                };
721                use rand::Rng;
722                use rand::{rngs::SmallRng, SeedableRng};
723
724                let mut buffer_be: Vec<$word> = vec![];
725                let mut buffer_le: Vec<$word> = vec![];
726                let mut big = BufBitWriter::<BE, _>::new(MemWordWriterVec::new(&mut buffer_be));
727                let mut little = BufBitWriter::<LE, _>::new(MemWordWriterVec::new(&mut buffer_le));
728
729                let mut r = SmallRng::seed_from_u64(0);
730                const ITER: usize = 1_000_000;
731
732                for _ in 0..ITER {
733                    let value = r.random_range(0..128);
734                    assert_eq!(big.write_gamma(value)?, len_gamma(value));
735                    let value = r.random_range(0..128);
736                    assert_eq!(little.write_gamma(value)?, len_gamma(value));
737                    let value = r.random_range(0..128);
738                    assert_eq!(big.write_gamma(value)?, len_gamma(value));
739                    let value = r.random_range(0..128);
740                    assert_eq!(little.write_gamma(value)?, len_gamma(value));
741                    let value = r.random_range(0..128);
742                    assert_eq!(big.write_delta(value)?, len_delta(value));
743                    let value = r.random_range(0..128);
744                    assert_eq!(little.write_delta(value)?, len_delta(value));
745                    let value = r.random_range(0..128);
746                    assert_eq!(big.write_delta(value)?, len_delta(value));
747                    let value = r.random_range(0..128);
748                    assert_eq!(little.write_delta(value)?, len_delta(value));
749                    let n_bits = r.random_range(0..=64);
750                    if n_bits == 0 {
751                        big.write_bits(0, 0)?;
752                    } else {
753                        big.write_bits(1, n_bits)?;
754                    }
755                    let n_bits = r.random_range(0..=64);
756                    if n_bits == 0 {
757                        little.write_bits(0, 0)?;
758                    } else {
759                        little.write_bits(1, n_bits)?;
760                    }
761                    let value = r.random_range(0..128);
762                    assert_eq!(big.write_unary(value)?, value as usize + 1);
763                    let value = r.random_range(0..128);
764                    assert_eq!(little.write_unary(value)?, value as usize + 1);
765                }
766
767                drop(big);
768                drop(little);
769
770                type ReadWord = $word;
771
772                #[allow(clippy::size_of_in_element_count)] // false positive
773                let be_trans: &[ReadWord] = unsafe {
774                    core::slice::from_raw_parts(
775                        buffer_be.as_ptr() as *const ReadWord,
776                        buffer_be.len()
777                            * (core::mem::size_of::<$word>() / core::mem::size_of::<ReadWord>()),
778                    )
779                };
780
781                #[allow(clippy::size_of_in_element_count)] // false positive
782                let le_trans: &[ReadWord] = unsafe {
783                    core::slice::from_raw_parts(
784                        buffer_le.as_ptr() as *const ReadWord,
785                        buffer_le.len()
786                            * (core::mem::size_of::<$word>() / core::mem::size_of::<ReadWord>()),
787                    )
788                };
789
790                let mut big_buff = BufBitReader::<BE, _>::new(MemWordReader::new(be_trans));
791                let mut little_buff = BufBitReader::<LE, _>::new(MemWordReader::new(le_trans));
792
793                let mut r = SmallRng::seed_from_u64(0);
794
795                for _ in 0..ITER {
796                    assert_eq!(big_buff.read_gamma()?, r.random_range(0..128));
797                    assert_eq!(little_buff.read_gamma()?, r.random_range(0..128));
798                    assert_eq!(big_buff.read_gamma()?, r.random_range(0..128));
799                    assert_eq!(little_buff.read_gamma()?, r.random_range(0..128));
800                    assert_eq!(big_buff.read_delta()?, r.random_range(0..128));
801                    assert_eq!(little_buff.read_delta()?, r.random_range(0..128));
802                    assert_eq!(big_buff.read_delta()?, r.random_range(0..128));
803                    assert_eq!(little_buff.read_delta()?, r.random_range(0..128));
804                    let n_bits = r.random_range(0..=64);
805                    if n_bits == 0 {
806                        assert_eq!(big_buff.read_bits(0)?, 0);
807                    } else {
808                        assert_eq!(big_buff.read_bits(n_bits)?, 1);
809                    }
810                    let n_bits = r.random_range(0..=64);
811                    if n_bits == 0 {
812                        assert_eq!(little_buff.read_bits(0)?, 0);
813                    } else {
814                        assert_eq!(little_buff.read_bits(n_bits)?, 1);
815                    }
816
817                    assert_eq!(big_buff.read_unary()?, r.random_range(0..128));
818                    assert_eq!(little_buff.read_unary()?, r.random_range(0..128));
819                }
820
821                Ok(())
822            }
823        };
824    }
825
826    test_buf_bit_reader!(test_u64, u64);
827    test_buf_bit_reader!(test_u32, u32);
828
829    test_buf_bit_reader!(test_u16, u16);
830}