112a9d9c8Sopenharmony_ci#[repr(C)] 212a9d9c8Sopenharmony_ci#[derive(Copy, Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)] 312a9d9c8Sopenharmony_cipub struct __BindgenBitfieldUnit<Storage> { 412a9d9c8Sopenharmony_ci storage: Storage, 512a9d9c8Sopenharmony_ci} 612a9d9c8Sopenharmony_ci 712a9d9c8Sopenharmony_ciimpl<Storage> __BindgenBitfieldUnit<Storage> { 812a9d9c8Sopenharmony_ci #[inline] 912a9d9c8Sopenharmony_ci pub const fn new(storage: Storage) -> Self { 1012a9d9c8Sopenharmony_ci Self { storage } 1112a9d9c8Sopenharmony_ci } 1212a9d9c8Sopenharmony_ci} 1312a9d9c8Sopenharmony_ci 1412a9d9c8Sopenharmony_ciimpl<Storage> __BindgenBitfieldUnit<Storage> 1512a9d9c8Sopenharmony_ciwhere 1612a9d9c8Sopenharmony_ci Storage: AsRef<[u8]> + AsMut<[u8]>, 1712a9d9c8Sopenharmony_ci{ 1812a9d9c8Sopenharmony_ci #[inline] 1912a9d9c8Sopenharmony_ci pub fn get_bit(&self, index: usize) -> bool { 2012a9d9c8Sopenharmony_ci debug_assert!(index / 8 < self.storage.as_ref().len()); 2112a9d9c8Sopenharmony_ci 2212a9d9c8Sopenharmony_ci let byte_index = index / 8; 2312a9d9c8Sopenharmony_ci let byte = self.storage.as_ref()[byte_index]; 2412a9d9c8Sopenharmony_ci 2512a9d9c8Sopenharmony_ci let bit_index = if cfg!(target_endian = "big") { 2612a9d9c8Sopenharmony_ci 7 - (index % 8) 2712a9d9c8Sopenharmony_ci } else { 2812a9d9c8Sopenharmony_ci index % 8 2912a9d9c8Sopenharmony_ci }; 3012a9d9c8Sopenharmony_ci 3112a9d9c8Sopenharmony_ci let mask = 1 << bit_index; 3212a9d9c8Sopenharmony_ci 3312a9d9c8Sopenharmony_ci byte & mask == mask 3412a9d9c8Sopenharmony_ci } 3512a9d9c8Sopenharmony_ci 3612a9d9c8Sopenharmony_ci #[inline] 3712a9d9c8Sopenharmony_ci pub fn set_bit(&mut self, index: usize, val: bool) { 3812a9d9c8Sopenharmony_ci debug_assert!(index / 8 < self.storage.as_ref().len()); 3912a9d9c8Sopenharmony_ci 4012a9d9c8Sopenharmony_ci let byte_index = index / 8; 4112a9d9c8Sopenharmony_ci let byte = &mut self.storage.as_mut()[byte_index]; 4212a9d9c8Sopenharmony_ci 4312a9d9c8Sopenharmony_ci let bit_index = if cfg!(target_endian = "big") { 4412a9d9c8Sopenharmony_ci 7 - (index % 8) 4512a9d9c8Sopenharmony_ci } else { 4612a9d9c8Sopenharmony_ci index % 8 4712a9d9c8Sopenharmony_ci }; 4812a9d9c8Sopenharmony_ci 4912a9d9c8Sopenharmony_ci let mask = 1 << bit_index; 5012a9d9c8Sopenharmony_ci if val { 5112a9d9c8Sopenharmony_ci *byte |= mask; 5212a9d9c8Sopenharmony_ci } else { 5312a9d9c8Sopenharmony_ci *byte &= !mask; 5412a9d9c8Sopenharmony_ci } 5512a9d9c8Sopenharmony_ci } 5612a9d9c8Sopenharmony_ci 5712a9d9c8Sopenharmony_ci #[inline] 5812a9d9c8Sopenharmony_ci pub fn get(&self, bit_offset: usize, bit_width: u8) -> u64 { 5912a9d9c8Sopenharmony_ci debug_assert!(bit_width <= 64); 6012a9d9c8Sopenharmony_ci debug_assert!(bit_offset / 8 < self.storage.as_ref().len()); 6112a9d9c8Sopenharmony_ci debug_assert!( 6212a9d9c8Sopenharmony_ci (bit_offset + (bit_width as usize)) / 8 <= 6312a9d9c8Sopenharmony_ci self.storage.as_ref().len() 6412a9d9c8Sopenharmony_ci ); 6512a9d9c8Sopenharmony_ci 6612a9d9c8Sopenharmony_ci let mut val = 0; 6712a9d9c8Sopenharmony_ci 6812a9d9c8Sopenharmony_ci for i in 0..(bit_width as usize) { 6912a9d9c8Sopenharmony_ci if self.get_bit(i + bit_offset) { 7012a9d9c8Sopenharmony_ci let index = if cfg!(target_endian = "big") { 7112a9d9c8Sopenharmony_ci bit_width as usize - 1 - i 7212a9d9c8Sopenharmony_ci } else { 7312a9d9c8Sopenharmony_ci i 7412a9d9c8Sopenharmony_ci }; 7512a9d9c8Sopenharmony_ci val |= 1 << index; 7612a9d9c8Sopenharmony_ci } 7712a9d9c8Sopenharmony_ci } 7812a9d9c8Sopenharmony_ci 7912a9d9c8Sopenharmony_ci val 8012a9d9c8Sopenharmony_ci } 8112a9d9c8Sopenharmony_ci 8212a9d9c8Sopenharmony_ci #[inline] 8312a9d9c8Sopenharmony_ci pub fn set(&mut self, bit_offset: usize, bit_width: u8, val: u64) { 8412a9d9c8Sopenharmony_ci debug_assert!(bit_width <= 64); 8512a9d9c8Sopenharmony_ci debug_assert!(bit_offset / 8 < self.storage.as_ref().len()); 8612a9d9c8Sopenharmony_ci debug_assert!( 8712a9d9c8Sopenharmony_ci (bit_offset + (bit_width as usize)) / 8 <= 8812a9d9c8Sopenharmony_ci self.storage.as_ref().len() 8912a9d9c8Sopenharmony_ci ); 9012a9d9c8Sopenharmony_ci 9112a9d9c8Sopenharmony_ci for i in 0..(bit_width as usize) { 9212a9d9c8Sopenharmony_ci let mask = 1 << i; 9312a9d9c8Sopenharmony_ci let val_bit_is_set = val & mask == mask; 9412a9d9c8Sopenharmony_ci let index = if cfg!(target_endian = "big") { 9512a9d9c8Sopenharmony_ci bit_width as usize - 1 - i 9612a9d9c8Sopenharmony_ci } else { 9712a9d9c8Sopenharmony_ci i 9812a9d9c8Sopenharmony_ci }; 9912a9d9c8Sopenharmony_ci self.set_bit(index + bit_offset, val_bit_is_set); 10012a9d9c8Sopenharmony_ci } 10112a9d9c8Sopenharmony_ci } 10212a9d9c8Sopenharmony_ci} 103