#[inline(always)]
pub const fn bitset_index(flag: u16) -> usize {
(flag >> 4) as usize
}
#[inline(always)]
pub const fn bitset_mask(flag: u16) -> u16 {
1u16 << (flag & 0x0F)
}
#[inline(always)]
pub fn bitset_get(set: &[u16], flag: u16) -> bool {
let idx = bitset_index(flag);
(set[idx] & bitset_mask(flag)) != 0
}
#[inline(always)]
pub fn bitset_set(set: &mut [u16], flag: u16) {
let idx = bitset_index(flag);
set[idx] |= bitset_mask(flag);
}
#[inline(always)]
pub fn bitset_clear(set: &mut [u16], flag: u16) {
let idx = bitset_index(flag);
set[idx] &= !bitset_mask(flag);
}
#[inline(always)]
pub fn bitset_word_mut(set: &mut [u16], flag: u16) -> &mut u16 {
let idx = bitset_index(flag);
&mut set[idx]
}
#[cfg(test)]
mod tests {
use super::*;
#[allow(non_camel_case_types)]
#[repr(u16)]
pub enum Flag {
HAS_SEEN_BOB = 0x10, }
#[test]
fn roundtrip() {
let mut save_flags = [0u16; 2];
bitset_set(&mut save_flags, Flag::HAS_SEEN_BOB as u16);
assert!(bitset_get(&save_flags, Flag::HAS_SEEN_BOB as u16));
bitset_clear(&mut save_flags, Flag::HAS_SEEN_BOB as u16);
assert!(!bitset_get(&save_flags, Flag::HAS_SEEN_BOB as u16));
}
}