use ariadnetor_core::backend::MemoryOrder;
use crate::{DenseLayout, DenseStorage, TensorData};
pub type DenseTensorData<T = f64> = TensorData<DenseStorage<T>, DenseLayout>;
impl<T> DenseTensorData<T> {
pub fn from_raw_parts(data: Vec<T>, shape: Vec<usize>, order: MemoryOrder) -> Self
where
T: Clone,
{
let storage = DenseStorage::new(data);
let layout = DenseLayout::new(shape, order);
Self::new(storage, layout)
}
pub fn data(&self) -> &[T] {
self.storage().data()
}
pub fn shape(&self) -> &[usize] {
self.layout().shape()
}
pub fn order(&self) -> MemoryOrder {
self.layout().order()
}
pub fn rank(&self) -> usize {
self.layout().rank()
}
pub fn len(&self) -> usize {
self.shape().iter().product()
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
}