servicepoint_binding_c 0.15.0

C bindings for the servicepoint crate.
Documentation
use std::ptr::NonNull;

pub(crate) fn heap_move<T>(x: T) -> *mut T {
    Box::into_raw(Box::new(x))
}

pub(crate) fn heap_move_nonnull<T>(x: T) -> NonNull<T> {
    NonNull::from(Box::leak(Box::new(x)))
}

pub(crate) fn heap_move_ok<T, E>(x: Result<T, E>) -> *mut T {
    x.map(|x| heap_move(x)).unwrap_or(std::ptr::null_mut())
}

pub(crate) fn heap_move_some<T>(x: Option<T>) -> *mut T {
    x.map(|x| heap_move(x)).unwrap_or(std::ptr::null_mut())
}

pub(crate) unsafe fn heap_drop<T>(x: NonNull<T>) {
    drop(unsafe { heap_remove(x) });
}

pub(crate) unsafe fn heap_remove<T>(x: NonNull<T>) -> T {
    unsafe { *Box::from_raw(x.as_ptr()) }
}

pub(crate) unsafe fn heap_clone<T: Clone>(source: NonNull<T>) -> NonNull<T> {
    heap_move_nonnull(unsafe { source.as_ref().clone() })
}