#![warn(missing_docs)]
#![feature(portable_simd)]
pub mod index;
pub mod raw_quadboard;
use std::marker::PhantomData;
use crate::index::Index;
use crate::raw_quadboard::RawQuadboard;
pub use halfling::Nibble;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Quadboard<T> {
inner: RawQuadboard,
_data: PhantomData<T>,
}
impl<T> Default for Quadboard<T>
where
T: Default + Into<Nibble>,
{
fn default() -> Self {
Self {
inner: RawQuadboard::splat(T::default().into()),
_data: Default::default(),
}
}
}
impl<T> Quadboard<T> {
#[inline(always)]
pub fn get(&self, index: Index) -> T
where
Nibble: Into<T>,
{
unsafe { self.get_unchecked(index.get()) }
}
#[inline(always)]
pub unsafe fn get_unchecked(&self, index: u8) -> T
where
Nibble: Into<T>,
{
let nibble = unsafe { self.inner.get_unchecked(index) };
nibble.into()
}
#[inline(always)]
pub fn set(&mut self, index: Index, value: T)
where
T: Into<Nibble>,
{
unsafe { self.set_unchecked(index.get(), value) };
}
#[inline(always)]
pub unsafe fn set_unchecked(&mut self, index: u8, value: T)
where
T: Into<Nibble>,
{
let value: Nibble = value.into();
unsafe { self.inner.set_unchecked(index, value) };
}
#[inline(always)]
pub const fn as_raw_quadboard(&self) -> &RawQuadboard {
&self.inner
}
}