pub trait AllocateBuf: 'static + Sized + Send {
fn reserve(&mut self, _blob_len: i32) -> Option<&mut [u8]>;
}
impl AllocateBuf for Option<Vec<u8>> {
#[inline]
#[allow(clippy::uninit_vec)]
fn reserve(&mut self, blob_len: i32) -> Option<&mut [u8]> {
let blob_len = blob_len as usize;
if let Some(buf) = self.as_mut() {
if buf.len() != blob_len {
if buf.capacity() < blob_len {
buf.reserve(blob_len - buf.capacity());
}
unsafe { buf.set_len(blob_len) };
}
} else {
let mut v = Vec::with_capacity(blob_len);
unsafe { v.set_len(blob_len) };
self.replace(v);
}
return self.as_deref_mut();
}
}
impl AllocateBuf for Vec<u8> {
#[inline]
fn reserve(&mut self, blob_len: i32) -> Option<&mut [u8]> {
let blob_len = blob_len as usize;
if self.len() != blob_len {
if self.capacity() < blob_len {
self.reserve(blob_len - self.capacity());
}
unsafe { self.set_len(blob_len) };
}
return Some(self);
}
}
impl AllocateBuf for Option<io_buffer::Buffer> {
#[inline]
fn reserve(&mut self, blob_len: i32) -> Option<&mut [u8]> {
if let Some(buf) = self.as_mut() {
let blob_len = blob_len as usize;
if buf.len() != blob_len {
if buf.capacity() < blob_len {
return None;
}
buf.set_len(blob_len);
}
} else if let Ok(v) = io_buffer::Buffer::alloc(blob_len) {
self.replace(v);
} else {
return None;
}
return self.as_deref_mut();
}
}
impl AllocateBuf for io_buffer::Buffer {
#[inline]
fn reserve(&mut self, blob_len: i32) -> Option<&mut [u8]> {
let blob_len = blob_len as usize;
if self.len() != blob_len {
if self.capacity() < blob_len {
return None;
}
self.set_len(blob_len);
}
Some(self)
}
}