mod assign_into;
mod transpose;
pub use transpose::{transpose_copy, transpose_copy_strided};
use crate::application::array::{Array, AssignSource};
use crate::application::view::ArrayViewMut;
use crate::domain::error::Result;
use crate::infrastructure::storage::StorageMut;
use assign_into::{assign_into, assign_into_elements};
impl<T, S, const N: usize> Array<T, S, N>
where
S: StorageMut<T>,
{
#[inline]
pub fn try_assign<Rhs>(&mut self, rhs: &Rhs) -> Result<()>
where
T: Copy,
Rhs: AssignSource<T, N>,
{
assign_into(self.layout, self.storage.as_mut_slice(), rhs)
}
#[inline]
pub fn assign<Rhs>(&mut self, rhs: &Rhs)
where
T: Copy,
Rhs: AssignSource<T, N>,
{
self.try_assign(rhs)
.expect("invariant: assigned arrays have valid compatible layouts");
}
}
impl<T, const N: usize> ArrayViewMut<'_, T, N> {
#[inline]
pub fn try_assign<Rhs>(&mut self, rhs: &Rhs) -> Result<()>
where
T: Copy,
Rhs: AssignSource<T, N>,
{
if self.window_shared {
return assign_into_elements(self, rhs);
}
let layout = self.layout;
assign_into(layout, self.data_mut(), rhs)
}
#[inline]
pub fn assign<Rhs>(&mut self, rhs: &Rhs)
where
T: Copy,
Rhs: AssignSource<T, N>,
{
self.try_assign(rhs)
.expect("invariant: assigned views have valid compatible layouts");
}
}