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