use crate::{Builder, MatVar, MatioError, Result};
use std::{marker::PhantomData, path::Path};
pub struct MatFile {
pub(crate) mat_t: *mut ffi::mat_t,
}
impl Drop for MatFile {
fn drop(&mut self) {
if unsafe { ffi::Mat_Close(self.mat_t) } != 0 {
panic!("MatFile::Drop failed")
}
}
}
pub trait Load {
fn load<P: AsRef<Path>>(path: P) -> Result<Self>
where
Self: Sized;
fn read<T: 'static, S: Into<String>>(&self, name: S) -> Result<MatVar<T>>;
}
impl Load for MatFile {
fn load<P: AsRef<Path>>(path: P) -> Result<Self> {
Builder::new(path).load()
}
fn read<T: 'static, S: Into<String>>(&self, name: S) -> Result<MatVar<T>> {
let c_name = std::ffi::CString::new(name.into())?;
let matvar_t = unsafe { ffi::Mat_VarRead(self.mat_t, c_name.as_ptr()) };
if matvar_t.is_null() {
Err(MatioError::MatVarRead(c_name.to_str().unwrap().to_string()))
} else {
MatVar {
matvar_t,
data_type: PhantomData,
}
.match_types()
}
}
}
pub trait Save {
fn save<P: AsRef<Path>>(path: P) -> Result<Self>
where
Self: Sized;
fn write<T>(&self, mat_var: MatVar<T>) -> &Self;
}
impl Save for MatFile {
fn save<P: AsRef<Path>>(path: P) -> Result<Self> {
Builder::new(path).save()
}
fn write<T>(&self, mat_var: MatVar<T>) -> &Self {
unsafe {
ffi::Mat_VarWrite(
self.mat_t,
mat_var.matvar_t,
ffi::matio_compression_MAT_COMPRESSION_NONE,
);
}
self
}
}