use std::ops::{Deref, DerefMut};
pub enum Buffer<'a> {
Borrowed(&'a mut [u8]),
Owned(Box<[u8]>),
}
impl Buffer<'_> {
pub fn as_slice(&self) -> &[u8] {
match self {
Buffer::Borrowed(buf) => buf,
Buffer::Owned(buf) => buf,
}
}
pub fn as_mut_slice(&mut self) -> &mut [u8] {
match self {
Buffer::Borrowed(buf) => buf,
Buffer::Owned(buf) => buf,
}
}
pub fn len(&self) -> usize {
self.as_slice().len()
}
pub fn is_empty(&self) -> bool {
self.as_slice().is_empty()
}
}
impl Deref for Buffer<'_> {
type Target = [u8];
fn deref(&self) -> &Self::Target {
self.as_slice()
}
}
impl DerefMut for Buffer<'_> {
fn deref_mut(&mut self) -> &mut Self::Target {
self.as_mut_slice()
}
}
impl From<Vec<u8>> for Buffer<'_> {
fn from(value: Vec<u8>) -> Self {
Buffer::Owned(value.into_boxed_slice())
}
}
impl<'a> From<&'a mut [u8]> for Buffer<'a> {
fn from(value: &'a mut [u8]) -> Self {
Buffer::Borrowed(value)
}
}
impl<'a> From<&'a mut Vec<u8>> for Buffer<'a> {
fn from(value: &'a mut Vec<u8>) -> Self {
Buffer::Borrowed(value.as_mut_slice())
}
}
impl Default for Buffer<'_> {
fn default() -> Self {
Self::Owned(Box::default())
}
}