use super::common::*;
use super::mask::Mask;
use super::set::Set;
#[derive(Debug)] pub struct Field<const OFFSET: u8, const SIZE: u8>;
#[allow(private_bounds)]
impl<const OFFSET: u8, const SIZE: u8> const Field<OFFSET, SIZE> {
const ASSERT_SIZE: () = { assert_size(SIZE); };
fn unchecked_read<In, Out>(&self, bitset: &In) -> Out
where In: const Set<Out, OFFSET, SIZE>,
Out: const CastFromUReg,
{
let mask: Mask = self.into();
let bits = mask.apply(bitset) >> OFFSET;
Out::cast_from(bits)
}
fn unchecked_read_at<In, Out>(&self, bitset: &In, idx: usize) -> Out
where In: const Set<Out, OFFSET, SIZE>,
Out: const CastFromUReg,
{
let mask: Mask = self.into();
let bits = mask.apply_at(bitset, idx) >> OFFSET;
Out::cast_from(bits)
}
pub fn read<In, Out>(&self, bitset: &In) -> Out
where In: const Set<Out, OFFSET, SIZE>,
Out: const CastFromUReg,
{
let _ = <In>::ASSERT_FIELD;
self.unchecked_read::<In, Out>(bitset)
}
pub fn read_at<In, Out>(&self, bitset: &In, idx: usize) -> Out
where In: const Set<Out, OFFSET, SIZE>,
Out: const CastFromUReg,
{
let _ = <In>::ASSERT_FIELD;
self.unchecked_read_at::<In, Out>(bitset, idx)
}
pub fn new() -> Self {
let _ = Self::ASSERT_SIZE;
Self
}
}
impl<const OFFSET: u8, const SIZE: u8> const From<&Field<OFFSET, SIZE>> for Mask
{
fn from(_: &Field<OFFSET, SIZE>) -> Self {
let mask = field_mask(OFFSET, SIZE);
Mask::new(mask)
}
}