use std::ptr::NonNull;
use std::sync::Arc;
use arrow_buffer::{alloc, Buffer, MutableBuffer};
pub struct MmapAllocation {}
impl alloc::Allocation for MmapAllocation {}
lazy_static! {
static ref MMAP_ALLOCATION: Arc<MmapAllocation> = Arc::new(MmapAllocation {});
}
pub fn arrow_buffer(pointer: *const u8, len: usize) -> Buffer {
return arrow_buffer_mut(pointer as *mut u8, len);
}
pub fn arrow_buffer_with_offset(pointer: *const u8, offset: isize, len: usize) -> Buffer {
return arrow_buffer_with_offset_mut(pointer as *mut u8, offset, len);
}
pub fn arrow_buffer_mut(pointer: *mut u8, len: usize) -> Buffer {
return arrow_buffer_with_offset_mut(pointer as *mut u8, 0, len);
}
pub fn arrow_buffer_with_offset_mut(pointer: *mut u8, offset: isize, len: usize) -> Buffer {
if pointer.is_null() {
return MutableBuffer::new(0).into();
} else {
return unsafe {
Buffer::from_custom_allocation(
NonNull::new_unchecked(pointer.offset(offset)),
len,
MMAP_ALLOCATION.clone(),
)
};
}
}
pub fn arrow_buffer_null() -> Buffer {
return arrow_buffer_mut(std::ptr::null_mut(), 0);
}