use std::{mem, ptr};
use crate::buffer;
pub unsafe trait Store: AsRef<[u8]> + Sized {
fn advance<const MAX: u32>(prefix: buffer::raw::Consumed<'_, '_, Self, MAX>) {
buffer::raw::Selection::from(prefix).consume();
}
fn advance_max(&mut self, max: usize) -> usize
where
Self: buffer::raw::Source,
{
let prefix = buffer::raw::Selection::new(self, max);
let len = prefix.len();
prefix.consume();
len
}
fn empty() -> Option<Self>;
fn project(slice: buffer::raw::Slice<'_, '_, Self>) {
slice.apply();
}
fn restrict(slice: buffer::raw::Slice<'_, '_, Self>);
}
unsafe impl Store for &mut [u8] {
fn empty() -> Option<Self> {
Some(&mut [])
}
fn restrict(slice: buffer::raw::Slice<'_, '_, Self>) {
let (target, range) = slice.into_parts();
let bytes = mem::take(target);
*target = unsafe { bytes.get_unchecked_mut(range.into_inner()) };
}
}
unsafe impl<S: ?Sized> Store for buffer::View<'_, S> {
fn empty() -> Option<Self> {
None
}
fn restrict(slice: buffer::raw::Slice<'_, '_, Self>) {
let (target, range) = slice.into_parts();
target.bytes = unsafe { target.bytes.get_unchecked(range.into_inner()) };
}
}
unsafe impl Store for Vec<u8> {
fn empty() -> Option<Self> {
None
}
#[inline]
fn restrict(slice: buffer::raw::Slice<'_, '_, Self>) {
let (target, range) = slice.into_parts();
let len = range.len();
let bounds = range.into_inner();
if bounds.start != 0 {
let pointer = target.as_mut_ptr();
unsafe { ptr::copy(pointer.add(bounds.start), pointer, len) };
}
target.truncate(len);
}
}
mod headers;
mod loans;
mod tags;
mod alloc;
pub(in crate::buffer) use alloc::{Debit, Header, Heap, Policy, Rc, Unique};
mod pooling;
pub(in crate::buffer) use pooling::Backing;