ezffi 0.1.0

Generate C-FFI bindings from Rust types/functions via a single proc-macro attribute
use core::ffi::c_void;

#[doc(hidden)]
#[repr(C)]
#[derive(Clone, Copy)]
pub struct EzffiSlice {
    ptr: *mut c_void,
    len: usize,
}

impl<E> ::ezffi::RustRefIntoC<()> for [E] {
    type C = EzffiSlice;

    unsafe fn ref_into_c(&self) -> EzffiSlice {
        EzffiSlice {
            ptr: self.as_ptr() as *mut c_void,
            len: self.len(),
        }
    }
}

impl<E> ::ezffi::CRefIntoRust<[E]> for EzffiSlice {
    unsafe fn into_rust(&self) -> &[E] {
        if self.ptr.is_null() {
            return &[];
        }

        unsafe { core::slice::from_raw_parts(self.ptr as *const E, self.len) }
    }

    unsafe fn into_rust_mut(&mut self) -> &mut [E] {
        if self.ptr.is_null() {
            return &mut [];
        }

        unsafe { core::slice::from_raw_parts_mut(self.ptr as *mut E, self.len) }
    }
}