use std::ffi::CString;
use std::path::Path;
use std::sync::Arc;
use crate::error::{Error, Result};
use crate::ffi::TfLiteModel;
use crate::library::TfLiteLibrary;
pub struct Model {
raw: *mut TfLiteModel,
lib: Arc<TfLiteLibrary>,
}
unsafe impl Send for Model {}
unsafe impl Sync for Model {}
impl Model {
pub fn from_file<P: AsRef<Path>>(path: P, lib: Arc<TfLiteLibrary>) -> Result<Self> {
let path_ref = path.as_ref();
let path_str = path_ref
.to_str()
.ok_or_else(|| Error::ModelLoadFailed { path: path_ref.to_path_buf() })?;
let c_path = CString::new(path_str).map_err(Error::InvalidPath)?;
let raw = unsafe { (lib.model_create_from_file)(c_path.as_ptr()) };
if raw.is_null() {
return Err(Error::ModelLoadFailed { path: path_ref.to_path_buf() });
}
Ok(Self { raw, lib })
}
pub fn as_ptr(&self) -> *const TfLiteModel {
self.raw
}
pub(crate) fn lib(&self) -> &Arc<TfLiteLibrary> {
&self.lib
}
}
impl Drop for Model {
fn drop(&mut self) {
unsafe {
(self.lib.model_delete)(self.raw);
}
}
}