use std::ptr::NonNull;
use sundials_rs_sys as sys;
use crate::error::SundialsError;
pub struct SunContext {
ptr: NonNull<sys::SUNContext_>,
}
impl SunContext {
pub fn new() -> Result<Self, SundialsError> {
let mut ctx: sys::SUNContext = std::ptr::null_mut();
let comm: sys::SUNComm = 0;
let flag = unsafe { sys::SUNContext_Create(comm, &mut ctx) };
if flag != 0 || ctx.is_null() {
return Err(SundialsError::Memory("SUNContext_Create"));
}
Ok(Self {
ptr: unsafe { NonNull::new_unchecked(ctx) },
})
}
pub fn raw(&self) -> sys::SUNContext {
self.ptr.as_ptr()
}
}
impl Drop for SunContext {
fn drop(&mut self) {
let mut ptr = self.ptr.as_ptr();
unsafe { sys::SUNContext_Free(&mut ptr) };
}
}
unsafe impl Send for SunContext {}