pub trait WheelExt {
fn head(&self) -> usize;
fn tail(&self) -> usize;
fn num_slots(&self) -> usize;
fn capacity(&self) -> usize;
fn size_bytes(&self) -> Option<usize> {
None
}
fn is_empty(&self) -> bool {
self.tail() == self.head()
}
fn len(&self) -> usize {
count(self.tail(), self.head(), self.num_slots())
}
#[inline]
fn slot_idx_forward_from_head(&self, addend: usize) -> usize {
self.wrap_add(self.head(), addend)
}
#[inline]
fn slot_idx_backward_from_head(&self, subtrahend: usize) -> usize {
self.wrap_sub(self.head(), subtrahend)
}
#[inline]
fn wrap_add(&self, idx: usize, addend: usize) -> usize {
wrap_index(idx.wrapping_add(addend), self.num_slots())
}
#[inline]
fn wrap_sub(&self, idx: usize, subtrahend: usize) -> usize {
wrap_index(idx.wrapping_sub(subtrahend), self.num_slots())
}
}
#[inline]
pub(crate) fn wrap_index(index: usize, size: usize) -> usize {
debug_assert!(size.is_power_of_two());
index & (size - 1)
}
#[inline]
pub(crate) fn count(tail: usize, head: usize, size: usize) -> usize {
(head.wrapping_sub(tail)) & (size - 1)
}