use crate::format::messages::dataspace::{DataspaceMessage, DataspaceType};
#[derive(Debug, Clone)]
pub struct Dataspace {
msg: DataspaceMessage,
}
impl Dataspace {
pub(crate) fn from_message(msg: DataspaceMessage) -> Self {
Self { msg }
}
pub fn raw_message(&self) -> DataspaceMessage {
self.msg.clone()
}
pub fn ndim(&self) -> usize {
self.msg.ndims as usize
}
pub fn shape(&self) -> &[u64] {
&self.msg.dims
}
pub fn maxdims(&self) -> Option<&[u64]> {
self.msg.max_dims.as_deref()
}
pub fn size(&self) -> u64 {
if self.msg.dims.is_empty() {
if self.msg.space_type == DataspaceType::Scalar {
1
} else {
0
}
} else {
self.msg.dims.iter().product()
}
}
pub fn is_scalar(&self) -> bool {
self.msg.space_type == DataspaceType::Scalar
}
pub fn is_null(&self) -> bool {
self.msg.space_type == DataspaceType::Null
}
pub fn is_simple(&self) -> bool {
self.msg.space_type == DataspaceType::Simple
}
pub fn is_resizable(&self) -> bool {
if let Some(maxdims) = &self.msg.max_dims {
maxdims.iter().any(|&d| d == u64::MAX)
} else {
false
}
}
}