use core::{ffi, mem::MaybeUninit, ptr, slice};
pub struct ForeignData {
pub(crate) data: *mut ffi::c_void,
pub(crate) finalizer: Option<extern "C" fn(*mut ffi::c_void)>,
}
unsafe impl Send for ForeignData {}
unsafe impl Sync for ForeignData {}
impl Drop for ForeignData {
fn drop(&mut self) {
if let Some(f) = self.finalizer {
f(self.data);
}
}
}
pub unsafe fn slice_from_raw_parts<'a, T>(ptr: *const T, len: usize) -> &'a [T] {
match len {
0 => &[],
_ => slice::from_raw_parts(ptr, len),
}
}
pub(crate) fn initialize<T>(dst: &mut MaybeUninit<T>, value: T) {
unsafe {
ptr::write(dst.as_mut_ptr(), value);
}
}