Skip to main content

refraction_types/
ring_traits.rs

1use 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
51//EXTEND
52impl<T> Extend<T> for BoundedRingBuffer<T>
53where
54    T: Copy + Default,
55{
56    fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
57        //maybe we can optimize it
58        for item in iter {
59            self.enqueue(item);
60        }
61    }
62}
63
64//FROM
65impl<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}