use std::fmt::Display;
pub(crate) trait Dimensionality: Display {}
#[derive(Clone, Copy)]
pub struct Dynamic(usize);
impl Dimensionality for Dynamic {}
impl Display for Dynamic {
fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(fmt, "dynamic<{}>", self.0)
}
}
#[derive(Clone, Copy, Default, Debug)]
pub struct Static<const N: usize>;
impl<const N: usize> Dimensionality for Static<N> {}
impl<const N: usize> Display for Static<N> {
fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(fmt, "static<{}>", N)
}
}
impl<const N: usize> Static<N> {
pub const fn get() -> usize {
N
}
pub fn dynamic(&self) -> Dynamic {
Dynamic(N)
}
}
impl<const N: usize> From<Static<N>> for usize {
fn from(_: Static<N>) -> Self {
Static::<N>::get()
}
}
#[allow(dead_code)] pub(crate) fn format_benchmark<Dim>(dim: Dim, aligned: bool) -> String
where
Dim: Dimensionality,
{
let align = if aligned { "aligned" } else { "unaligned" };
format!("{}-{}", dim, align)
}