use crate::misc::Product;
#[derive(Debug, Clone, PartialEq)]
pub enum DataType {
UnsignedInteger,
SignedInteger,
Real,
Complex,
String,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ArrayObject {
pub(crate) data: Vec<u8>,
pub(crate) shape: Vec<u64>,
pub(crate) datatype: DataType,
}
impl ArrayObject {
pub fn bits(&self) -> Option<usize> {
match self.datatype {
DataType::UnsignedInteger | DataType::SignedInteger | DataType::Real => {
Some(8 * self.data.len() / self.shape.product() as usize)
}
DataType::Complex => Some(8 * self.data.len() / self.shape.product() as usize / 2),
DataType::String => None,
}
}
pub fn len(&self) -> usize {
self.shape.product() as usize
}
pub fn shape(&self) -> Vec<usize> {
self.shape.iter().map(|&x| x as usize).collect()
}
pub fn datasize(&self) -> usize {
self.data.len()
}
pub fn datatype(&self) -> DataType {
self.datatype.clone()
}
pub fn dimension(&self) -> usize {
self.shape.len()
}
}