use cpp::cpp;
pub struct HostBuffer(*mut std::ffi::c_void);
unsafe impl Send for HostBuffer {}
unsafe impl Sync for HostBuffer {}
impl HostBuffer {
#[inline]
pub(crate) fn wrap(internal: *mut std::ffi::c_void) -> Self {
HostBuffer(internal)
}
#[inline]
pub fn as_bytes(&self) -> &[u8] {
let data = self.data() as *const u8;
let size = self.size();
unsafe { std::slice::from_raw_parts(data, size) }
}
#[inline]
pub fn data(&self) -> *const std::ffi::c_void {
let internal = self.as_ptr();
cpp!(unsafe [
internal as "const void*"
] -> *mut std::ffi::c_void as "void*" {
return ((const IHostMemory*) internal)->data();
})
}
#[inline]
pub fn size(&self) -> usize {
let internal = self.as_ptr();
cpp!(unsafe [
internal as "const void*"
] -> usize as "std::size_t" {
return ((const IHostMemory*) internal)->size();
})
}
#[inline(always)]
pub fn as_ptr(&self) -> *const std::ffi::c_void {
let HostBuffer(internal) = *self;
internal
}
#[inline(always)]
pub fn as_mut_ptr(&mut self) -> *mut std::ffi::c_void {
let HostBuffer(internal) = *self;
internal
}
}
impl Drop for HostBuffer {
fn drop(&mut self) {
let internal = self.as_mut_ptr();
cpp!(unsafe [
internal as "void*"
] {
destroy((IHostMemory*) internal);
});
}
}
#[cfg(test)]
mod tests {
use crate::tests::utils::*;
#[tokio::test]
async fn test_host_buffer_data_and_size() {
let network_plan = simple_network_plan!();
assert!(!network_plan.data().is_null());
assert!(network_plan.size() > 0);
let bytes = network_plan.as_bytes();
assert_eq!(unsafe { *(network_plan.data() as *const u8) }, bytes[0]);
assert_eq!(network_plan.size(), bytes.len());
}
}