use o3::buffer::{self, pool, storage};
use crate::link::egress::data;
#[doc(hidden)]
pub unsafe trait Sealed<'d> {
fn retained_bytes(&self) -> usize;
}
unsafe impl<'d> Sealed<'d> for storage::Shared {
fn retained_bytes(&self) -> usize {
self.resident_bytes()
}
}
unsafe impl<'d> Sealed<'d> for buffer::Frozen {
fn retained_bytes(&self) -> usize {
self.capacity()
}
}
unsafe impl<'d, C: pool::Capacity> Sealed<'d> for pool::Cursor<C> {
fn retained_bytes(&self) -> usize {
self.len() + self.spare_capacity()
}
}
unsafe impl<'d> Sealed<'d> for &'static [u8] {
fn retained_bytes(&self) -> usize {
0
}
}
unsafe impl<'d, const N: usize> Sealed<'d> for &'static [u8; N] {
fn retained_bytes(&self) -> usize {
0
}
}
unsafe impl<'d, const N: usize> Sealed<'d> for data::Inline<N> {
fn retained_bytes(&self) -> usize {
N
}
}
unsafe impl<'d, A: Sealed<'d>, B: Sealed<'d>> Sealed<'d> for data::Either<A, B> {
fn retained_bytes(&self) -> usize {
match self {
data::Either::Left(value) => value.retained_bytes(),
data::Either::Right(value) => value.retained_bytes(),
}
}
}
unsafe impl<'d> Sealed<'d> for data::Cursor {
fn retained_bytes(&self) -> usize {
self.resident_bytes()
}
}
unsafe impl<'d> Sealed<'d> for data::Buffer<'d> {
fn retained_bytes(&self) -> usize {
match self {
data::Buffer::Borrowed(_) => 0,
data::Buffer::Shared(bytes) => bytes.resident_bytes(),
data::Buffer::Frozen(bytes) => bytes.capacity(),
}
}
}