use std::path::Path;
use crate::io::Hdf5Reader;
use crate::io::SwmrWriter as IoSwmrWriter;
use crate::error::Result;
use crate::types::H5Type;
pub struct SwmrFileWriter {
inner: IoSwmrWriter,
}
impl SwmrFileWriter {
pub fn create<P: AsRef<Path>>(path: P) -> Result<Self> {
let inner = IoSwmrWriter::create(path.as_ref())?;
Ok(Self { inner })
}
pub fn create_streaming_dataset<T: H5Type>(
&mut self,
name: &str,
frame_dims: &[u64],
) -> Result<usize> {
let datatype = T::hdf5_type();
let idx = self
.inner
.create_streaming_dataset(name, datatype, frame_dims)?;
Ok(idx)
}
pub fn start_swmr(&mut self) -> Result<()> {
self.inner.start_swmr()?;
Ok(())
}
pub fn append_frame(&mut self, ds_index: usize, data: &[u8]) -> Result<()> {
self.inner.append_frame(ds_index, data)?;
Ok(())
}
pub fn flush(&mut self) -> Result<()> {
self.inner.flush()?;
Ok(())
}
pub fn close(self) -> Result<()> {
self.inner.close()?;
Ok(())
}
}
pub struct SwmrFileReader {
reader: Hdf5Reader,
}
impl SwmrFileReader {
pub fn open<P: AsRef<Path>>(path: P) -> Result<Self> {
let reader = Hdf5Reader::open_swmr(path.as_ref())?;
Ok(Self { reader })
}
pub fn refresh(&mut self) -> Result<()> {
self.reader.refresh()?;
Ok(())
}
pub fn dataset_names(&self) -> Vec<String> {
self.reader
.dataset_names()
.iter()
.map(|s| s.to_string())
.collect()
}
pub fn dataset_shape(&self, name: &str) -> Result<Vec<u64>> {
Ok(self.reader.dataset_shape(name)?)
}
pub fn read_dataset_raw(&mut self, name: &str) -> Result<Vec<u8>> {
Ok(self.reader.read_dataset_raw(name)?)
}
pub fn read_dataset<T: H5Type>(&mut self, name: &str) -> Result<Vec<T>> {
let raw = self.reader.read_dataset_raw(name)?;
if raw.len() % T::element_size() != 0 {
return Err(crate::error::Hdf5Error::TypeMismatch(format!(
"raw data size {} is not a multiple of element size {}",
raw.len(),
T::element_size(),
)));
}
let count = raw.len() / T::element_size();
let mut result = Vec::<T>::with_capacity(count);
unsafe {
std::ptr::copy_nonoverlapping(raw.as_ptr(), result.as_mut_ptr() as *mut u8, raw.len());
result.set_len(count);
}
Ok(result)
}
}