use std::{mem::MaybeUninit, slice};
use crate::buffer;
pub(in crate::buffer) unsafe trait Prefix {
fn prefix(&self) -> (*mut MaybeUninit<u8>, u32);
fn as_slice(&self) -> &[u8] {
let (pointer, len) = self.prefix();
unsafe { buffer::raw::range(pointer.cast(), 0, len as usize) }
}
}
pub(in crate::buffer) unsafe trait Exclusive: Prefix {
fn as_mut_ptr(&mut self) -> *mut MaybeUninit<u8>;
fn len_mut(&mut self) -> &mut u32;
fn capacity(&self) -> u32;
fn as_mut_slice(&mut self) -> &mut [u8] {
let pointer = self.as_mut_ptr();
let len = self.len_mut();
unsafe { buffer::raw::range_mut(pointer.cast(), 0, *len as usize) }
}
fn spare_parts(&mut self) -> (&mut u32, &mut [MaybeUninit<u8>]) {
let capacity = self.capacity();
let pointer = self.as_mut_ptr();
let len = self.len_mut();
let used = *len as usize;
let spare =
unsafe { slice::from_raw_parts_mut(pointer.add(used), capacity as usize - used) };
(len, spare)
}
fn fill(&mut self, byte: u8) {
let capacity = self.capacity();
let pointer = self.as_mut_ptr();
let len = self.len_mut();
unsafe {
pointer
.add(*len as usize)
.cast::<u8>()
.write_bytes(byte, (capacity - *len) as usize);
}
*len = capacity;
}
}