use crate::word::Word;
use core::marker::PhantomData;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[repr(transparent)]
pub struct WordIdx<W: Word, const N: usize = 1> {
idxs: [usize; N],
_marker: PhantomData<W>,
}
impl<W: Word, const N: usize> WordIdx<W, N> {
const _ASSERT_NONZERO: () = assert!(N > 0, "WordIdx must have positive cardinality");
pub const fn new(idxs: [usize; N]) -> Self {
return WordIdx {
idxs,
_marker: PhantomData,
};
}
#[inline]
pub fn as_array(&self) -> &[usize; N] {
return &self.idxs;
}
#[inline]
pub fn into_array(self) -> [usize; N] {
return self.idxs;
}
}
impl<W: Word, const N: usize> From<WordIdx<W, N>> for [usize; N] {
fn from(value: WordIdx<W, N>) -> Self {
return value.idxs;
}
}
impl<W: Word> From<WordIdx<W, 1>> for usize {
fn from(value: WordIdx<W, 1>) -> Self {
let [idx] = value.idxs;
return idx;
}
}