use super::types::Array;
use crate::application::view::ArrayView;
use crate::domain::error::Result;
use crate::infrastructure::storage::Storage;
pub trait AssignSource<T, const N: usize> {
fn assign_shape(&self) -> [usize; N];
fn assign_get(&self, index: [usize; N]) -> Result<&T>;
#[doc(hidden)]
#[inline]
fn assign_view(&self) -> Option<ArrayView<'_, T, N>> {
None
}
}
impl<T, S, const N: usize> AssignSource<T, N> for Array<T, S, N>
where
S: Storage<T>,
{
#[inline]
fn assign_shape(&self) -> [usize; N] {
self.shape()
}
#[inline]
fn assign_get(&self, index: [usize; N]) -> Result<&T> {
self.get(index)
}
#[inline]
fn assign_view(&self) -> Option<ArrayView<'_, T, N>> {
Some(self.view())
}
}
impl<T, const N: usize> AssignSource<T, N> for ArrayView<'_, T, N> {
#[inline]
fn assign_shape(&self) -> [usize; N] {
self.shape()
}
#[inline]
fn assign_get(&self, index: [usize; N]) -> Result<&T> {
self.get(index)
}
#[inline]
fn assign_view(&self) -> Option<ArrayView<'_, T, N>> {
Some(self.reborrow())
}
}