Skip to main content

generic_array/ext_impls/
impl_bitvec.rs

1use bitvec::{
2    order::BitOrder,
3    ptr::BitSpanError,
4    slice::BitSlice,
5    store::BitStore,
6    view::{BitView, BitViewSized},
7};
8
9use crate::{ArrayLength, GenericArray};
10
11impl<T, N: ArrayLength> BitView for GenericArray<T, N>
12where
13    T: BitStore,
14{
15    type Store = T;
16
17    #[inline(always)]
18    fn view_bits<O>(&self) -> &BitSlice<T, O>
19    where
20        O: BitOrder,
21    {
22        BitSlice::from_slice(self)
23    }
24
25    #[inline(always)]
26    fn try_view_bits<O>(&self) -> Result<&BitSlice<T, O>, BitSpanError<T>>
27    where
28        O: BitOrder,
29    {
30        BitSlice::try_from_slice(self)
31    }
32
33    #[inline(always)]
34    fn view_bits_mut<O>(&mut self) -> &mut BitSlice<T, O>
35    where
36        O: BitOrder,
37    {
38        BitSlice::from_slice_mut(self)
39    }
40
41    #[inline(always)]
42    fn try_view_bits_mut<O>(&mut self) -> Result<&mut BitSlice<T, O>, BitSpanError<T>>
43    where
44        O: BitOrder,
45    {
46        BitSlice::try_from_slice_mut(self)
47    }
48}
49
50use const_default::ConstDefault;
51
52#[repr(transparent)]
53struct ZeroHelper<T>(T);
54
55impl<T> ConstDefault for ZeroHelper<T>
56where
57    T: BitStore,
58{
59    const DEFAULT: Self = Self(T::ZERO);
60}
61
62/// BitViewSized implementation for GenericArray
63///
64/// Ignore the ZeroHelper; it's just there to provide a way to create a zeroed
65/// GenericArray as a const.
66impl<T, N: ArrayLength> BitViewSized for GenericArray<T, N>
67where
68    T: BitStore,
69    GenericArray<ZeroHelper<T>, N>: ConstDefault,
70{
71    // SAFETY: ZeroHelper<T> is transparent over T, so this is the same memory layout,
72    // but we can exploit ConstDefault to create a zeroed array from T::ZERO.
73    const ZERO: Self = unsafe { crate::const_transmute(GenericArray::<ZeroHelper<T>, N>::DEFAULT) };
74
75    #[inline(always)]
76    fn as_raw_slice(&self) -> &[Self::Store] {
77        self.as_slice()
78    }
79
80    #[inline(always)]
81    fn as_raw_mut_slice(&mut self) -> &mut [Self::Store] {
82        self.as_mut_slice()
83    }
84}