use crate::buffer::reader::storage::Chunk;
use bytes::{Bytes, BytesMut};
mod buf;
mod byte_queue;
mod discard;
mod empty;
mod limit;
mod tracked;
mod uninit_slice;
mod vec_deque;
mod write_once;
pub use buf::BufMut;
pub use bytes::buf::UninitSlice;
pub use discard::Discard;
pub use empty::Empty;
pub use limit::Limit;
pub use tracked::Tracked;
pub use write_once::WriteOnce;
pub trait Storage {
const SPECIALIZES_BYTES: bool = false;
const SPECIALIZES_BYTES_MUT: bool = false;
fn put_slice(&mut self, bytes: &[u8]);
#[inline(always)]
fn put_uninit_slice<F, Error>(&mut self, payload_len: usize, f: F) -> Result<bool, Error>
where
F: FnOnce(&mut UninitSlice) -> Result<(), Error>,
{
ensure!(payload_len == 0, Ok(false));
f(UninitSlice::new(&mut []))?;
Ok(true)
}
fn remaining_capacity(&self) -> usize;
#[inline]
fn has_remaining_capacity(&self) -> bool {
self.remaining_capacity() > 0
}
#[inline]
fn put_bytes(&mut self, bytes: Bytes) {
self.put_slice(&bytes);
}
#[inline]
fn put_bytes_mut(&mut self, bytes: BytesMut) {
self.put_slice(&bytes);
}
#[inline]
fn put_chunk(&mut self, chunk: Chunk) {
match chunk {
Chunk::Slice(v) => self.put_slice(v),
Chunk::Bytes(v) => self.put_bytes(v),
Chunk::BytesMut(v) => self.put_bytes_mut(v),
}
}
#[inline]
fn with_write_limit(&mut self, max_len: usize) -> Limit<'_, Self> {
Limit::new(self, max_len)
}
#[inline]
fn track_write(&mut self) -> Tracked<'_, Self> {
Tracked::new(self)
}
#[inline]
fn write_once(&mut self) -> WriteOnce<'_, Self> {
WriteOnce::new(self)
}
}