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}
85
86#[cfg(test)]
87mod tests {
88 use crate::{arr, typenum::U2, GenericArray};
89 use bitvec::order::Lsb0;
90 use bitvec::view::{BitView, BitViewSized};
91
92 #[test]
93 fn view_bits() {
94 let a = arr![0b0000_1010u8, 0u8];
95
96 let bits = a.view_bits::<Lsb0>();
97 assert_eq!(bits.len(), 16);
98 assert!(!bits[0]);
99 assert!(bits[1]);
100 assert!(bits[3]);
101
102 let ok = a.try_view_bits::<Lsb0>();
103 assert!(ok.is_ok());
104 }
105
106 #[test]
107 fn view_bits_mut() {
108 let mut a = arr![0u8, 0u8];
109
110 a.view_bits_mut::<Lsb0>().set(0, true);
111 a.view_bits_mut::<Lsb0>().set(9, true);
112 assert_eq!(a, arr![0b0000_0001u8, 0b0000_0010u8]);
113
114 assert!(a.try_view_bits_mut::<Lsb0>().is_ok());
115 }
116
117 #[test]
118 fn bit_view_sized_zero() {
119 let z = GenericArray::<u8, U2>::ZERO;
121 assert_eq!(z, arr![0u8, 0u8]);
122
123 let mut z = z;
124 assert_eq!(z.as_raw_slice(), &[0u8, 0u8]);
125 z.as_raw_mut_slice()[0] = 5;
126 assert_eq!(z[0], 5);
127 }
128}