uwheel/wheels/
wheel_ext.rs1pub trait WheelExt {
3 fn head(&self) -> usize;
5 fn tail(&self) -> usize;
7 fn num_slots(&self) -> usize;
9 fn capacity(&self) -> usize;
11
12 fn size_bytes(&self) -> Option<usize> {
14 None
15 }
16
17 fn is_empty(&self) -> bool {
19 self.tail() == self.head()
20 }
21
22 fn len(&self) -> usize {
24 count(self.tail(), self.head(), self.num_slots())
25 }
26
27 #[inline]
29 fn slot_idx_forward_from_head(&self, addend: usize) -> usize {
30 self.wrap_add(self.head(), addend)
31 }
32
33 #[inline]
35 fn slot_idx_backward_from_head(&self, subtrahend: usize) -> usize {
36 self.wrap_sub(self.head(), subtrahend)
37 }
38
39 #[inline]
42 fn wrap_add(&self, idx: usize, addend: usize) -> usize {
43 wrap_index(idx.wrapping_add(addend), self.num_slots())
44 }
45
46 #[inline]
49 fn wrap_sub(&self, idx: usize, subtrahend: usize) -> usize {
50 wrap_index(idx.wrapping_sub(subtrahend), self.num_slots())
51 }
52}
53
54#[inline]
56pub(crate) fn wrap_index(index: usize, size: usize) -> usize {
57 debug_assert!(size.is_power_of_two());
59 index & (size - 1)
60}
61
62#[inline]
64pub(crate) fn count(tail: usize, head: usize, size: usize) -> usize {
65 (head.wrapping_sub(tail)) & (size - 1)
67}