use super::common::*;
use super::mask::Mask;
use super::set::Set;
#[derive(Debug)] pub struct Flag<const OFFSET: u8>;
#[allow(private_bounds)]
impl<const OFFSET: u8> const Flag<OFFSET> {
fn unchecked_read<In, Out>(&self, bitset: &In) -> Out
where In: const Set<Out, OFFSET, 1>,
Out: const CastFromUReg,
{
let mask: Mask = self.into();
Out::cast_from(mask.apply(bitset))
}
pub fn read<In, Out>(&self, bitset: &In) -> Out
where In: const Set<Out, OFFSET, 1>,
Out: const CastFromUReg,
{
let _ = <In>::ASSERT_FLAG;
self.unchecked_read(bitset)
}
pub fn get<In>(&self, bitset: &In) -> bool
where In: const Set<bool, OFFSET, 1>,
{
let _ = <In>::ASSERT_FLAG;
self.read(bitset)
}
pub fn is_set<In>(&self, bitset: &In) -> bool
where In: const Set<bool, OFFSET, 1>,
{
let _ = <In>::ASSERT_FLAG;
self.get(bitset)
}
pub fn is_clr<In>(&self, bitset: &In) -> bool
where In: const Set<bool, OFFSET, 1>,
{
let _ = <In>::ASSERT_FLAG;
!self.get(bitset)
}
pub fn new() -> Self {
Self
}
}
impl<const OFFSET: u8> const From<&Flag<OFFSET>> for Mask
{
fn from(_: &Flag<OFFSET>) -> Self {
let mask = flag_mask(OFFSET);
Mask::new(mask)
}
}