use crate::tensors::Dimension;
#[allow(unused_imports)] use crate::tensors::Tensor;
use crate::tensors::views::{DataLayout, TensorMut, TensorRef};
unsafe impl<T, S, const D: usize> TensorRef<T, D> for &S
where
S: TensorRef<T, D>,
{
fn get_reference(&self, indexes: [usize; D]) -> Option<&T> {
TensorRef::get_reference(*self, indexes)
}
fn view_shape(&self) -> [(Dimension, usize); D] {
TensorRef::view_shape(*self)
}
unsafe fn get_reference_unchecked(&self, indexes: [usize; D]) -> &T {
unsafe { TensorRef::get_reference_unchecked(*self, indexes) }
}
fn data_layout(&self) -> DataLayout<D> {
TensorRef::data_layout(*self)
}
}
unsafe impl<T, S, const D: usize> TensorRef<T, D> for &mut S
where
S: TensorRef<T, D>,
{
fn get_reference(&self, indexes: [usize; D]) -> Option<&T> {
TensorRef::get_reference(*self, indexes)
}
fn view_shape(&self) -> [(Dimension, usize); D] {
TensorRef::view_shape(*self)
}
unsafe fn get_reference_unchecked(&self, indexes: [usize; D]) -> &T {
unsafe { TensorRef::get_reference_unchecked(*self, indexes) }
}
fn data_layout(&self) -> DataLayout<D> {
TensorRef::data_layout(*self)
}
}
unsafe impl<T, S, const D: usize> TensorMut<T, D> for &mut S
where
S: TensorMut<T, D>,
{
fn get_reference_mut(&mut self, indexes: [usize; D]) -> Option<&mut T> {
TensorMut::get_reference_mut(*self, indexes)
}
unsafe fn get_reference_unchecked_mut(&mut self, indexes: [usize; D]) -> &mut T {
unsafe { TensorMut::get_reference_unchecked_mut(*self, indexes) }
}
}
unsafe impl<T, S, const D: usize> TensorRef<T, D> for Box<S>
where
S: TensorRef<T, D>,
{
fn get_reference(&self, indexes: [usize; D]) -> Option<&T> {
self.as_ref().get_reference(indexes)
}
fn view_shape(&self) -> [(Dimension, usize); D] {
self.as_ref().view_shape()
}
unsafe fn get_reference_unchecked(&self, indexes: [usize; D]) -> &T {
unsafe { self.as_ref().get_reference_unchecked(indexes) }
}
fn data_layout(&self) -> DataLayout<D> {
self.as_ref().data_layout()
}
}
unsafe impl<T, S, const D: usize> TensorMut<T, D> for Box<S>
where
S: TensorMut<T, D>,
{
fn get_reference_mut(&mut self, indexes: [usize; D]) -> Option<&mut T> {
self.as_mut().get_reference_mut(indexes)
}
unsafe fn get_reference_unchecked_mut(&mut self, indexes: [usize; D]) -> &mut T {
unsafe { self.as_mut().get_reference_unchecked_mut(indexes) }
}
}
unsafe impl<T, const D: usize> TensorRef<T, D> for Box<dyn TensorRef<T, D>> {
fn get_reference(&self, indexes: [usize; D]) -> Option<&T> {
self.as_ref().get_reference(indexes)
}
fn view_shape(&self) -> [(Dimension, usize); D] {
self.as_ref().view_shape()
}
unsafe fn get_reference_unchecked(&self, indexes: [usize; D]) -> &T {
unsafe { self.as_ref().get_reference_unchecked(indexes) }
}
fn data_layout(&self) -> DataLayout<D> {
self.as_ref().data_layout()
}
}
unsafe impl<T, const D: usize> TensorRef<T, D> for Box<dyn TensorMut<T, D>> {
fn get_reference(&self, indexes: [usize; D]) -> Option<&T> {
self.as_ref().get_reference(indexes)
}
fn view_shape(&self) -> [(Dimension, usize); D] {
self.as_ref().view_shape()
}
unsafe fn get_reference_unchecked(&self, indexes: [usize; D]) -> &T {
unsafe { self.as_ref().get_reference_unchecked(indexes) }
}
fn data_layout(&self) -> DataLayout<D> {
self.as_ref().data_layout()
}
}
unsafe impl<T, const D: usize> TensorMut<T, D> for Box<dyn TensorMut<T, D>> {
fn get_reference_mut(&mut self, indexes: [usize; D]) -> Option<&mut T> {
self.as_mut().get_reference_mut(indexes)
}
unsafe fn get_reference_unchecked_mut(&mut self, indexes: [usize; D]) -> &mut T {
unsafe { self.as_mut().get_reference_unchecked_mut(indexes) }
}
}