bitable 0.1.0

An all-const, compile-time checked, safe bit handling library with zero runtime overhead
Documentation
use super::common::*;
use super::mask::Mask;
use super::set::Set;

/// A bit flag.
#[derive(Debug)] //, Clone)] //, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Flag<const OFFSET: u8>;

#[allow(private_bounds)]
impl<const OFFSET: u8> const Flag<OFFSET> {

    // Core unchecked methods

    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))
    }
    // fn unchecked_write<In, Out>(&self, bitset: &mut In, value: bool)
    // where In: const Set<Out, OFFSET, 1>,
    //       Out: const CastFromUReg,
    // {
    //     let mask: Mask = self.into();
    //     todo!();
    // }

    // Public API methods

    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 write<In>(&self, bitset: &mut In, value: bool)
    // where In: const Set<In, OFFSET, 1>,
    // {
    //     let _ = <In>::ASSERT_FLAG;
    //     self.unchecked_write(bitset, value)
    // }
    // pub fn set<In>(&self, bitset: &mut In)
    // where In: const Set<In, OFFSET, 1>,
    // {
    //     let _ = <In>::ASSERT_FLAG;
    //     self.unchecked_write(bitset, true);
    // }
    // pub fn clr<In>(&self, bitset: &mut In)
    // where In: const Set<In, OFFSET, 1>,
    // {
    //     let _ = <In>::ASSERT_FLAG;
    //     self.unchecked_write(bitset, false);
    // }

    pub fn new() -> Self {
        Self
    }

    // Tests

    // #[cfg(test)]
    // pub(crate) fn mask(&self) -> BitMask<u32> {
    //     BitMask::<u32>::from(*self)
    // }
}

// ---------------------------------------------------------------------------
// Conversion between core types
// ---------------------------------------------------------------------------

impl<const OFFSET: u8> const From<&Flag<OFFSET>> for Mask
{
    fn from(_: &Flag<OFFSET>) -> Self {
        let mask = flag_mask(OFFSET);
        Mask::new(mask)
    }
}