use crate::{CpuStorage, Error, Result}; #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub enum DType { F32, F64, } impl DType { pub fn size_in_bytes(&self) -> usize { match self { Self::F32 => 4, Self::F64 => 8, } } } pub trait WithDType: Sized + Copy { const DTYPE: DType; fn to_cpu_storage_owned(data: Vec) -> CpuStorage; fn to_cpu_storage(data: &[Self]) -> CpuStorage { Self::to_cpu_storage_owned(data.to_vec()) } fn cpu_storage_as_slice(s: &CpuStorage) -> Result<&[Self]>; } macro_rules! with_dtype { ($ty:ty, $dtype:ident) => { impl WithDType for $ty { const DTYPE: DType = DType::$dtype; fn to_cpu_storage_owned(data: Vec) -> CpuStorage { CpuStorage::$dtype(data) } fn cpu_storage_as_slice(s: &CpuStorage) -> Result<&[Self]> { match s { CpuStorage::$dtype(data) => Ok(data), _ => Err(Error::UnexpectedDType { expected: DType::$dtype, got: s.dtype(), }), } } } }; } with_dtype!(f32, F32); with_dtype!(f64, F64);