use std::ops::Index;
use bytes::Bytes;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum StableBuf {
Vec(Vec<u8>),
BytesMut(bytes::BytesMut),
}
impl Default for StableBuf {
fn default() -> Self {
StableBuf::Vec(Vec::new())
}
}
impl From<Vec<u8>> for StableBuf {
fn from(v: Vec<u8>) -> Self {
StableBuf::Vec(v)
}
}
impl From<bytes::BytesMut> for StableBuf {
fn from(b: bytes::BytesMut) -> Self {
StableBuf::BytesMut(b)
}
}
impl From<StableBuf> for Bytes {
fn from(buf: StableBuf) -> Self {
match buf {
StableBuf::Vec(v) => Bytes::from(v),
StableBuf::BytesMut(b) => b.freeze(),
}
}
}
impl Index<usize> for StableBuf {
type Output = u8;
fn index(&self, index: usize) -> &Self::Output {
match self {
StableBuf::Vec(v) => &v[index],
StableBuf::BytesMut(b) => &b[index],
}
}
}
impl StableBuf {
pub fn as_mut_ptr(&mut self) -> *mut u8 {
match self {
StableBuf::Vec(v) => v.as_mut_ptr(),
StableBuf::BytesMut(b) => b.as_mut_ptr(),
}
}
pub fn len(&self) -> usize {
match self {
StableBuf::Vec(v) => v.len(),
StableBuf::BytesMut(b) => b.len(),
}
}
pub fn is_empty(&self) -> bool {
match self {
StableBuf::Vec(v) => v.is_empty(),
StableBuf::BytesMut(b) => b.is_empty(),
}
}
pub fn put_slice(&mut self, src: &[u8]) {
let dst = self.as_mut_ptr();
unsafe {
std::ptr::copy_nonoverlapping(src.as_ptr(), dst, src.len());
}
}
pub fn truncate(&mut self, len: usize) {
match self {
StableBuf::Vec(v) => v.truncate(len),
StableBuf::BytesMut(b) => b.truncate(len),
}
}
}
impl AsRef<[u8]> for StableBuf {
fn as_ref(&self) -> &[u8] {
match self {
StableBuf::Vec(v) => v.as_ref(),
StableBuf::BytesMut(b) => b.as_ref(),
}
}
}
impl AsMut<[u8]> for StableBuf {
fn as_mut(&mut self) -> &mut [u8] {
match self {
StableBuf::Vec(v) => v.as_mut(),
StableBuf::BytesMut(b) => b.as_mut(),
}
}
}