1use anyhow::{Result, ensure};
17
18#[macro_export]
21macro_rules! to_bits_le {
22    ($($x:expr),*) => ({
23        let mut buffer = vec![];
24        $($x.write_bits_le(&mut buffer);)*
25        buffer
26    });
27    ($($x:expr),*; $size:expr) => ({
28        let mut buffer = Vec::with_capacity($size);
29        $($x.write_bits_le(&mut buffer);)*
30        buffer
31    });
32}
33
34#[macro_export]
37macro_rules! to_bits_raw_le {
38    ($($x:expr),*) => ({
39        let mut buffer = vec![];
40        $($x.write_bits_raw_le(&mut buffer);)*
41        buffer
42    });
43    ($($x:expr),*; $size:expr) => ({
44        let mut buffer = Vec::with_capacity($size);
45        $($x.write_bits_raw_le(&mut buffer);)*
46        buffer
47    });
48}
49
50pub trait ToBits: Sized {
51    fn write_bits_le(&self, vec: &mut Vec<bool>);
53
54    fn write_bits_be(&self, vec: &mut Vec<bool>);
56
57    fn to_bits_le(&self) -> Vec<bool> {
59        let mut bits = Vec::new();
60        self.write_bits_le(&mut bits);
61        bits
62    }
63
64    fn to_bits_be(&self) -> Vec<bool> {
66        let mut bits = Vec::new();
67        self.write_bits_be(&mut bits);
68        bits
69    }
70
71    fn num_bits() -> Option<usize> {
73        None
74    }
75}
76
77pub trait ToBitsRaw: ToBits + Sized {
78    fn write_bits_raw_le(&self, vec: &mut Vec<bool>);
80
81    fn write_bits_raw_be(&self, vec: &mut Vec<bool>);
83
84    fn to_bits_raw_le(&self) -> Vec<bool> {
86        let mut bits = Vec::new();
87        self.write_bits_raw_le(&mut bits);
88        bits
89    }
90
91    fn to_bits_raw_be(&self) -> Vec<bool> {
93        let mut bits = Vec::new();
94        self.write_bits_raw_be(&mut bits);
95        bits
96    }
97}
98
99pub trait FromBits: Sized {
100    fn from_bits_le(bits: &[bool]) -> Result<Self>;
102
103    fn from_bits_be(bits: &[bool]) -> Result<Self>;
105}
106
107macro_rules! to_bits_tuple {
113    (($t0:ident, $i0:tt), $(($ty:ident, $idx:tt)),+) => {
114        impl<$t0: ToBits, $($ty: ToBits),+> ToBits for ($t0, $($ty),+) {
115            #[inline]
117            fn write_bits_le(&self, vec: &mut Vec<bool>) {
118                (&self).write_bits_le(vec);
120            }
121
122            #[inline]
124            fn write_bits_be(&self, vec: &mut Vec<bool>) {
125                (&self).write_bits_be(vec);
127            }
128        }
129
130        impl<'a, $t0: ToBits, $($ty: ToBits),+> ToBits for &'a ($t0, $($ty),+) {
131            #[inline]
133            fn write_bits_le(&self, vec: &mut Vec<bool>) {
134                self.$i0.write_bits_le(vec);
136                $(self.$idx.write_bits_le(vec);)+
137            }
138
139            #[inline]
141            fn write_bits_be(&self, vec: &mut Vec<bool>) {
142                self.$i0.write_bits_be(vec);
144                $(self.$idx.write_bits_be(vec);)+
145            }
146        }
147
148        impl<$t0: ToBitsRaw, $($ty: ToBitsRaw),+> ToBitsRaw for ($t0, $($ty),+) {
149            #[inline]
151            fn write_bits_raw_le(&self, vec: &mut Vec<bool>) {
152                (&self).write_bits_raw_le(vec);
154            }
155
156            #[inline]
158            fn write_bits_raw_be(&self, vec: &mut Vec<bool>) {
159                (&self).write_bits_raw_be(vec);
161            }
162        }
163
164        impl<'a, $t0: ToBitsRaw, $($ty: ToBitsRaw),+> ToBitsRaw for &'a ($t0, $($ty),+) {
165            #[inline]
167            fn write_bits_raw_le(&self, vec: &mut Vec<bool>) {
168                self.$i0.write_bits_raw_le(vec);
170                $(self.$idx.write_bits_raw_le(vec);)+
171            }
172
173            #[inline]
175            fn write_bits_raw_be(&self, vec: &mut Vec<bool>) {
176                self.$i0.write_bits_raw_be(vec);
178                $(self.$idx.write_bits_raw_be(vec);)+
179            }
180        }
181    }
182}
183
184to_bits_tuple!((C0, 0), (C1, 1));
185to_bits_tuple!((C0, 0), (C1, 1), (C2, 2));
186to_bits_tuple!((C0, 0), (C1, 1), (C2, 2), (C3, 3));
187to_bits_tuple!((C0, 0), (C1, 1), (C2, 2), (C3, 3), (C4, 4));
188to_bits_tuple!((C0, 0), (C1, 1), (C2, 2), (C3, 3), (C4, 4), (C5, 5));
189to_bits_tuple!((C0, 0), (C1, 1), (C2, 2), (C3, 3), (C4, 4), (C5, 5), (C6, 6));
190to_bits_tuple!((C0, 0), (C1, 1), (C2, 2), (C3, 3), (C4, 4), (C5, 5), (C6, 6), (C7, 7));
191to_bits_tuple!((C0, 0), (C1, 1), (C2, 2), (C3, 3), (C4, 4), (C5, 5), (C6, 6), (C7, 7), (C8, 8));
192to_bits_tuple!((C0, 0), (C1, 1), (C2, 2), (C3, 3), (C4, 4), (C5, 5), (C6, 6), (C7, 7), (C8, 8), (C9, 9));
193to_bits_tuple!((C0, 0), (C1, 1), (C2, 2), (C3, 3), (C4, 4), (C5, 5), (C6, 6), (C7, 7), (C8, 8), (C9, 9), (C10, 10));
194
195impl ToBits for bool {
200    #[inline]
202    fn write_bits_le(&self, vec: &mut Vec<bool>) {
203        vec.push(*self);
204    }
205
206    #[inline]
208    fn write_bits_be(&self, vec: &mut Vec<bool>) {
209        vec.push(*self);
210    }
211}
212
213macro_rules! impl_bits_for_integer {
218    ($int:ty) => {
219        impl ToBits for $int {
220            #[inline]
222            fn write_bits_le(&self, vec: &mut Vec<bool>) {
223                let mut value = *self;
224                for _ in 0..<$int>::BITS {
225                    vec.push(value & 1 == 1);
226                    value = value.wrapping_shr(1u32);
227                }
228            }
229
230            #[inline]
232            fn write_bits_be(&self, vec: &mut Vec<bool>) {
233                let reversed = self.reverse_bits();
234                reversed.write_bits_le(vec);
235            }
236
237            fn num_bits() -> Option<usize> {
238                Some(<$int>::BITS as usize)
239            }
240        }
241
242        impl FromBits for $int {
243            #[inline]
245            fn from_bits_le(bits: &[bool]) -> Result<Self> {
246                for bit in bits.iter().skip(<$int>::BITS as usize) {
249                    ensure!(!bit, "upper bits are not zero");
250                }
251                Ok(bits.iter().take(<$int>::BITS as usize).rev().fold(0, |value, bit| match bit {
253                    true => (value.wrapping_shl(1)) ^ 1,
254                    false => (value.wrapping_shl(1)) ^ 0,
255                }))
256            }
257
258            #[inline]
260            fn from_bits_be(bits: &[bool]) -> Result<Self> {
261                for bit in bits.iter().take(bits.len().saturating_sub(<$int>::BITS as usize)) {
264                    ensure!(!bit, "upper bits are not zero");
265                }
266                Ok(bits.iter().skip(bits.len().saturating_sub(<$int>::BITS as usize)).fold(0, |value, bit| match bit {
268                    true => (value.wrapping_shl(1)) ^ 1,
269                    false => (value.wrapping_shl(1)) ^ 0,
270                }))
271            }
272        }
273    };
274}
275
276impl_bits_for_integer!(u8);
277impl_bits_for_integer!(u16);
278impl_bits_for_integer!(u32);
279impl_bits_for_integer!(u64);
280impl_bits_for_integer!(u128);
281
282impl_bits_for_integer!(i8);
283impl_bits_for_integer!(i16);
284impl_bits_for_integer!(i32);
285impl_bits_for_integer!(i64);
286impl_bits_for_integer!(i128);
287
288impl ToBits for String {
293    #[inline]
295    fn write_bits_le(&self, vec: &mut Vec<bool>) {
296        self.as_bytes().write_bits_le(vec);
298    }
299
300    #[inline]
302    fn write_bits_be(&self, vec: &mut Vec<bool>) {
303        self.as_bytes().write_bits_be(vec);
305    }
306}
307
308impl<C: ToBits> ToBits for Vec<C> {
313    #[inline]
315    fn write_bits_le(&self, vec: &mut Vec<bool>) {
316        self.as_slice().write_bits_le(vec);
318    }
319
320    #[inline]
322    fn write_bits_be(&self, vec: &mut Vec<bool>) {
323        self.as_slice().write_bits_be(vec);
325    }
326}
327
328impl<C: ToBits, const N: usize> ToBits for [C; N] {
329    #[inline]
331    fn write_bits_le(&self, vec: &mut Vec<bool>) {
332        self.as_slice().write_bits_le(vec)
334    }
335
336    #[inline]
338    fn write_bits_be(&self, vec: &mut Vec<bool>) {
339        self.as_slice().write_bits_be(vec)
341    }
342}
343
344impl<C: ToBits> ToBits for &[C] {
345    #[inline]
347    fn write_bits_le(&self, vec: &mut Vec<bool>) {
348        if let Some(num_bits) = C::num_bits() {
349            vec.reserve(num_bits * self.len());
350        }
351
352        for elem in self.iter() {
353            elem.write_bits_le(vec);
354        }
355    }
356
357    #[inline]
359    fn write_bits_be(&self, vec: &mut Vec<bool>) {
360        if let Some(num_bits) = C::num_bits() {
361            vec.reserve(num_bits * self.len());
362        }
363
364        for elem in self.iter() {
365            elem.write_bits_be(vec);
366        }
367    }
368}
369
370impl<C: ToBitsRaw> ToBitsRaw for Vec<C> {
371    #[inline]
373    fn write_bits_raw_le(&self, vec: &mut Vec<bool>) {
374        self.as_slice().write_bits_raw_le(vec);
376    }
377
378    #[inline]
380    fn write_bits_raw_be(&self, vec: &mut Vec<bool>) {
381        self.as_slice().write_bits_raw_be(vec);
383    }
384}
385
386impl<C: ToBitsRaw, const N: usize> ToBitsRaw for [C; N] {
387    #[inline]
389    fn write_bits_raw_le(&self, vec: &mut Vec<bool>) {
390        self.as_slice().write_bits_raw_le(vec)
392    }
393
394    #[inline]
396    fn write_bits_raw_be(&self, vec: &mut Vec<bool>) {
397        self.as_slice().write_bits_raw_be(vec)
399    }
400}
401
402impl<C: ToBitsRaw> ToBitsRaw for &[C] {
403    #[inline]
405    fn write_bits_raw_le(&self, vec: &mut Vec<bool>) {
406        if let Some(num_bits) = C::num_bits() {
407            vec.reserve(num_bits * self.len());
408        }
409
410        for elem in self.iter() {
411            elem.write_bits_raw_le(vec);
412        }
413    }
414
415    #[inline]
417    fn write_bits_raw_be(&self, vec: &mut Vec<bool>) {
418        if let Some(num_bits) = C::num_bits() {
419            vec.reserve(num_bits * self.len());
420        }
421
422        for elem in self.iter() {
423            elem.write_bits_raw_be(vec);
424        }
425    }
426}
427
428impl FromBits for Vec<u8> {
429    #[inline]
431    fn from_bits_le(bits: &[bool]) -> Result<Self> {
432        bits.chunks(8).map(u8::from_bits_le).collect::<Result<Vec<_>>>()
434    }
435
436    #[inline]
438    fn from_bits_be(bits: &[bool]) -> Result<Self> {
439        bits.chunks(8).map(u8::from_bits_be).collect::<Result<Vec<_>>>()
441    }
442}
443
444#[cfg(test)]
445mod tests {
446    use super::*;
447    use crate::{TestRng, Uniform};
448
449    use anyhow::Result;
450    use rand::{Rng, distributions::Alphanumeric};
451
452    const ITERATIONS: u64 = 10000;
453
454    fn random_string(len: u16, rng: &mut TestRng) -> String {
455        rng.sample_iter(&Alphanumeric).take(len as usize).map(char::from).collect()
456    }
457
458    #[test]
459    fn test_to_bits_le_macro() {
460        let rng = &mut TestRng::default();
461
462        macro_rules! check {
464            ($given:expr) => {{
465                let given = $given;
466
467                let mut expected = Vec::new();
468                given.iter().for_each(|elem| elem.write_bits_le(&mut expected));
469
470                let candidate = to_bits_le!(given);
471                assert_eq!(candidate, expected);
472            }};
473        }
474
475        check!((0..100).map(|_| Uniform::rand(rng)).collect::<Vec<u8>>());
477        check!((0..100).map(|_| Uniform::rand(rng)).collect::<Vec<u16>>());
479        check!((0..100).map(|_| Uniform::rand(rng)).collect::<Vec<u32>>());
481        check!((0..100).map(|_| Uniform::rand(rng)).collect::<Vec<u64>>());
483        check!((0..100).map(|_| Uniform::rand(rng)).collect::<Vec<u128>>());
485        check!((0..100).map(|_| Uniform::rand(rng)).collect::<Vec<i8>>());
487        check!((0..100).map(|_| Uniform::rand(rng)).collect::<Vec<i16>>());
489        check!((0..100).map(|_| Uniform::rand(rng)).collect::<Vec<i32>>());
491        check!((0..100).map(|_| Uniform::rand(rng)).collect::<Vec<i64>>());
493        check!((0..100).map(|_| Uniform::rand(rng)).collect::<Vec<i128>>());
495        check!((0..100).map(|_| random_string(rng.r#gen(), rng)).collect::<Vec<String>>());
497        check!((0..100).map(|_| (0..128).map(|_| Uniform::rand(rng)).collect::<Vec<u8>>()).collect::<Vec<_>>());
499        check!((0..100).map(|_| (0..128).map(|_| Uniform::rand(rng)).collect::<Vec<u16>>()).collect::<Vec<_>>());
501        check!((0..100).map(|_| (0..128).map(|_| Uniform::rand(rng)).collect::<Vec<u32>>()).collect::<Vec<_>>());
503        check!((0..100).map(|_| (0..128).map(|_| Uniform::rand(rng)).collect::<Vec<u64>>()).collect::<Vec<_>>());
505        check!((0..100).map(|_| (0..128).map(|_| Uniform::rand(rng)).collect::<Vec<u128>>()).collect::<Vec<_>>());
507        check!((0..100).map(|_| (0..128).map(|_| Uniform::rand(rng)).collect::<Vec<i8>>()).collect::<Vec<_>>());
509        check!((0..100).map(|_| (0..128).map(|_| Uniform::rand(rng)).collect::<Vec<i16>>()).collect::<Vec<_>>());
511        check!((0..100).map(|_| (0..128).map(|_| Uniform::rand(rng)).collect::<Vec<i32>>()).collect::<Vec<_>>());
513        check!((0..100).map(|_| (0..128).map(|_| Uniform::rand(rng)).collect::<Vec<i64>>()).collect::<Vec<_>>());
515        check!((0..100).map(|_| (0..128).map(|_| Uniform::rand(rng)).collect::<Vec<i128>>()).collect::<Vec<_>>());
517        check!(
519            (0..100)
520                .map(|_| (0..128).map(|_| random_string(rng.r#gen(), rng)).collect::<Vec<String>>())
521                .collect::<Vec<_>>()
522        );
523    }
524
525    #[test]
526    fn test_to_bits_le_macro_with_capacity() {
527        let mut expected = Vec::new();
528        1u8.write_bits_le(&mut expected);
529        2u16.write_bits_le(&mut expected);
530        3u32.write_bits_le(&mut expected);
531        4u64.write_bits_le(&mut expected);
532        5u128.write_bits_le(&mut expected);
533        6i8.write_bits_le(&mut expected);
534        7i16.write_bits_le(&mut expected);
535        8i32.write_bits_le(&mut expected);
536        9i64.write_bits_le(&mut expected);
537        10i128.write_bits_le(&mut expected);
538
539        let capacity = expected.len();
540
541        let candidate = to_bits_le![1u8, 2u16, 3u32, 4u64, 5u128, 6i8, 7i16, 8i32, 9i64, 10i128; capacity];
542        assert_eq!(candidate, expected);
543    }
544
545    #[test]
546    fn test_integers() -> Result<()> {
547        macro_rules! check_integer {
548            ($integer:tt, $rng:expr) => {{
549                for _ in 0..ITERATIONS {
550                    let expected: $integer = Uniform::rand($rng);
551
552                    let bits_le = expected.to_bits_le();
553                    assert_eq!(expected, $integer::from_bits_le(&bits_le)?);
554
555                    let bits_be = expected.to_bits_be();
556                    assert_eq!(expected, $integer::from_bits_be(&bits_be)?);
557                }
558            }};
559        }
560
561        let mut rng = TestRng::default();
562
563        check_integer!(u8, &mut rng);
564        check_integer!(u16, &mut rng);
565        check_integer!(u32, &mut rng);
566        check_integer!(u64, &mut rng);
567        check_integer!(u128, &mut rng);
568
569        check_integer!(i8, &mut rng);
570        check_integer!(i16, &mut rng);
571        check_integer!(i32, &mut rng);
572        check_integer!(i64, &mut rng);
573        check_integer!(i128, &mut rng);
574
575        Ok(())
576    }
577}