pjrt 0.2.0

A safe PJRT C API bindings for Rust
Documentation
use ::std::os::raw::c_void;
use pjrt_sys::PJRT_Chunk;

use crate::utils;

unsafe extern "C" fn chunk_deleter(data: *mut c_void, deleter_arg: *mut c_void) {
    let (len, cap) = *Box::from_raw(deleter_arg as *mut (usize, usize));
    let _ = Vec::from_raw_parts(data as *mut u8, len, cap);
}

#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Chunk {
    data: Vec<u8>,
}

impl Chunk {
    pub fn new(data: Vec<u8>) -> Self {
        Self { data }
    }
}

impl From<Chunk> for PJRT_Chunk {
    fn from(chunk: Chunk) -> Self {
        let mut c = PJRT_Chunk::default();
        let (ptr, len, cap) = utils::into_raw_parts(chunk.data);
        c.data = ptr as *mut _;
        c.size = len;
        c.deleter = Some(chunk_deleter);
        let delete_args = Box::new((len, cap));
        c.deleter_arg = Box::into_raw(delete_args) as *mut _;
        c
    }
}