devela/data/dst/queue/
impl_traits.rs
1use super::{DstBuf, DstQueue, DstQueueIter, DstQueueIterMut, DstQueuePopHandle};
7use core::{fmt, iter, mem, ops};
8
9impl<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
34impl<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
53impl<'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 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 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}