const ALIGN_4K: usize = 0xfff;
pub trait CdrBuffer {
fn extend_from_slice(&mut self, data: &[u8]);
fn push(&mut self, byte: u8);
fn len(&self) -> usize;
fn is_empty(&self) -> bool {
self.len() == 0
}
fn reserve(&mut self, _additional: usize) {}
fn reserve_4k(&mut self, needed_total: usize) {
let current = self.len();
if needed_total > current {
self.reserve(needed_total - current);
}
}
fn clear(&mut self);
}
impl CdrBuffer for Vec<u8> {
#[inline(always)]
fn extend_from_slice(&mut self, data: &[u8]) {
Self::extend_from_slice(self, data);
}
#[inline(always)]
fn push(&mut self, byte: u8) {
Self::push(self, byte);
}
#[inline(always)]
fn len(&self) -> usize {
Self::len(self)
}
#[inline(always)]
fn reserve(&mut self, additional: usize) {
Self::reserve(self, additional);
}
#[inline]
fn reserve_4k(&mut self, needed_total: usize) {
let current_cap = self.capacity();
if needed_total > current_cap {
let new_cap = (needed_total + ALIGN_4K) & !ALIGN_4K;
self.reserve(new_cap - self.len());
}
}
#[inline(always)]
fn clear(&mut self) {
Self::clear(self);
}
}