use crate::prelude::*;
use std::marker::PhantomData;
#[derive(Clone, Copy)]
pub struct PhantomTensor<T> {
id: UniqueId,
marker: PhantomData<*const T>,
}
impl<T> HasUniqueId for PhantomTensor<T> {
fn id(&self) -> &UniqueId {
&self.id
}
}
impl<T: HasArrayType> HasArrayType for PhantomTensor<T> {
type Dtype = T::Dtype;
type Array = T::Array;
}
impl<T: HasDevice> HasDevice for PhantomTensor<T> {
type Device = T::Device;
}
pub trait IntoPhantom: HasArrayData + Sized {
fn phantom(&self) -> PhantomTensor<Self>;
}
impl<T: Tensor> IntoPhantom for T {
fn phantom(&self) -> PhantomTensor<Self> {
PhantomTensor {
id: *self.id(),
marker: PhantomData,
}
}
}