use std::os::raw::c_int;
use std::pin::Pin;
pub struct Parameters {
values: Pin<Vec<Vec<f64>>>,
sizes: Vec<usize>,
sizes_c_int: Vec<c_int>,
pointers: Vec<*mut f64>,
}
#[allow(clippy::len_without_is_empty)]
impl Parameters {
pub fn new(values: impl Into<Vec<Vec<f64>>>) -> Self {
let mut values = values.into();
assert!(!values.is_empty());
let sizes: Vec<_> = values.iter().map(|x| x.len()).collect();
let sizes_c_int = sizes.iter().map(|&x| x as c_int).collect();
let pointers = values.iter_mut().map(|p| (*p).as_mut_ptr()).collect();
Self {
values: Pin::new(values),
sizes,
sizes_c_int,
pointers,
}
}
pub fn len(&self) -> usize {
self.sizes.len()
}
pub fn sizes(&self) -> &[usize] {
&self.sizes
}
pub(crate) fn sizes_c_int_mut(&mut self) -> &mut [c_int] {
&mut self.sizes_c_int
}
pub(crate) fn pointers_mut(&mut self) -> &mut [*mut f64] {
&mut self.pointers
}
pub fn to_values(self) -> Vec<Vec<f64>> {
Pin::into_inner(self.values)
}
}