odem_rs_sync/channel/
backing.rs1use core::{fmt, marker::PhantomData, mem::MaybeUninit};
23
24use super::RingBuf;
25
26pub struct Rendezvous<T>(PhantomData<T>);
33
34impl<T> Rendezvous<T> {
35 pub const fn new() -> Self {
37 Rendezvous(PhantomData)
38 }
39}
40
41impl<T> Default for Rendezvous<T> {
42 fn default() -> Self {
43 Rendezvous::new()
44 }
45}
46
47impl<T> fmt::Debug for Rendezvous<T> {
48 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
49 write!(f, "Rendezvous")
50 }
51}
52
53impl<T> RingBuf for Rendezvous<T> {
54 type Item = T;
55
56 fn enqueue(&mut self, item: T) -> Result<(), T> {
57 Err(item)
58 }
59
60 fn dequeue(&mut self) -> Option<T> {
61 None
62 }
63
64 fn clear(&mut self) {}
65
66 fn len(&self) -> usize {
67 0
68 }
69}
70
71pub struct ArrayBuf<const N: usize, T> {
76 off: usize,
78 len: usize,
80 buf: [MaybeUninit<T>; N],
82}
83
84impl<const N: usize, T> ArrayBuf<N, T> {
85 pub const fn new() -> Self {
88 ArrayBuf {
89 off: 0,
90 len: 0,
91 buf: [const { MaybeUninit::uninit() }; N],
92 }
93 }
94}
95
96impl<const N: usize, T> Default for ArrayBuf<N, T> {
97 fn default() -> Self {
98 ArrayBuf::new()
99 }
100}
101
102impl<const N: usize, T> Drop for ArrayBuf<N, T> {
103 fn drop(&mut self) {
104 for i in self.off..self.off + self.len {
105 unsafe { self.buf.get_unchecked_mut(i % N).assume_init_drop() }
106 }
107 }
108}
109
110impl<const N: usize, T> RingBuf for ArrayBuf<N, T> {
111 type Item = T;
112
113 fn enqueue(&mut self, item: T) -> Result<(), T> {
114 if self.len < N {
116 let idx = (self.off + self.len) % N;
118
119 unsafe { self.buf.get_unchecked_mut(idx).write(item) };
124
125 self.len += 1;
127
128 Ok(())
130 } else {
131 Err(item)
133 }
134 }
135
136 fn dequeue(&mut self) -> Option<T> {
137 if self.len > 0 {
139 let item = unsafe { self.buf.get_unchecked_mut(self.off).assume_init_read() };
143
144 self.off = (self.off + 1) % N;
146
147 self.len -= 1;
149
150 Some(item)
152 } else {
153 None
155 }
156 }
157
158 fn clear(&mut self) {
159 while self.len > 0 {
160 unsafe { self.buf.get_unchecked_mut(self.off).assume_init_read() };
164
165 self.off = (self.off + 1) % N;
167
168 self.len -= 1;
170 }
171 }
172
173 fn len(&self) -> usize {
174 self.len
175 }
176}
177
178#[cfg(feature = "alloc")]
181#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
182impl<T> RingBuf for alloc::collections::VecDeque<T> {
183 type Item = T;
184
185 fn enqueue(&mut self, item: T) -> Result<(), T> {
186 self.push_back(item);
187 Ok(())
188 }
189
190 fn dequeue(&mut self) -> Option<T> {
191 Self::pop_front(self)
192 }
193
194 fn clear(&mut self) {
195 Self::clear(self);
196 }
197
198 fn len(&self) -> usize {
199 self.len()
200 }
201}
202
203#[cfg(feature = "alloc")]
206#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
207impl<T: Ord> RingBuf for alloc::collections::BinaryHeap<T> {
208 type Item = T;
209
210 fn enqueue(&mut self, item: T) -> Result<(), T> {
211 self.push(item);
212 Ok(())
213 }
214
215 fn dequeue(&mut self) -> Option<T> {
216 self.pop()
217 }
218
219 fn clear(&mut self) {
220 self.clear();
221 }
222
223 fn len(&self) -> usize {
224 self.len()
225 }
226}