use crate::ring_buffer::BoundedRingBuffer;
macro_rules! impl_enqueue_num {
($( $fn_name:ident: $ty:ty),* $(,)?) => {
impl BoundedRingBuffer<u8> {
$(
pub fn $fn_name(&mut self, value: $ty) {
self.enqueue_slice(&value.to_be_bytes());
}
)*
}
};
}
impl_enqueue_num!(
enqueue_u8: u8,
enqueue_u16: u16,
enqueue_u32: u32,
enqueue_u64: u64,
enqueue_u128: u128,
enqueue_i8: i8,
enqueue_i16: i16,
enqueue_i32: i32,
enqueue_i64: i64,
enqueue_i128: i128,
enqueue_isize: isize,
enqueue_usize: usize,
enqueue_f32: f32,
enqueue_f64: f64,
);
macro_rules! impl_dequeue_num {
($( $fn_name:ident: $ty:ty),* $(,)?) => {
impl BoundedRingBuffer<u8> {
$(
#[must_use]
pub fn $fn_name(&mut self) -> Option<$ty> {
const TYPE_SIZE: usize = size_of::<$ty>();
let mut slice = [0u8; TYPE_SIZE];
if self.dequeue_slice(slice.as_mut_slice(), TYPE_SIZE) != TYPE_SIZE {
return None;
}
Some(<$ty>::from_be_bytes(slice))
}
)*
}
};
}
impl_dequeue_num!(
dequeue_u8: u8,
dequeue_u16: u16,
dequeue_u32: u32,
dequeue_u64: u64,
dequeue_u128: u128,
dequeue_i8: i8,
dequeue_i16: i16,
dequeue_i32: i32,
dequeue_i64: i64,
dequeue_i128: i128,
dequeue_isize: isize,
dequeue_usize: usize,
dequeue_f32: f32,
dequeue_f64: f64,
);
macro_rules! impl_pop_num {
($ ($fn_pop_name:ident: $ty:ty),* $(,)? ) => {
impl BoundedRingBuffer<u8>
{
$(
#[must_use]
pub fn $fn_pop_name(&self) -> Option<$ty> {
const TYPE_SIZE: usize = size_of::<$ty>();
if self.is_empty() || self.len < TYPE_SIZE || self.capacity < TYPE_SIZE {
return None;
}
let new_get_idx = (self.get_idx + TYPE_SIZE) % self.capacity;
let mut slice = [0u8; TYPE_SIZE];
if new_get_idx < self.get_idx {
let middle = self.capacity - self.get_idx;
slice[..middle].copy_from_slice(&self.data[self.get_idx..]);
slice[middle..].copy_from_slice(&self.data[..new_get_idx]);
} else {
slice.copy_from_slice(&self.data[self.get_idx..new_get_idx]);
}
Some(<$ty>::from_be_bytes(slice))
}
)*
}
};
}
impl_pop_num!(
peek_u8: u8,
peek_u16: u16,
peek_u32: u32,
peek_u64: u64,
peek_u128: u128,
peek_i8: i8,
peek_i16: i16,
peek_i32: i32,
peek_i64: i64,
peek_i128: i128,
peek_usize: usize,
peek_isize: isize,
peek_f32: f32,
peek_f64: f64
);