#[cfg(not(feature = "std"))]
use alloc::{string::String, vec::Vec};
use bytes::Bytes;
pub use bytes::BytesMut as Builder;
pub(crate) struct UnfilledSlice {
builder: Builder,
len: usize,
}
impl UnfilledSlice {
pub(crate) fn new(len: usize) -> Self {
Self {
builder: Builder::with_capacity(len),
len,
}
}
pub(crate) fn target(&mut self) -> crate::fs::ReadBuf<'_> {
let (target, _) = self.builder.spare_capacity_mut().split_at_mut(self.len);
crate::fs::ReadBuf::uninit(target)
}
pub(crate) unsafe fn assume_filled(mut self) -> Slice {
#[expect(unsafe_code, reason = "see safety")]
unsafe {
self.builder.set_len(self.len);
}
Slice(self.builder.freeze())
}
}
#[derive(Debug, Clone, Eq, Hash, Ord)]
pub struct Slice(pub(super) Bytes);
impl Slice {
#[must_use]
pub fn new(bytes: &[u8]) -> Self {
Self(Bytes::copy_from_slice(bytes))
}
#[doc(hidden)]
#[must_use]
pub fn empty() -> Self {
Self(Bytes::from_static(&[]))
}
#[doc(hidden)]
#[must_use]
pub unsafe fn builder_unzeroed(len: usize) -> Builder {
let mut builder = Builder::with_capacity(len);
#[expect(unsafe_code, reason = "see safety")]
unsafe {
builder.set_len(len);
}
builder
}
#[doc(hidden)]
#[must_use]
pub fn slice(&self, range: impl core::ops::RangeBounds<usize>) -> Self {
Self(self.0.slice(range))
}
#[inline]
pub(crate) fn same_bytes(&self, other: &Self) -> bool {
self.0 == other.0
}
#[doc(hidden)]
#[must_use]
pub fn fused(left: &[u8], right: &[u8]) -> Self {
let mut builder = Builder::with_capacity(left.len() + right.len());
builder.extend_from_slice(left);
builder.extend_from_slice(right);
Self(builder.freeze())
}
#[doc(hidden)]
#[cfg(feature = "std")]
pub fn from_reader<R: std::io::Read>(reader: &mut R, len: usize) -> std::io::Result<Self> {
let mut builder = Builder::zeroed(len);
reader.read_exact(&mut builder)?;
Ok(Self(builder.freeze()))
}
#[doc(hidden)]
#[cfg(not(feature = "std"))]
pub fn from_reader<R: crate::io::Read>(reader: &mut R, len: usize) -> crate::io::Result<Self> {
let mut builder = Builder::zeroed(len);
reader.read_exact(&mut builder)?;
Ok(Self(builder.freeze()))
}
}
impl From<Bytes> for Slice {
fn from(value: Bytes) -> Self {
Self(value)
}
}
impl From<Slice> for Bytes {
fn from(value: Slice) -> Self {
value.0
}
}
impl From<Vec<u8>> for Slice {
fn from(value: Vec<u8>) -> Self {
Self(Bytes::from(value))
}
}
impl From<String> for Slice {
fn from(value: String) -> Self {
Self(Bytes::from(value))
}
}