use hopper_runtime::ProgramError;
#[inline(always)]
pub fn read_bit(byte: u8, n: u8) -> bool {
(byte >> n) & 1 == 1
}
#[inline(always)]
pub fn set_bit(byte: u8, n: u8) -> u8 {
byte | (1u8 << n)
}
#[inline(always)]
pub fn clear_bit(byte: u8, n: u8) -> u8 {
byte & !(1u8 << n)
}
#[inline(always)]
pub fn toggle_bit(byte: u8, n: u8) -> u8 {
byte ^ (1u8 << n)
}
#[inline(always)]
pub fn check_flags(byte: u8, mask: u8) -> bool {
byte & mask == mask
}
#[inline(always)]
pub fn check_any_flag(byte: u8, mask: u8) -> bool {
byte & mask != 0
}
#[inline(always)]
pub fn read_flags_at(data: &[u8], offset: usize) -> Result<u8, ProgramError> {
data.get(offset)
.copied()
.ok_or(ProgramError::AccountDataTooSmall)
}
#[inline(always)]
pub fn write_flags_at(data: &mut [u8], offset: usize, value: u8) -> Result<(), ProgramError> {
let byte = data
.get_mut(offset)
.ok_or(ProgramError::AccountDataTooSmall)?;
*byte = value;
Ok(())
}