generic_array/ext_impls/
impl_bitvec.rs1use 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
62impl<T, N: ArrayLength> BitViewSized for GenericArray<T, N>
67where
68 T: BitStore,
69 GenericArray<ZeroHelper<T>, N>: ConstDefault,
70{
71 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}