use core::marker::PhantomData;
pub trait Space<T> {
type Output: AsMut<[T]>;
fn len(&self) -> usize;
fn is_empty(&self) -> bool {
self.len() == 0
}
fn workspace(&self) -> Self::Output;
}
#[derive(Debug, Copy, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
pub struct ConstSpace<T, const N: usize> {
_phantom: PhantomData<fn() -> T>,
}
impl<T, const N: usize> Space<T> for ConstSpace<T, N>
where
T: Default + Copy,
{
type Output = [T; N];
fn len(&self) -> usize {
N
}
fn workspace(&self) -> Self::Output {
[Default::default(); N]
}
}
impl<T, const N: usize> ConstSpace<T, N> {
pub fn new() -> Self {
ConstSpace {
_phantom: PhantomData,
}
}
}
impl<T, const N: usize> Default for ConstSpace<T, N> {
fn default() -> Self {
Self::new()
}
}
#[cfg(feature = "std")]
#[derive(Debug, Copy, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
pub struct DynSpace<T> {
len: usize,
_phantom: PhantomData<fn() -> T>,
}
#[cfg(feature = "std")]
impl<T> Space<T> for DynSpace<T>
where
T: Default + Copy,
{
type Output = Vec<T>;
fn len(&self) -> usize {
self.len
}
fn workspace(&self) -> Self::Output {
vec![Default::default(); self.len]
}
}
#[cfg(feature = "std")]
impl<T> DynSpace<T> {
pub fn new(len: usize) -> Self {
DynSpace {
len,
_phantom: PhantomData,
}
}
}