use core::mem::MaybeUninit;
use super::{
IoBuf,
IoBufMut,
};
pub struct PtrBuf {
ptr: *const [u8],
}
impl PtrBuf {
pub unsafe fn new(ptr: *const [u8]) -> Self {
Self { ptr }
}
}
impl AsRef<[u8]> for PtrBuf {
fn as_ref(&self) -> &[u8] {
unsafe { &*self.ptr }
}
}
unsafe impl IoBuf for PtrBuf {}
pub struct PtrBufMut {
ptr: *mut [MaybeUninit<u8>],
len: usize,
}
impl PtrBufMut {
pub unsafe fn new(ptr: *mut [MaybeUninit<u8>]) -> Self {
Self { ptr, len: 0 }
}
}
impl AsRef<[u8]> for PtrBufMut {
fn as_ref(&self) -> &[u8] {
let slice = unsafe { &*(self.ptr as *const [MaybeUninit<u8>]) };
unsafe { &*(&slice[..self.len] as *const [MaybeUninit<u8>] as *const [u8]) }
}
}
unsafe impl IoBuf for PtrBufMut {}
unsafe impl IoBufMut for PtrBufMut {
fn uninit_bytes(&mut self) -> &mut [MaybeUninit<u8>] {
unsafe { &mut *self.ptr }
}
unsafe fn set_len(&mut self, new_len: usize) {
debug_assert!(new_len <= self.ptr.len());
self.len = new_len;
}
}