use crate::buffer::{
pool::{Cursor, Span, owners, state},
storage,
};
pub(in crate::buffer) unsafe trait Init: Sized {
type Backing: crate::buffer::raw::Backing;
type Root;
type State;
fn into_parts(self) -> Initialized<Self::Backing, Self::Root, Self::State>;
fn into_shared(self) -> storage::Shared<owners::Edge<Self::Backing, Self::Root>> {
use std::ptr;
let (span, start, len) = self.into_parts();
if len == 0 {
return storage::Shared::empty(owners::Edge::NONE);
}
let data = unsafe { span.entry().data().add(start) };
let data = unsafe { ptr::NonNull::new_unchecked(data) };
let edge = span.into_edge();
unsafe { storage::Shared::from_raw(data, len, edge) }
}
}
type Initialized<B, R, S> = (Span<B, R, S>, usize, usize);
pub(in crate::buffer) unsafe trait Write: Sized {
type Backing: crate::buffer::raw::Backing;
type Root;
unsafe fn writer(&mut self) -> &mut Span<Self::Backing, Self::Root>;
}
unsafe impl<L, M> Write for Cursor<L, M> {
type Backing = owners::Plain<L>;
type Root = M;
unsafe fn writer(&mut self) -> &mut Span<Self::Backing, Self::Root> {
&mut self.lease
}
}
unsafe impl<L, M> Write for Span<owners::Plain<L>, M, state::Uninit> {
type Backing = owners::Plain<L>;
type Root = M;
unsafe fn writer(&mut self) -> &mut Span<Self::Backing, Self::Root> {
self
}
}