use super::{
from_array_slice, from_array_slice_mut, into_array_slice, into_array_slice_mut, ArrayCast,
};
pub trait AsArrays<A: ?Sized> {
fn as_arrays(&self) -> &A;
}
pub trait AsArraysMut<A: ?Sized> {
fn as_arrays_mut(&mut self) -> &mut A;
}
macro_rules! impl_as_arrays {
($($owning:ty $(where ($($ty_input:tt)+))?),*) => {
$(
impl<'a, T, C, const N: usize $(, $($ty_input)+)?> AsArrays<[[T; N]]> for $owning
where
C: ArrayCast<Array = [T; N]>,
{
#[inline]
fn as_arrays(&self) -> &[[T; N]] {
into_array_slice(self.as_ref())
}
}
impl<'a, T, C, const N: usize $(, $($ty_input)+)?> AsArraysMut<[[T; N]]> for $owning
where
C: ArrayCast<Array = [T; N]>,
{
#[inline]
fn as_arrays_mut(&mut self) -> &mut [[T; N]] {
into_array_slice_mut(self.as_mut())
}
}
)*
};
}
impl_as_arrays!([C], [C; M] where (const M: usize));
#[cfg(feature = "alloc")]
impl_as_arrays!(alloc::boxed::Box<[C]>, alloc::vec::Vec<C>);
pub trait ArraysAs<C: ?Sized> {
fn arrays_as(&self) -> &C;
}
pub trait ArraysAsMut<C: ?Sized> {
fn arrays_as_mut(&mut self) -> &mut C;
}
macro_rules! impl_arrays_as {
($($owning:ty $(where ($($ty_input:tt)+))?),*) => {
$(
impl<'a, T, C, const N: usize $(, $($ty_input)+)?> ArraysAs<[C]> for $owning
where
C: ArrayCast<Array = [T; N]>,
{
#[inline]
fn arrays_as(&self) -> &[C] {
from_array_slice(self.as_ref())
}
}
impl<'a, T, C, const N: usize $(, $($ty_input)+)?> ArraysAsMut<[C]> for $owning
where
C: ArrayCast<Array = [T; N]>,
{
#[inline]
fn arrays_as_mut(&mut self) -> &mut [C] {
from_array_slice_mut(self.as_mut())
}
}
)*
};
}
impl_arrays_as!([[T; N]], [[T; N]; M] where (const M: usize));
#[cfg(feature = "alloc")]
impl_arrays_as!(alloc::boxed::Box<[[T; N]]>, alloc::vec::Vec<[T; N]>);
#[cfg(test)]
mod test {
use crate::Srgb;
use super::{ArraysAs, ArraysAsMut, AsArrays, AsArraysMut};
#[test]
fn as_arrays() {
let slice: &[Srgb<u8>] = &[Srgb::new(1, 2, 3), Srgb::new(4, 5, 6)];
let slice_mut: &mut [Srgb<u8>] = &mut [Srgb::new(1, 2, 3), Srgb::new(4, 5, 6)];
let mut slice_box: Box<[Srgb<u8>]> =
vec![Srgb::new(1, 2, 3), Srgb::new(4, 5, 6)].into_boxed_slice();
let mut vec: Vec<Srgb<u8>> = vec![Srgb::new(1, 2, 3), Srgb::new(4, 5, 6)];
let mut array: [Srgb<u8>; 2] = [Srgb::new(1, 2, 3), Srgb::new(4, 5, 6)];
let _: &[[u8; 3]] = slice.as_arrays();
let _: &[[u8; 3]] = slice_box.as_arrays();
let _: &[[u8; 3]] = vec.as_arrays();
let _: &[[u8; 3]] = array.as_arrays();
let _: &mut [[u8; 3]] = slice_mut.as_arrays_mut();
let _: &mut [[u8; 3]] = slice_box.as_arrays_mut();
let _: &mut [[u8; 3]] = vec.as_arrays_mut();
let _: &mut [[u8; 3]] = array.as_arrays_mut();
}
#[test]
fn arrays_as() {
let slice: &[[u8; 3]] = &[[1, 2, 3], [4, 5, 6]];
let slice_mut: &mut [[u8; 3]] = &mut [[1, 2, 3], [4, 5, 6]];
let mut slice_box: Box<[[u8; 3]]> = vec![[1, 2, 3], [4, 5, 6]].into_boxed_slice();
let mut vec: Vec<[u8; 3]> = vec![[1, 2, 3], [4, 5, 6]];
let mut array: [[u8; 3]; 2] = [[1, 2, 3], [4, 5, 6]];
let _: &[Srgb<u8>] = slice.arrays_as();
let _: &[Srgb<u8>] = slice_box.arrays_as();
let _: &[Srgb<u8>] = vec.arrays_as();
let _: &[Srgb<u8>] = array.arrays_as();
let _: &mut [Srgb<u8>] = slice_mut.arrays_as_mut();
let _: &mut [Srgb<u8>] = slice_box.arrays_as_mut();
let _: &mut [Srgb<u8>] = vec.arrays_as_mut();
let _: &mut [Srgb<u8>] = array.arrays_as_mut();
}
}