refraction_types/
ring_traits.rs1use crate::ring_buffer::BoundedRingBuffer;
2
3impl<T> Default for BoundedRingBuffer<T>
4where
5 T: Copy + Default,
6{
7 fn default() -> Self {
8 Self::new()
9 }
10}
11
12impl<T> std::fmt::Display for BoundedRingBuffer<T>
13where
14 T: std::fmt::Display,
15{
16 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
17 writeln!(f, "BoundedRingBuffer {{")?;
18 #[allow(clippy::cast_precision_loss)]
19 writeln!(
20 f,
21 " len: {} / {} ({:.1}% full)",
22 self.len,
23 self.capacity,
24 if self.capacity == 0 {
25 0.0
26 } else {
27 (self.len as f64 / self.capacity as f64) * 100.0
28 }
29 )?;
30 writeln!(
31 f,
32 " get_idx: {}, put_idx: {}",
33 self.get_idx, self.put_idx
34 )?;
35
36 write!(f, " data: [")?;
37 let mut idx = self.get_idx;
38 for i in 0..self.len {
39 if i > 0 {
40 write!(f, ", ")?;
41 }
42 write!(f, "{}", self.data[idx])?;
43 idx = (idx + 1) % self.capacity;
44 }
45 writeln!(f, "]")?;
46
47 write!(f, "}}")
48 }
49}
50
51impl<T> Extend<T> for BoundedRingBuffer<T>
53where
54 T: Copy + Default,
55{
56 fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
57 for item in iter {
59 self.enqueue(item);
60 }
61 }
62}
63
64impl<T> FromIterator<T> for BoundedRingBuffer<T>
66where
67 T: Copy + Default,
68{
69 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
70 let items: Vec<T> = iter.into_iter().collect();
71 let mut buffer = Self::with_capacity(items.len().max(1));
72 buffer.enqueue_slice(&items);
73 buffer
74 }
75}
76
77impl<T> From<&[T]> for BoundedRingBuffer<T>
78where
79 T: Copy + Default,
80{
81 fn from(slice: &[T]) -> Self {
82 let mut buffer = Self::with_capacity(slice.len().max(1));
83 buffer.enqueue_slice(slice);
84 buffer
85 }
86}
87
88impl<T> From<Vec<T>> for BoundedRingBuffer<T>
89where
90 T: Copy + Default,
91{
92 fn from(vec: Vec<T>) -> Self {
93 Self::from(vec.as_slice())
94 }
95}