use std::fmt::Debug;
use crate::engine::vector::scalar::VeScalar;
use crate::tensor::Tensor;
use furiosa_mapping::M;
pub trait TensorState<D: VeScalar>: Debug {
fn clone_tensor_as<TargetMapping: M>(&self) -> Option<Tensor<D, TargetMapping>>;
}
#[derive(Debug)]
pub struct NoTensor;
impl<D: VeScalar> TensorState<D> for NoTensor {
fn clone_tensor_as<TargetMapping: M>(&self) -> Option<Tensor<D, TargetMapping>> {
None
}
}
#[derive(Debug)]
pub struct HasTensor<D: VeScalar, Mapping: M> {
data: Tensor<D, Mapping>,
}
impl<D: VeScalar, Mapping: M> HasTensor<D, Mapping> {
pub fn new(tensor: Tensor<D, Mapping>) -> Self {
Self { data: tensor }
}
}
impl<D: VeScalar, Mapping: M> From<Tensor<D, Mapping>> for HasTensor<D, Mapping> {
fn from(tensor: Tensor<D, Mapping>) -> Self {
Self::new(tensor)
}
}
impl<D: VeScalar, Mapping: M> TensorState<D> for HasTensor<D, Mapping> {
fn clone_tensor_as<TargetMapping: M>(&self) -> Option<Tensor<D, TargetMapping>> {
let cloned = self.data.clone();
Some(cloned.transpose::<TargetMapping>(true))
}
}