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#[autoimpl(for <R: trait + ?Sized> &mut R, Box<R>)]
17pub trait BitReader<'de> {
18 type Error: Error;
20
21 fn bits_left(&self) -> usize;
23
24 fn read_bit(&mut self) -> Result<Option<bool>, Self::Error>;
26
27 #[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 #[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 #[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
61pub trait BitReaderExt<'de>: BitReader<'de> {
63 #[inline]
65 fn is_empty(&self) -> bool {
66 self.bits_left() == 0
67 }
68
69 #[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 #[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 #[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 #[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 #[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 #[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 #[inline]
144 fn as_mut(&mut self) -> &mut Self {
145 self
146 }
147
148 #[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 #[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
254impl<'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}