#[repr(C)] #[derive(Copy, Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)] pub struct __BindgenBitfieldUnit { storage: Storage, } impl __BindgenBitfieldUnit { #[inline] pub const fn new(storage: Storage) -> Self { Self { storage } } } impl __BindgenBitfieldUnit where Storage: AsRef<[u8]> + AsMut<[u8]>, { #[inline] fn extract_bit(byte: u8, index: usize) -> bool { let bit_index = if cfg!(target_endian = "big") { 7 - (index % 8) } else { index % 8 }; let mask = 1 << bit_index; byte & mask == mask } #[inline] pub fn get_bit(&self, index: usize) -> bool { debug_assert!(index / 8 < self.storage.as_ref().len()); let byte_index = index / 8; let byte = self.storage.as_ref()[byte_index]; Self::extract_bit(byte, index) } #[inline] pub unsafe fn raw_get_bit(this: *const Self, index: usize) -> bool { debug_assert!(index / 8 < core::mem::size_of::()); let byte_index = index / 8; let byte = unsafe { *(core::ptr::addr_of!((*this).storage) as *const u8) .offset(byte_index as isize) }; Self::extract_bit(byte, index) } #[inline] fn change_bit(byte: u8, index: usize, val: bool) -> u8 { let bit_index = if cfg!(target_endian = "big") { 7 - (index % 8) } else { index % 8 }; let mask = 1 << bit_index; if val { byte | mask } else { byte & !mask } } #[inline] pub fn set_bit(&mut self, index: usize, val: bool) { debug_assert!(index / 8 < self.storage.as_ref().len()); let byte_index = index / 8; let byte = &mut self.storage.as_mut()[byte_index]; *byte = Self::change_bit(*byte, index, val); } #[inline] pub unsafe fn raw_set_bit(this: *mut Self, index: usize, val: bool) { debug_assert!(index / 8 < core::mem::size_of::()); let byte_index = index / 8; let byte = unsafe { (core::ptr::addr_of_mut!((*this).storage) as *mut u8) .offset(byte_index as isize) }; unsafe { *byte = Self::change_bit(*byte, index, val) }; } #[inline] pub fn get(&self, bit_offset: usize, bit_width: u8) -> u64 { debug_assert!(bit_width <= 64); debug_assert!(bit_offset / 8 < self.storage.as_ref().len()); debug_assert!( (bit_offset + (bit_width as usize)) / 8 <= self.storage.as_ref().len() ); let mut val = 0; for i in 0..(bit_width as usize) { if self.get_bit(i + bit_offset) { let index = if cfg!(target_endian = "big") { bit_width as usize - 1 - i } else { i }; val |= 1 << index; } } val } #[inline] pub unsafe fn raw_get( this: *const Self, bit_offset: usize, bit_width: u8, ) -> u64 { debug_assert!(bit_width <= 64); debug_assert!(bit_offset / 8 < core::mem::size_of::()); debug_assert!( (bit_offset + (bit_width as usize)) / 8 <= core::mem::size_of::() ); let mut val = 0; for i in 0..(bit_width as usize) { if unsafe { Self::raw_get_bit(this, i + bit_offset) } { let index = if cfg!(target_endian = "big") { bit_width as usize - 1 - i } else { i }; val |= 1 << index; } } val } #[inline] pub fn set(&mut self, bit_offset: usize, bit_width: u8, val: u64) { debug_assert!(bit_width <= 64); debug_assert!(bit_offset / 8 < self.storage.as_ref().len()); debug_assert!( (bit_offset + (bit_width as usize)) / 8 <= self.storage.as_ref().len() ); for i in 0..(bit_width as usize) { let mask = 1 << i; let val_bit_is_set = val & mask == mask; let index = if cfg!(target_endian = "big") { bit_width as usize - 1 - i } else { i }; self.set_bit(index + bit_offset, val_bit_is_set); } } #[inline] pub unsafe fn raw_set( this: *mut Self, bit_offset: usize, bit_width: u8, val: u64, ) { debug_assert!(bit_width <= 64); debug_assert!(bit_offset / 8 < core::mem::size_of::()); debug_assert!( (bit_offset + (bit_width as usize)) / 8 <= core::mem::size_of::() ); for i in 0..(bit_width as usize) { let mask = 1 << i; let val_bit_is_set = val & mask == mask; let index = if cfg!(target_endian = "big") { bit_width as usize - 1 - i } else { i }; unsafe { Self::raw_set_bit(this, index + bit_offset, val_bit_is_set) }; } } }