1#[repr(C)]
2#[derive(Copy, Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
3pub struct __BindgenBitfieldUnit<Storage, Align> {
4 storage: Storage,
5 align: [Align; 0],
6}
7impl<Storage, Align> __BindgenBitfieldUnit<Storage, Align> {
8 #[inline]
9 pub const fn new(storage: Storage) -> Self {
10 Self { storage, align: [] }
11 }
12}
13impl<Storage, Align> __BindgenBitfieldUnit<Storage, Align>
14 where
15 Storage: AsRef<[u8]> + AsMut<[u8]>,
16{
17 #[inline]
18 pub fn get_bit(&self, index: usize) -> bool {
19 debug_assert!(index / 8 < self.storage.as_ref().len());
20 let byte_index = index / 8;
21 let byte = self.storage.as_ref()[byte_index];
22 let bit_index = if cfg!(target_endian = "big") {
23 7 - (index % 8)
24 } else {
25 index % 8
26 };
27 let mask = 1 << bit_index;
28 byte & mask == mask
29 }
30 #[inline]
31 pub fn set_bit(&mut self, index: usize, val: bool) {
32 debug_assert!(index / 8 < self.storage.as_ref().len());
33 let byte_index = index / 8;
34 let byte = &mut self.storage.as_mut()[byte_index];
35 let bit_index = if cfg!(target_endian = "big") {
36 7 - (index % 8)
37 } else {
38 index % 8
39 };
40 let mask = 1 << bit_index;
41 if val {
42 *byte |= mask;
43 } else {
44 *byte &= !mask;
45 }
46 }
47 #[inline]
48 pub fn get(&self, bit_offset: usize, bit_width: u8) -> u64 {
49 debug_assert!(bit_width <= 64);
50 debug_assert!(bit_offset / 8 < self.storage.as_ref().len());
51 debug_assert!((bit_offset + (bit_width as usize)) / 8 <= self.storage.as_ref().len());
52 let mut val = 0;
53 for i in 0..(bit_width as usize) {
54 if self.get_bit(i + bit_offset) {
55 let index = if cfg!(target_endian = "big") {
56 bit_width as usize - 1 - i
57 } else {
58 i
59 };
60 val |= 1 << index;
61 }
62 }
63 val
64 }
65 #[inline]
66 pub fn set(&mut self, bit_offset: usize, bit_width: u8, val: u64) {
67 debug_assert!(bit_width <= 64);
68 debug_assert!(bit_offset / 8 < self.storage.as_ref().len());
69 debug_assert!((bit_offset + (bit_width as usize)) / 8 <= self.storage.as_ref().len());
70 for i in 0..(bit_width as usize) {
71 let mask = 1 << i;
72 let val_bit_is_set = val & mask == mask;
73 let index = if cfg!(target_endian = "big") {
74 bit_width as usize - 1 - i
75 } else {
76 i
77 };
78 self.set_bit(index + bit_offset, val_bit_is_set);
79 }
80 }
81}