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 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}