use std::ops;
use crate::{
buffer,
buffer::{resident, segments, segments::Seal, storage, storage::regions, write::consume},
mem::rc,
};
pub unsafe trait Segment:
Seal + super::Source + super::Store + consume::Consume + buffer::Residency
{
unsafe fn extent(&mut self) -> &mut regions::Extent;
fn try_clone(&self) -> Result<Self, rc::Error> {
buffer::View::new(self).try_retain()
}
fn try_get(&self, range: ops::Range<usize>) -> Result<Option<Self>, rc::Error> {
buffer::View::new(self)
.get(range)
.map(buffer::View::<Self>::try_retain)
.transpose()
}
unsafe fn try_project(&self, range: ops::Range<usize>) -> Result<Self, rc::Error> {
let bytes = unsafe { self.as_ref().get_unchecked(range) };
buffer::View {
source: self,
bytes,
}
.try_retain()
}
fn prefix(mut self, limit: usize) -> Self {
buffer::raw::Selection::new(&mut self, limit).commit();
self
}
fn try_split(mut self, limit: usize) -> Result<(Self, Option<Self>), (rc::Error, Self)> {
let Some(tail) = segments::Tail::new(&mut self, limit) else {
return Ok((self, None));
};
let prefix = match tail.try_commit() {
Ok(result) => result,
Err(error) => return Err((error, self)),
};
Ok((prefix, Some(self)))
}
fn suffix(mut self, amount: usize) -> Option<Self> {
segments::Tail::new(&mut self, amount)?.commit();
Some(self)
}
}
unsafe impl Segment for storage::Shared {
unsafe fn extent(&mut self) -> &mut regions::Extent {
unsafe { self.extent_mut() }
}
}
unsafe impl Segment for resident::Shared<'_> {
unsafe fn extent(&mut self) -> &mut regions::Extent {
unsafe { self.region.extent_mut() }
}
}