bitcode/
bool.rs

1use crate::coder::{Buffer, Decoder, Encoder, Result, View};
2use crate::fast::{CowSlice, NextUnchecked, PushUnchecked, SliceImpl, Unaligned, VecImpl};
3use crate::pack::{pack_bools, unpack_bools};
4use alloc::vec::Vec;
5use core::num::NonZeroUsize;
6
7#[derive(Default)]
8pub struct BoolEncoder(VecImpl<bool>);
9
10impl Encoder<bool> for BoolEncoder {
11    #[inline(always)]
12    fn as_primitive(&mut self) -> Option<&mut VecImpl<bool>> {
13        Some(&mut self.0)
14    }
15
16    #[inline(always)]
17    fn encode(&mut self, t: &bool) {
18        unsafe { self.0.push_unchecked(*t) };
19    }
20}
21
22impl Buffer for BoolEncoder {
23    fn collect_into(&mut self, out: &mut Vec<u8>) {
24        pack_bools(self.0.as_slice(), out);
25        self.0.clear();
26    }
27
28    fn reserve(&mut self, additional: NonZeroUsize) {
29        self.0.reserve(additional.get());
30    }
31}
32
33#[derive(Default)]
34pub struct BoolDecoder<'a>(CowSlice<'a, bool>);
35
36impl<'a> View<'a> for BoolDecoder<'a> {
37    fn populate(&mut self, input: &mut &'_ [u8], length: usize) -> Result<()> {
38        unpack_bools(input, length, &mut self.0)?;
39        Ok(())
40    }
41}
42
43impl<'a> Decoder<'a, bool> for BoolDecoder<'a> {
44    #[inline(always)]
45    fn as_primitive(&mut self) -> Option<&mut SliceImpl<Unaligned<bool>>> {
46        // Safety: `Unaligned<bool>` is equivalent to bool since it's a `#[repr(C, packed)]` wrapper
47        // around bool and both have size/align of 1.
48        unsafe { Some(core::mem::transmute(self.0.mut_slice())) }
49    }
50
51    #[inline(always)]
52    fn decode(&mut self) -> bool {
53        unsafe { self.0.mut_slice().next_unchecked() }
54    }
55}
56
57#[cfg(test)]
58mod test {
59    use alloc::vec::Vec;
60
61    fn bench_data() -> Vec<bool> {
62        (0..=1000).map(|_| false).collect()
63    }
64    crate::bench_encode_decode!(bool_vec: Vec<_>);
65}
66
67#[cfg(test)]
68mod test2 {
69    use alloc::vec::Vec;
70
71    fn bench_data() -> Vec<Vec<bool>> {
72        crate::random_data::<u8>(125)
73            .into_iter()
74            .map(|n| {
75                let n = 1 + n / 16;
76                (0..n).map(|_| false).collect()
77            })
78            .collect()
79    }
80    crate::bench_encode_decode!(bool_vecs: Vec<Vec<_>>);
81}