#[repr(C)]
#[derive(Debug)]
pub struct Buffer {
pub ptr: *mut u8,
pub len: usize,
pub cap: usize,
}
unsafe impl Send for Buffer {}
impl Buffer {
pub unsafe fn as_slice(&self) -> &[u8] {
if self.ptr.is_null() || self.len == 0 {
return &[];
}
unsafe { core::slice::from_raw_parts(self.ptr, self.len) }
}
pub unsafe fn as_mut_slice(&mut self) -> &mut [u8] {
if self.ptr.is_null() || self.cap == 0 {
return &mut [];
}
unsafe { core::slice::from_raw_parts_mut(self.ptr, self.cap) }
}
}
#[cfg(test)]
mod tests {
use core::mem::{align_of, offset_of, size_of};
use crate::types::buffer::Buffer;
#[test]
fn layout_buffer() {
assert_eq!(size_of::<Buffer>(), 24);
assert_eq!(align_of::<Buffer>(), 8);
assert_eq!(offset_of!(Buffer, ptr), 0);
assert_eq!(offset_of!(Buffer, len), 8);
assert_eq!(offset_of!(Buffer, cap), 16);
}
#[test]
fn as_slice_on_null_returns_empty() {
let buf: Buffer = Buffer {
ptr: core::ptr::null_mut(),
len: 0,
cap: 0,
};
let s: &[u8] = unsafe { buf.as_slice() };
assert!(s.is_empty());
}
#[test]
fn as_mut_slice_on_null_returns_empty() {
let mut buf: Buffer = Buffer {
ptr: core::ptr::null_mut(),
len: 0,
cap: 0,
};
let s: &mut [u8] = unsafe { buf.as_mut_slice() };
assert!(s.is_empty());
}
}