devela/data/dst/queue/
impl_traits.rs

1// devela::data::dst::queue_impl_traits
2//
3//!
4//
5
6use super::{DstBuf, DstQueue, DstQueueIter, DstQueueIterMut, DstQueuePopHandle};
7use core::{fmt, iter, mem, ops};
8
9/* queue */
10
11impl<DST: ?Sized, BUF: DstBuf> ops::Drop for DstQueue<DST, BUF> {
12    fn drop(&mut self) {
13        while self.pop_front().is_some() {}
14    }
15}
16impl<DST: ?Sized, BUF: DstBuf + Default> Default for DstQueue<DST, BUF> {
17    fn default() -> Self {
18        DstQueue::new()
19    }
20}
21
22impl<BUF: DstBuf, DST: ?Sized + fmt::Debug> fmt::Debug for DstQueue<DST, BUF> {
23    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
24        f.write_str("[")?;
25        for v in self.iter() {
26            v.fmt(f)?;
27            f.write_str(",")?;
28        }
29        f.write_str("]")?;
30        Ok(())
31    }
32}
33
34/* pop handle */
35
36impl<DST: ?Sized, BUF: DstBuf> ops::Deref for DstQueuePopHandle<'_, DST, BUF> {
37    type Target = DST;
38    fn deref(&self) -> &DST {
39        unsafe { &*self.parent.front_raw() }
40    }
41}
42impl<DST: ?Sized, BUF: DstBuf> ops::DerefMut for DstQueuePopHandle<'_, DST, BUF> {
43    fn deref_mut(&mut self) -> &mut DST {
44        unsafe { &mut *self.parent.front_raw_mut() }
45    }
46}
47impl<DST: ?Sized, BUF: DstBuf> ops::Drop for DstQueuePopHandle<'_, DST, BUF> {
48    fn drop(&mut self) {
49        self.parent.pop_front_inner();
50    }
51}
52
53/* iter */
54
55impl<'a, DST: 'a + ?Sized, BUF: 'a + DstBuf> iter::Iterator for DstQueueIter<'a, DST, BUF> {
56    type Item = &'a DST;
57    #[must_use]
58    fn next(&mut self) -> Option<&'a DST> {
59        if self.1 == self.0.write_pos {
60            None
61        } else {
62            // SAFETY: Bounds checked, aliasing enforced by API.
63            let rv = unsafe { &*self.0.raw_at(self.1) };
64            self.1 +=
65                DstQueue::<DST, BUF>::meta_words() + BUF::round_to_words(mem::size_of_val(rv));
66            Some(rv)
67        }
68    }
69}
70impl<'a, DST: 'a + ?Sized, BUF: 'a + DstBuf> iter::Iterator for DstQueueIterMut<'a, DST, BUF> {
71    type Item = &'a mut DST;
72    #[must_use]
73    fn next(&mut self) -> Option<&'a mut DST> {
74        if self.1 == self.0.write_pos {
75            None
76        } else {
77            // SAFETY: Bounds checked, aliasing enforced by API
78            let rv = unsafe { &mut *self.0.raw_at_mut(self.1) };
79            self.1 +=
80                DstQueue::<DST, BUF>::meta_words() + BUF::round_to_words(mem::size_of_val(rv));
81            Some(rv)
82        }
83    }
84}