use std::ops::RangeTo;
pub trait Buffer {
fn new() -> Self
where
Self: Sized;
fn with_capacity(capacity: usize) -> Self
where
Self: Sized;
fn consume(&mut self, rng: RangeTo<usize>);
fn clear(&mut self);
fn resize(&mut self, len: usize) -> std::io::Result<()>;
fn truncate(&mut self, len: usize);
fn extend_from_slice(&mut self, other: &[u8]) -> std::io::Result<()>;
fn as_slice(&self) -> &[u8];
fn as_mut_slice(&mut self) -> &mut [u8];
fn len(&self) -> usize;
fn is_empty(&self) -> bool;
fn capacity(&self) -> usize;
}
impl Buffer for Vec<u8> {
#[cfg_attr(not(tarpaulin), inline(always))]
fn new() -> Self {
Vec::new()
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn with_capacity(capacity: usize) -> Self {
Vec::with_capacity(capacity)
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn consume(&mut self, rng: RangeTo<usize>) {
self.drain(rng);
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn clear(&mut self) {
self.clear();
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn resize(&mut self, len: usize) -> std::io::Result<()> {
self.resize(len, 0);
Ok(())
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn truncate(&mut self, len: usize) {
self.truncate(len);
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn extend_from_slice(&mut self, other: &[u8]) -> std::io::Result<()> {
self.extend_from_slice(other);
Ok(())
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn as_slice(&self) -> &[u8] {
self.as_slice()
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn as_mut_slice(&mut self) -> &mut [u8] {
self.as_mut_slice()
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn len(&self) -> usize {
self.len()
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn is_empty(&self) -> bool {
self.is_empty()
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn capacity(&self) -> usize {
self.capacity()
}
}
#[cfg(feature = "smallvec")]
#[cfg_attr(docsrs, doc(cfg(feature = "smallvec")))]
impl<A> Buffer for smallvec::SmallVec<A>
where
A: smallvec::Array<Item = u8>,
{
#[cfg_attr(not(tarpaulin), inline(always))]
fn new() -> Self
where
Self: Sized,
{
smallvec::SmallVec::new()
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn with_capacity(capacity: usize) -> Self
where
Self: Sized,
{
smallvec::SmallVec::with_capacity(capacity)
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn consume(&mut self, rng: RangeTo<usize>) {
self.drain(rng);
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn clear(&mut self) {
self.clear();
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn resize(&mut self, len: usize) -> std::io::Result<()> {
self.resize(len, 0);
Ok(())
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn truncate(&mut self, len: usize) {
self.truncate(len);
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn extend_from_slice(&mut self, other: &[u8]) -> std::io::Result<()> {
self.extend_from_slice(other);
Ok(())
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn as_slice(&self) -> &[u8] {
self.as_slice()
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn as_mut_slice(&mut self) -> &mut [u8] {
self.as_mut_slice()
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn len(&self) -> usize {
self.len()
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn is_empty(&self) -> bool {
self.is_empty()
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn capacity(&self) -> usize {
self.capacity()
}
}
#[cfg(feature = "tinyvec")]
#[cfg_attr(docsrs, doc(cfg(feature = "tinyvec")))]
impl<A: tinyvec::Array<Item = u8>> Buffer for tinyvec::TinyVec<A> {
#[cfg_attr(not(tarpaulin), inline(always))]
fn new() -> Self
where
Self: Sized,
{
tinyvec::TinyVec::new()
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn with_capacity(capacity: usize) -> Self
where
Self: Sized,
{
tinyvec::TinyVec::with_capacity(capacity)
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn consume(&mut self, rng: RangeTo<usize>) {
self.drain(rng);
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn clear(&mut self) {
self.clear();
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn resize(&mut self, len: usize) -> std::io::Result<()> {
self.resize(len, 0);
Ok(())
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn truncate(&mut self, len: usize) {
self.truncate(len);
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn extend_from_slice(&mut self, other: &[u8]) -> std::io::Result<()> {
self.extend_from_slice(other);
Ok(())
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn as_slice(&self) -> &[u8] {
self.as_slice()
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn as_mut_slice(&mut self) -> &mut [u8] {
self.as_mut_slice()
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn len(&self) -> usize {
self.len()
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn is_empty(&self) -> bool {
self.is_empty()
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn capacity(&self) -> usize {
self.capacity()
}
}