use dasp_frame::Frame;
mod fixed_size_array;
pub trait FromFrameSlice<'a, F>
where
F: Frame,
{
fn from_frame_slice(slice: &'a [F]) -> Self;
}
pub trait FromFrameSliceMut<'a, F>
where
F: Frame,
{
fn from_frame_slice_mut(slice: &'a mut [F]) -> Self;
}
pub trait ToFrameSlice<'a, F>
where
F: Frame,
{
fn to_frame_slice(self) -> Option<&'a [F]>;
}
pub trait ToFrameSliceMut<'a, F>
where
F: Frame,
{
fn to_frame_slice_mut(self) -> Option<&'a mut [F]>;
}
pub trait DuplexFrameSlice<'a, F>: FromFrameSlice<'a, F> + ToFrameSlice<'a, F>
where
F: Frame,
{
}
pub trait DuplexFrameSliceMut<'a, F>: FromFrameSliceMut<'a, F> + ToFrameSliceMut<'a, F>
where
F: Frame,
{
}
impl<'a, F> FromFrameSlice<'a, F> for &'a [F]
where
F: Frame,
{
#[inline]
fn from_frame_slice(slice: &'a [F]) -> Self {
slice
}
}
impl<'a, F> FromFrameSliceMut<'a, F> for &'a mut [F]
where
F: Frame,
{
#[inline]
fn from_frame_slice_mut(slice: &'a mut [F]) -> Self {
slice
}
}
impl<'a, F> ToFrameSlice<'a, F> for &'a [F]
where
F: Frame,
{
#[inline]
fn to_frame_slice(self) -> Option<&'a [F]> {
Some(self)
}
}
impl<'a, F> ToFrameSliceMut<'a, F> for &'a mut [F]
where
F: Frame,
{
#[inline]
fn to_frame_slice_mut(self) -> Option<&'a mut [F]> {
Some(self)
}
}
impl<'a, F, T> DuplexFrameSlice<'a, F> for T
where
F: Frame,
T: FromFrameSlice<'a, F> + ToFrameSlice<'a, F>,
{
}
impl<'a, F, T> DuplexFrameSliceMut<'a, F> for T
where
F: Frame,
T: FromFrameSliceMut<'a, F> + ToFrameSliceMut<'a, F>,
{
}
pub fn to_frame_slice<'a, T, F>(slice: T) -> Option<&'a [F]>
where
F: Frame,
T: ToFrameSlice<'a, F>,
{
slice.to_frame_slice()
}
pub fn to_frame_slice_mut<'a, T, F>(slice: T) -> Option<&'a mut [F]>
where
F: Frame,
T: ToFrameSliceMut<'a, F>,
{
slice.to_frame_slice_mut()
}
pub fn from_frame_slice<'a, T, F>(slice: &'a [F]) -> T
where
F: Frame,
T: FromFrameSlice<'a, F>,
{
T::from_frame_slice(slice)
}
pub fn from_frame_slice_mut<'a, T, F>(slice: &'a mut [F]) -> T
where
F: Frame,
T: FromFrameSliceMut<'a, F>,
{
T::from_frame_slice_mut(slice)
}