17
17
//! use cortex_m::{asm, peripheral::syst::SystClkSource};
18
18
//! use cortex_m_rt::{entry, exception};
19
19
//! use cortex_m_semihosting::hprintln;
20
- //! use heapless::mpmc::Q2 ;
20
+ //! use heapless::mpmc::Queue::<_, 2> ;
21
21
//!
22
- //! static Q: Q2 <u8> = Q2::new();
22
+ //! static Q: Queue::<_, 2> <u8> = Q2::new();
23
23
//!
24
24
//! #[entry]
25
25
//! fn main() -> ! {
@@ -112,29 +112,11 @@ type IntSize = isize;
112
112
#[ cfg( not( feature = "mpmc_large" ) ) ]
113
113
type IntSize = i8 ;
114
114
115
- /// MPMC queue with a capability for 2 elements.
116
- pub type Q2 < T > = MpMcQueue < T , 2 > ;
117
-
118
- /// MPMC queue with a capability for 4 elements.
119
- pub type Q4 < T > = MpMcQueue < T , 4 > ;
120
-
121
- /// MPMC queue with a capability for 8 elements.
122
- pub type Q8 < T > = MpMcQueue < T , 8 > ;
123
-
124
- /// MPMC queue with a capability for 16 elements.
125
- pub type Q16 < T > = MpMcQueue < T , 16 > ;
126
-
127
- /// MPMC queue with a capability for 32 elements.
128
- pub type Q32 < T > = MpMcQueue < T , 32 > ;
129
-
130
- /// MPMC queue with a capability for 64 elements.
131
- pub type Q64 < T > = MpMcQueue < T , 64 > ;
132
-
133
- /// Base struct for [`MpMcQueue`] and [`MpMcQueueView`], generic over the [`Storage`].
115
+ /// Base struct for [`Queue`] and [`QueueView`], generic over the [`Storage`].
134
116
///
135
- /// In most cases you should use [`MpMcQueue `] or [`MpMcQueueView `] directly. Only use this
117
+ /// In most cases you should use [`Queue `] or [`QueueView `] directly. Only use this
136
118
/// struct if you want to write code that's generic over both.
137
- pub struct MpMcQueueInner < T , S : Storage > {
119
+ pub struct QueueInner < T , S : Storage > {
138
120
dequeue_pos : AtomicTargetSize ,
139
121
enqueue_pos : AtomicTargetSize ,
140
122
buffer : UnsafeCell < S :: Buffer < Cell < T > > > ,
@@ -143,14 +125,14 @@ pub struct MpMcQueueInner<T, S: Storage> {
143
125
/// MPMC queue with a capacity for N elements
144
126
/// N must be a power of 2
145
127
/// The max value of N is `u8::MAX` - 1 if `mpmc_large` feature is not enabled.
146
- pub type MpMcQueue < T , const N : usize > = MpMcQueueInner < T , OwnedStorage < N > > ;
128
+ pub type Queue < T , const N : usize > = QueueInner < T , OwnedStorage < N > > ;
147
129
148
130
/// MPMC queue with a capacity for N elements
149
131
/// N must be a power of 2
150
132
/// The max value of N is `u8::MAX` - 1 if `mpmc_large` feature is not enabled.
151
- pub type MpMcQueueView < T > = MpMcQueueInner < T , ViewStorage > ;
133
+ pub type QueueView < T > = QueueInner < T , ViewStorage > ;
152
134
153
- impl < T , const N : usize > MpMcQueue < T , N > {
135
+ impl < T , const N : usize > Queue < T , N > {
154
136
/// Creates an empty queue
155
137
pub const fn new ( ) -> Self {
156
138
const {
@@ -175,54 +157,54 @@ impl<T, const N: usize> MpMcQueue<T, N> {
175
157
}
176
158
177
159
/// Used in `Storage` implementation
178
- pub ( crate ) fn as_view_private ( & self ) -> & MpMcQueueView < T > {
160
+ pub ( crate ) fn as_view_private ( & self ) -> & QueueView < T > {
179
161
self
180
162
}
181
163
/// Used in `Storage` implementation
182
- pub ( crate ) fn as_view_mut_private ( & mut self ) -> & mut MpMcQueueView < T > {
164
+ pub ( crate ) fn as_view_mut_private ( & mut self ) -> & mut QueueView < T > {
183
165
self
184
166
}
185
167
}
186
168
187
- impl < T , S : Storage > MpMcQueueInner < T , S > {
188
- /// Get a reference to the `MpMcQueue `, erasing the `N` const-generic.
169
+ impl < T , S : Storage > QueueInner < T , S > {
170
+ /// Get a reference to the `Queue `, erasing the `N` const-generic.
189
171
///
190
172
///
191
173
/// ```rust
192
- /// # use heapless::mpmc::{MpMcQueue, MpMcQueueView };
193
- /// let queue: MpMcQueue <u8, 2> = MpMcQueue ::new();
194
- /// let view: &MpMcQueueView <u8> = queue.as_view();
174
+ /// # use heapless::mpmc::{Queue, QueueView };
175
+ /// let queue: Queue <u8, 2> = Queue ::new();
176
+ /// let view: &QueueView <u8> = queue.as_view();
195
177
/// ```
196
178
///
197
- /// It is often preferable to do the same through type coerction, since `MpMcQueue <T, N>` implements `Unsize<MpMcQueueView <T>>`:
179
+ /// It is often preferable to do the same through type coerction, since `Queue <T, N>` implements `Unsize<QueueView <T>>`:
198
180
///
199
181
/// ```rust
200
- /// # use heapless::mpmc::{MpMcQueue, MpMcQueueView };
201
- /// let queue: MpMcQueue <u8, 2> = MpMcQueue ::new();
202
- /// let view: &MpMcQueueView <u8> = &queue;
182
+ /// # use heapless::mpmc::{Queue, QueueView };
183
+ /// let queue: Queue <u8, 2> = Queue ::new();
184
+ /// let view: &QueueView <u8> = &queue;
203
185
/// ```
204
186
#[ inline]
205
- pub fn as_view ( & self ) -> & MpMcQueueView < T > {
187
+ pub fn as_view ( & self ) -> & QueueView < T > {
206
188
S :: as_mpmc_view ( self )
207
189
}
208
190
209
- /// Get a mutable reference to the `MpMcQueue `, erasing the `N` const-generic.
191
+ /// Get a mutable reference to the `Queue `, erasing the `N` const-generic.
210
192
///
211
193
/// ```rust
212
- /// # use heapless::mpmc::{MpMcQueue, MpMcQueueView };
213
- /// let mut queue: MpMcQueue <u8, 2> = MpMcQueue ::new();
214
- /// let view: &mut MpMcQueueView <u8> = queue.as_mut_view();
194
+ /// # use heapless::mpmc::{Queue, QueueView };
195
+ /// let mut queue: Queue <u8, 2> = Queue ::new();
196
+ /// let view: &mut QueueView <u8> = queue.as_mut_view();
215
197
/// ```
216
198
///
217
- /// It is often preferable to do the same through type coerction, since `MpMcQueue <T, N>` implements `Unsize<MpMcQueueView <T>>`:
199
+ /// It is often preferable to do the same through type coerction, since `Queue <T, N>` implements `Unsize<QueueView <T>>`:
218
200
///
219
201
/// ```rust
220
- /// # use heapless::mpmc::{MpMcQueue, MpMcQueueView };
221
- /// let mut queue: MpMcQueue <u8, 2> = MpMcQueue ::new();
222
- /// let view: &mut MpMcQueueView <u8> = &mut queue;
202
+ /// # use heapless::mpmc::{Queue, QueueView };
203
+ /// let mut queue: Queue <u8, 2> = Queue ::new();
204
+ /// let view: &mut QueueView <u8> = &mut queue;
223
205
/// ```
224
206
#[ inline]
225
- pub fn as_mut_view ( & mut self ) -> & mut MpMcQueueView < T > {
207
+ pub fn as_mut_view ( & mut self ) -> & mut QueueView < T > {
226
208
S :: as_mpmc_mut_view ( self )
227
209
}
228
210
@@ -250,20 +232,20 @@ impl<T, S: Storage> MpMcQueueInner<T, S> {
250
232
}
251
233
}
252
234
253
- impl < T , const N : usize > Default for MpMcQueue < T , N > {
235
+ impl < T , const N : usize > Default for Queue < T , N > {
254
236
fn default ( ) -> Self {
255
237
Self :: new ( )
256
238
}
257
239
}
258
240
259
- impl < T , S : Storage > Drop for MpMcQueueInner < T , S > {
241
+ impl < T , S : Storage > Drop for QueueInner < T , S > {
260
242
fn drop ( & mut self ) {
261
243
// drop all contents currently in the queue
262
244
while self . dequeue ( ) . is_some ( ) { }
263
245
}
264
246
}
265
247
266
- unsafe impl < T , S : Storage > Sync for MpMcQueueInner < T , S > where T : Send { }
248
+ unsafe impl < T , S : Storage > Sync for QueueInner < T , S > where T : Send { }
267
249
268
250
struct Cell < T > {
269
251
data : MaybeUninit < T > ,
@@ -370,16 +352,16 @@ unsafe fn enqueue<T>(
370
352
mod tests {
371
353
use static_assertions:: assert_not_impl_any;
372
354
373
- use super :: { MpMcQueue , Q2 } ;
355
+ use super :: Queue ;
374
356
375
- // Ensure a `MpMcQueue ` containing `!Send` values stays `!Send` itself.
376
- assert_not_impl_any ! ( MpMcQueue <* const ( ) , 4 >: Send ) ;
357
+ // Ensure a `Queue ` containing `!Send` values stays `!Send` itself.
358
+ assert_not_impl_any ! ( Queue <* const ( ) , 4 >: Send ) ;
377
359
378
360
#[ test]
379
361
fn memory_leak ( ) {
380
362
droppable ! ( ) ;
381
363
382
- let q = Q2 :: new ( ) ;
364
+ let q = Queue :: < _ , 2 > :: new ( ) ;
383
365
q. enqueue ( Droppable :: new ( ) ) . unwrap_or_else ( |_| panic ! ( ) ) ;
384
366
q. enqueue ( Droppable :: new ( ) ) . unwrap_or_else ( |_| panic ! ( ) ) ;
385
367
drop ( q) ;
@@ -389,7 +371,7 @@ mod tests {
389
371
390
372
#[ test]
391
373
fn sanity ( ) {
392
- let q = Q2 :: new ( ) ;
374
+ let q = Queue :: < _ , 2 > :: new ( ) ;
393
375
q. enqueue ( 0 ) . unwrap ( ) ;
394
376
q. enqueue ( 1 ) . unwrap ( ) ;
395
377
assert ! ( q. enqueue( 2 ) . is_err( ) ) ;
@@ -401,7 +383,7 @@ mod tests {
401
383
402
384
#[ test]
403
385
fn drain_at_pos255 ( ) {
404
- let q = Q2 :: new ( ) ;
386
+ let q = Queue :: < _ , 2 > :: new ( ) ;
405
387
for _ in 0 ..255 {
406
388
assert ! ( q. enqueue( 0 ) . is_ok( ) ) ;
407
389
assert_eq ! ( q. dequeue( ) , Some ( 0 ) ) ;
@@ -413,7 +395,7 @@ mod tests {
413
395
414
396
#[ test]
415
397
fn full_at_wrapped_pos0 ( ) {
416
- let q = Q2 :: new ( ) ;
398
+ let q = Queue :: < _ , 2 > :: new ( ) ;
417
399
for _ in 0 ..254 {
418
400
assert ! ( q. enqueue( 0 ) . is_ok( ) ) ;
419
401
assert_eq ! ( q. dequeue( ) , Some ( 0 ) ) ;
@@ -432,7 +414,7 @@ mod tests {
432
414
#[ cfg( feature = "mpmc_large" ) ]
433
415
const CAPACITY : usize = 256 ;
434
416
435
- let q: MpMcQueue < u8 , CAPACITY > = MpMcQueue :: new ( ) ;
417
+ let q: Queue < u8 , CAPACITY > = Queue :: new ( ) ;
436
418
437
419
for _ in 0 ..CAPACITY {
438
420
q. enqueue ( 0xAA ) . unwrap ( ) ;
0 commit comments