jvm_rs/
bitfield.rs

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}