use libloading::{Library, Symbol};
use std::path::PathBuf;
use crate::{EqnKind, Equation, Meta};
pub unsafe fn get_kind(model_path: PathBuf) -> EqnKind {
let lib = unsafe { Library::new(model_path).expect("Failed to load library") };
let get_kind: Symbol<unsafe extern "C" fn() -> EqnKind> =
unsafe { lib.get(b"equation_kind").expect("Failed to load symbol") };
let kind = unsafe { get_kind() };
kind.clone()
}
pub unsafe fn load<E: Equation>(model_path: PathBuf) -> (Library, (E, Meta)) {
let lib = unsafe { Library::new(model_path).expect("Failed to load library") };
let create_eqn: Symbol<unsafe extern "C" fn() -> *mut std::ffi::c_void> =
unsafe { lib.get(b"create_eqn_ptr").expect("Failed to load symbol") };
let eqn_ptr = unsafe { create_eqn() };
let create_meta: Symbol<unsafe extern "C" fn() -> *mut std::ffi::c_void> =
unsafe { lib.get(b"metadata_ptr").expect("Failed to load symbol") };
let meta_ptr = unsafe { create_meta() };
unsafe {
(
lib,
(
(&*(eqn_ptr as *mut E)).clone(),
(&*(meta_ptr as *mut Meta)).clone(),
),
)
}
}
pub unsafe fn model_parameters<E: Equation>(model_path: PathBuf) -> Vec<String> {
let (_, (_, meta)) = unsafe { load::<E>(model_path) };
meta.get_params().clone()
}