Skip to main content

tlbits/de/
reader.rs

1use core::iter;
2use std::borrow::Cow;
3
4use bitvec::{mem::bits_of, order::Msb0, slice::BitSlice, vec::BitVec, view::AsMutBits};
5use impl_tools::autoimpl;
6
7use crate::{
8    Context, Error, StringError,
9    adapters::{Checkpoint, Join, MapErr, Tee},
10    ser::BitWriter,
11};
12
13use super::{BitUnpack, r#as::BitUnpackAs};
14
15/// Bitwise reader.
16#[autoimpl(for <R: trait + ?Sized> &mut R, Box<R>)]
17pub trait BitReader<'de> {
18    // An error ocurred while reading
19    type Error: Error;
20
21    /// Returns count of bits left to read more
22    fn bits_left(&self) -> usize;
23
24    /// Reads only one bit.
25    fn read_bit(&mut self) -> Result<Option<bool>, Self::Error>;
26
27    /// Reads `dst.len()` bits into given bitslice.
28    /// Might be optimized by the implementation.
29    #[inline]
30    fn read_bits_into(&mut self, dst: &mut BitSlice<u8, Msb0>) -> Result<usize, Self::Error> {
31        for (i, mut bit) in dst.iter_mut().enumerate() {
32            let Some(read) = self.read_bit()? else {
33                return Ok(i);
34            };
35            *bit = read;
36        }
37        Ok(dst.len())
38    }
39
40    /// Reads `n` bits and returns possibly borrowed [`BitSlice`]
41    #[inline]
42    fn read_bits(&mut self, mut n: usize) -> Result<Cow<'de, BitSlice<u8, Msb0>>, Self::Error> {
43        let mut buf = BitVec::repeat(false, n);
44        n = self.read_bits_into(&mut buf)?;
45        buf.truncate(n);
46        Ok(Cow::Owned(buf))
47    }
48
49    /// Reads and discards `n` bits
50    #[inline]
51    fn skip(&mut self, n: usize) -> Result<usize, Self::Error> {
52        for i in 1..=n {
53            if self.read_bit()?.is_none() {
54                return Ok(i);
55            }
56        }
57        Ok(n)
58    }
59}
60
61/// Extension helper for [`BitReader`].
62pub trait BitReaderExt<'de>: BitReader<'de> {
63    /// Returns wheather the reader is empty
64    #[inline]
65    fn is_empty(&self) -> bool {
66        self.bits_left() == 0
67    }
68
69    /// Reads `dst.len()` bytes into given byte slice
70    #[inline]
71    fn read_bytes_into(&mut self, mut dst: impl AsMut<[u8]>) -> Result<usize, Self::Error> {
72        self.read_bits_into(dst.as_mut_bits())
73    }
74
75    /// Read `N` bytes and return array
76    #[inline]
77    fn read_bytes_array<const N: usize>(&mut self) -> Result<[u8; N], Self::Error> {
78        let mut arr = [0; N];
79        let n = self.read_bits_into(arr.as_mut_bits())?;
80        if n != N * bits_of::<u8>() {
81            return Err(Error::custom("EOF"));
82        }
83        Ok(arr)
84    }
85
86    /// Unpack value witg args using its [`BitUnpack`] implementation
87    #[inline]
88    fn unpack<T>(&mut self, args: T::Args) -> Result<T, Self::Error>
89    where
90        T: BitUnpack<'de>,
91    {
92        T::unpack(self, args)
93    }
94
95    /// Return iterator that unpacks values with args using [`BitUnpack`] implementation
96    #[inline]
97    fn unpack_iter<'a, T>(
98        &'a mut self,
99        args: T::Args,
100    ) -> impl Iterator<Item = Result<T, Self::Error>> + 'a
101    where
102        T: BitUnpack<'de>,
103        T::Args: Clone + 'a,
104    {
105        iter::repeat_with(move || self.unpack::<T>(args.clone()))
106            .enumerate()
107            .map(|(i, v)| v.with_context(|| format!("[{i}]")))
108    }
109
110    /// Unpack value with args using an adapter.  
111    ///
112    /// This approach is heavily inspired by
113    /// [serde_with](https://docs.rs/serde_with/latest/serde_with).
114    /// Please, read their docs for more usage examples.
115    #[inline]
116    fn unpack_as<T, As>(&mut self, args: As::Args) -> Result<T, Self::Error>
117    where
118        As: BitUnpackAs<'de, T> + ?Sized,
119    {
120        As::unpack_as(self, args)
121    }
122
123    /// Returns iterator that unpacks values with args using an adapter.  
124    ///
125    /// This approach is heavily inspired by
126    /// [serde_with](https://docs.rs/serde_with/latest/serde_with).
127    /// Please, read their docs for more usage examples.
128    #[inline]
129    fn unpack_iter_as<'a, T, As>(
130        &'a mut self,
131        args: As::Args,
132    ) -> impl Iterator<Item = Result<T, Self::Error>> + 'a
133    where
134        As: BitUnpackAs<'de, T> + ?Sized,
135        As::Args: Clone + 'a,
136    {
137        iter::repeat_with(move || self.unpack_as::<_, As>(args.clone()))
138            .enumerate()
139            .map(|(i, v)| v.with_context(|| format!("[{i}]")))
140    }
141
142    /// Borrows reader, rather than consuming it.
143    #[inline]
144    fn as_mut(&mut self) -> &mut Self {
145        self
146    }
147
148    /// Map [`Error`](BitReader::Error) by given closure
149    #[inline]
150    fn map_err<F>(self, f: F) -> MapErr<Self, F>
151    where
152        Self: Sized,
153    {
154        MapErr { inner: self, f }
155    }
156
157    /// Mirror all read data to given writer as well.
158    #[inline]
159    fn tee<W>(self, writer: W) -> Tee<Self, W>
160    where
161        Self: Sized,
162        W: BitWriter,
163    {
164        Tee::new(self, writer)
165    }
166
167    #[inline]
168    fn checkpoint(self) -> Checkpoint<Self>
169    where
170        Self: Sized,
171    {
172        Checkpoint::new(self)
173    }
174
175    #[inline]
176    fn join<R>(self, next: R) -> Join<Self, R>
177    where
178        Self: Sized,
179        R: BitReader<'de>,
180    {
181        Join::new(self, next)
182    }
183}
184impl<'de, T> BitReaderExt<'de> for T where T: BitReader<'de> + ?Sized {}
185
186impl<'de> BitReader<'de> for &'de BitSlice<u8, Msb0> {
187    type Error = StringError;
188
189    #[inline]
190    fn bits_left(&self) -> usize {
191        self.len()
192    }
193
194    #[inline]
195    fn read_bit(&mut self) -> Result<Option<bool>, Self::Error> {
196        let Some((bit, rest)) = self.split_first() else {
197            return Ok(None);
198        };
199        *self = rest;
200        Ok(Some(*bit))
201    }
202
203    #[inline]
204    fn read_bits_into(&mut self, dst: &mut BitSlice<u8, Msb0>) -> Result<usize, Self::Error> {
205        let n = dst.len().min(self.bits_left());
206        let (v, rest) = self.split_at(n);
207        dst[..n].copy_from_bitslice(v);
208        *self = rest;
209        Ok(n)
210    }
211
212    #[inline]
213    fn read_bits(&mut self, n: usize) -> Result<Cow<'de, BitSlice<u8, Msb0>>, Self::Error> {
214        let (v, rest) = self.split_at(n.min(self.bits_left()));
215        *self = rest;
216        Ok(Cow::Borrowed(v))
217    }
218
219    #[inline]
220    fn skip(&mut self, mut n: usize) -> Result<usize, Self::Error> {
221        n = n.min(self.bits_left());
222        let (_, rest) = self.split_at(n);
223        *self = rest;
224        Ok(n)
225    }
226}
227
228impl<'de> BitReader<'de> for &[bool] {
229    type Error = StringError;
230
231    #[inline]
232    fn bits_left(&self) -> usize {
233        self.len()
234    }
235
236    #[inline]
237    fn read_bit(&mut self) -> Result<Option<bool>, Self::Error> {
238        let Some((bit, rest)) = self.split_first() else {
239            return Ok(None);
240        };
241        *self = rest;
242        Ok(Some(*bit))
243    }
244
245    #[inline]
246    fn skip(&mut self, mut n: usize) -> Result<usize, Self::Error> {
247        n = n.min(self.bits_left());
248        let (_, rest) = self.split_at(n);
249        *self = rest;
250        Ok(n)
251    }
252}
253
254/// Binary string, e.g. `"0010110...."`
255impl<'de> BitReader<'de> for &str {
256    type Error = StringError;
257
258    #[inline]
259    fn bits_left(&self) -> usize {
260        self.len()
261    }
262
263    #[inline]
264    fn read_bit(&mut self) -> Result<Option<bool>, Self::Error> {
265        let Some((char, rest)) = self.split_at_checked(1) else {
266            return Ok(None);
267        };
268        let bit = match char {
269            "0" => false,
270            "1" => true,
271            _ => {
272                return Err(Error::custom(format!(
273                    "invalid character: expected '0' or '1', got: {char}",
274                )));
275            }
276        };
277        *self = rest;
278        Ok(Some(bit))
279    }
280}