src/serialize/buffer.rs (61 lines of code) (raw):
// SPDX-License-Identifier: (Apache-2.0 OR MIT)
use core::mem::MaybeUninit;
const BUFFER_LENGTH: usize = 64 - core::mem::size_of::<usize>();
/// For use to serialize fixed-size UUIDs and DateTime.
#[repr(align(64))]
pub struct SmallFixedBuffer {
idx: usize,
bytes: [MaybeUninit<u8>; BUFFER_LENGTH],
}
impl SmallFixedBuffer {
#[inline]
pub fn new() -> Self {
Self {
idx: 0,
bytes: [MaybeUninit::<u8>::uninit(); BUFFER_LENGTH],
}
}
#[inline]
pub unsafe fn as_mut_slice(&mut self) -> &mut [u8] {
unsafe {
core::slice::from_raw_parts_mut(
(core::ptr::addr_of_mut!(self.bytes) as *mut u8).add(self.idx),
BUFFER_LENGTH - self.idx,
)
}
}
#[inline]
pub unsafe fn set_written(&mut self, len: usize) {
debug_assert!(self.idx + len < BUFFER_LENGTH);
self.idx += len;
}
#[inline]
pub fn push(&mut self, value: u8) {
debug_assert!(self.idx + 1 < BUFFER_LENGTH);
unsafe {
core::ptr::write(
(core::ptr::addr_of_mut!(self.bytes) as *mut u8).add(self.idx),
value,
);
self.idx += 1;
};
}
#[inline]
pub fn extend_from_slice(&mut self, slice: &[u8]) {
debug_assert!(self.idx + slice.len() < BUFFER_LENGTH);
unsafe {
core::ptr::copy_nonoverlapping(
slice.as_ptr(),
(core::ptr::addr_of_mut!(self.bytes) as *mut u8).add(self.idx),
slice.len(),
);
self.idx += slice.len();
}
}
#[inline]
pub fn as_ptr(&self) -> *const u8 {
core::ptr::addr_of!(self.bytes) as *const u8
}
#[inline]
pub fn len(&self) -> usize {
self.idx
}
}