1#![no_std]
2#![deny(missing_docs)]
3#![deny(warnings)]
4#![deny(unused_import_braces)]
5#![deny(unused_results)]
6#![deny(trivial_casts)]
7#![deny(trivial_numeric_casts)]
8#![deny(unused_qualifications)]
9#![deny(clippy::must_use_candidate)]
10#![deny(clippy::default_trait_access)]
11#![deny(clippy::doc_markdown)]
12#![deny(clippy::semicolon_if_nothing_returned)]
13#![allow(unused_unsafe)] #![doc = include_str!("../README.md")]
15
16#[cfg(feature = "alloc")]
17extern crate alloc;
18
19#[macro_use]
20pub(crate) mod ringbuffer_trait;
21
22pub use ringbuffer_trait::RingBuffer;
23
24mod set_len_trait;
25pub use set_len_trait::SetLen;
26
27#[cfg(feature = "alloc")]
28mod with_alloc;
29#[cfg(feature = "alloc")]
30pub use with_alloc::alloc_ringbuffer::AllocRingBuffer;
31#[cfg(feature = "alloc")]
32pub use with_alloc::vecdeque::GrowableAllocRingBuffer;
33
34mod with_const_generics;
35pub use with_const_generics::ConstGenericRingBuffer;
36
37#[inline]
39#[cfg(feature = "alloc")]
40const fn mask_and(cap: usize, index: usize) -> usize {
41 debug_assert!(cap.is_power_of_two());
42 index & (cap - 1)
43}
44
45#[inline]
47const fn mask_modulo(cap: usize, index: usize) -> usize {
48 index % cap
49}
50
51#[cfg(test)]
52#[allow(non_upper_case_globals)]
53mod tests {
54 extern crate std;
55
56 use core::fmt::Debug;
57 use std::vec;
58 use std::vec::Vec;
59
60 use crate::ringbuffer_trait::{RingBufferIterator, RingBufferMutIterator};
61 use crate::{AllocRingBuffer, ConstGenericRingBuffer, GrowableAllocRingBuffer, RingBuffer};
62
63 #[test]
64 fn run_test_neg_index() {
65 const capacity: usize = 8;
68 fn test_neg_index(mut b: impl RingBuffer<usize>) {
69 for i in 0..capacity + 2 {
70 let _ = b.enqueue(i);
71 assert_eq!(b.get_signed(-1), Some(&i));
72 }
73 }
74
75 test_neg_index(AllocRingBuffer::new(capacity));
76 test_neg_index(ConstGenericRingBuffer::<usize, capacity>::new());
77 test_neg_index(GrowableAllocRingBuffer::with_capacity(capacity));
78 }
79
80 #[test]
81 fn run_test_default() {
82 fn test_default(b: impl RingBuffer<i32>) {
83 assert_eq!(b.capacity(), 8);
84 assert_eq!(b.len(), 0);
85 }
86
87 test_default(AllocRingBuffer::new(8));
88 test_default(GrowableAllocRingBuffer::with_capacity(8));
89 test_default(ConstGenericRingBuffer::<i32, 8>::new());
90 }
91
92 #[test]
93 fn run_test_new() {
94 fn test_new(b: impl RingBuffer<i32>) {
95 assert_eq!(b.capacity(), 8);
96 assert_eq!(b.len(), 0);
97 }
98
99 test_new(AllocRingBuffer::new(8));
100 test_new(GrowableAllocRingBuffer::with_capacity(8));
101 test_new(ConstGenericRingBuffer::<i32, 8>::new());
102 }
103
104 #[test]
105 fn test_default_eq_new() {
106 assert_eq!(
107 GrowableAllocRingBuffer::<i32>::default(),
108 GrowableAllocRingBuffer::<i32>::new()
109 );
110 assert_eq!(
111 ConstGenericRingBuffer::<i32, 8>::default(),
112 ConstGenericRingBuffer::<i32, 8>::new()
113 );
114 }
115
116 #[test]
117 fn run_test_len() {
118 fn test_len(mut b: impl RingBuffer<i32>) {
119 assert_eq!(0, b.len());
120 let _ = b.enqueue(1);
121 assert_eq!(1, b.len());
122 let _ = b.enqueue(2);
123 assert_eq!(2, b.len());
124 }
125
126 test_len(AllocRingBuffer::new(8));
127 test_len(GrowableAllocRingBuffer::with_capacity(8));
128 test_len(ConstGenericRingBuffer::<i32, 8>::new());
129 }
130
131 #[test]
132 fn run_test_len_wrap() {
133 fn test_len_wrap(mut b: impl RingBuffer<i32>) {
134 assert_eq!(0, b.len());
135 let _ = b.enqueue(1);
136 assert_eq!(1, b.len());
137 let _ = b.enqueue(2);
138 assert_eq!(2, b.len());
139 let _ = b.enqueue(3);
141 assert_eq!(2, b.len());
142 let _ = b.enqueue(4);
143 assert_eq!(2, b.len());
144 }
145
146 test_len_wrap(AllocRingBuffer::new(2));
147 test_len_wrap(ConstGenericRingBuffer::<i32, 2>::new());
148
149 let mut grb = GrowableAllocRingBuffer::with_capacity(2);
151 assert_eq!(0, grb.len());
152 let _ = grb.enqueue(0);
153 assert_eq!(1, grb.len());
154 let _ = grb.enqueue(1);
155 assert_eq!(2, grb.len());
156 let _ = grb.enqueue(2);
157 assert_eq!(3, grb.len());
158 }
159
160 #[test]
161 fn run_test_clear() {
162 fn test_clear(mut b: impl RingBuffer<i32>) {
163 let _ = b.enqueue(1);
164 let _ = b.enqueue(2);
165 let _ = b.enqueue(3);
166
167 b.clear();
168 assert!(b.is_empty());
169 assert_eq!(0, b.len());
170 }
171
172 test_clear(AllocRingBuffer::new(8));
173 test_clear(GrowableAllocRingBuffer::with_capacity(8));
174 test_clear(ConstGenericRingBuffer::<i32, 8>::new());
175 }
176
177 #[test]
178 fn run_test_empty() {
179 fn test_empty(mut b: impl RingBuffer<i32>) {
180 assert!(b.is_empty());
181 let _ = b.enqueue(1);
182 let _ = b.enqueue(2);
183 let _ = b.enqueue(3);
184 assert!(!b.is_empty());
185
186 b.clear();
187 assert!(b.is_empty());
188 assert_eq!(0, b.len());
189 }
190
191 test_empty(AllocRingBuffer::new(8));
192 test_empty(GrowableAllocRingBuffer::with_capacity(8));
193 test_empty(ConstGenericRingBuffer::<i32, 8>::new());
194 }
195
196 #[test]
197 fn run_test_iter() {
198 fn test_iter(mut b: impl RingBuffer<i32>) {
199 let _ = b.enqueue(1);
200 let _ = b.enqueue(2);
201 let _ = b.enqueue(3);
202 let _ = b.enqueue(4);
203 let _ = b.enqueue(5);
204 let _ = b.enqueue(6);
205 let _ = b.enqueue(7);
206
207 let mut iter = b.iter();
208 assert_eq!(&1, iter.next().unwrap());
209 assert_eq!(&7, iter.next_back().unwrap());
210 assert_eq!(&2, iter.next().unwrap());
211 assert_eq!(&3, iter.next().unwrap());
212 assert_eq!(&6, iter.next_back().unwrap());
213 assert_eq!(&5, iter.next_back().unwrap());
214 assert_eq!(&4, iter.next().unwrap());
215 assert_eq!(None, iter.next());
216 }
217
218 test_iter(AllocRingBuffer::new(8));
219 test_iter(GrowableAllocRingBuffer::with_capacity(8));
220 test_iter(ConstGenericRingBuffer::<i32, 8>::new());
221 }
222
223 #[test]
224 fn run_test_forward_iter_non_power_of_two() {
225 fn test_iter(mut b: impl RingBuffer<i32>) {
226 let _ = b.enqueue(1);
227 let _ = b.enqueue(2);
228 let _ = b.enqueue(3);
229 let _ = b.enqueue(4);
230 let _ = b.enqueue(5);
231 let _ = b.enqueue(6);
232 let _ = b.enqueue(7);
233
234 let mut iter = b.iter();
235 assert_eq!(&1, iter.next().unwrap());
236 assert_eq!(&2, iter.next().unwrap());
237 assert_eq!(&3, iter.next().unwrap());
238 assert_eq!(&4, iter.next().unwrap());
239 assert_eq!(&5, iter.next().unwrap());
240 assert_eq!(&6, iter.next().unwrap());
241 assert_eq!(&7, iter.next().unwrap());
242 assert_eq!(None, iter.next());
243 }
244
245 test_iter(AllocRingBuffer::new(7));
246 test_iter(GrowableAllocRingBuffer::with_capacity(7));
247 test_iter(ConstGenericRingBuffer::<i32, 7>::new());
248 }
249
250 #[test]
251 fn run_test_iter_non_power_of_two() {
252 fn test_iter(mut b: impl RingBuffer<i32>) {
253 let _ = b.enqueue(1);
254 let _ = b.enqueue(2);
255 let _ = b.enqueue(3);
256 let _ = b.enqueue(4);
257 let _ = b.enqueue(5);
258 let _ = b.enqueue(6);
259 let _ = b.enqueue(7);
260
261 let mut iter = b.iter();
262 assert_eq!(&1, iter.next().unwrap());
263 assert_eq!(&7, iter.next_back().unwrap());
264 assert_eq!(&2, iter.next().unwrap());
265 assert_eq!(&3, iter.next().unwrap());
266 assert_eq!(&6, iter.next_back().unwrap());
267 assert_eq!(&5, iter.next_back().unwrap());
268 assert_eq!(&4, iter.next().unwrap());
269 assert_eq!(None, iter.next());
270 }
271
272 test_iter(AllocRingBuffer::new(7));
273 test_iter(GrowableAllocRingBuffer::with_capacity(7));
274 test_iter(ConstGenericRingBuffer::<i32, 7>::new());
275 }
276
277 #[test]
278 fn run_test_iter_ref() {
279 fn test_iter<B>(mut b: B)
280 where
281 B: RingBuffer<i32>,
282 for<'a> &'a B: IntoIterator<Item = &'a i32, IntoIter = RingBufferIterator<'a, i32, B>>,
283 {
284 let _ = b.enqueue(1);
285 let _ = b.enqueue(2);
286 let _ = b.enqueue(3);
287 let _ = b.enqueue(4);
288 let _ = b.enqueue(5);
289 let _ = b.enqueue(6);
290 let _ = b.enqueue(7);
291
292 let mut iter = (&b).into_iter();
293 assert_eq!(&1, iter.next().unwrap());
294 assert_eq!(&7, iter.next_back().unwrap());
295 assert_eq!(&2, iter.next().unwrap());
296 assert_eq!(&3, iter.next().unwrap());
297 assert_eq!(&6, iter.next_back().unwrap());
298 assert_eq!(&5, iter.next_back().unwrap());
299 assert_eq!(&4, iter.next().unwrap());
300 assert_eq!(None, iter.next());
301 }
302
303 test_iter(AllocRingBuffer::new(8));
304 test_iter(GrowableAllocRingBuffer::with_capacity(8));
305 test_iter(ConstGenericRingBuffer::<i32, 8>::new());
306 }
307
308 #[test]
309 fn run_test_into_iter() {
310 fn test_iter(mut b: impl RingBuffer<i32>) {
311 let _ = b.enqueue(1);
312 let _ = b.enqueue(2);
313 let _ = b.enqueue(3);
314 let _ = b.enqueue(4);
315 let _ = b.enqueue(5);
316 let _ = b.enqueue(6);
317 let _ = b.enqueue(7);
318
319 let mut iter = b.into_iter();
320 assert_eq!(1, iter.next().unwrap());
321 assert_eq!(2, iter.next().unwrap());
322 assert_eq!(3, iter.next().unwrap());
323 assert_eq!(4, iter.next().unwrap());
324 assert_eq!(5, iter.next().unwrap());
325 assert_eq!(6, iter.next().unwrap());
326 assert_eq!(7, iter.next().unwrap());
327 assert_eq!(None, iter.next());
328 }
329
330 test_iter(AllocRingBuffer::new(8));
331 test_iter(GrowableAllocRingBuffer::with_capacity(8));
332 test_iter(ConstGenericRingBuffer::<i32, 8>::new());
333 }
334
335 #[cfg(feature = "alloc")]
336 #[test]
337 fn run_test_iter_with_lifetimes() {
338 fn test_iter<'a>(string: &'a str, mut b: impl RingBuffer<&'a str>) {
339 let _ = b.enqueue(&string[0..1]);
340 let _ = b.enqueue(&string[1..2]);
341 let _ = b.enqueue(&string[2..3]);
342
343 let mut iter = b.iter();
344 assert_eq!(&&string[0..1], iter.next().unwrap());
345 assert_eq!(&&string[1..2], iter.next().unwrap());
346 assert_eq!(&&string[2..3], iter.next().unwrap());
347 }
348
349 extern crate alloc;
350 use alloc::string::ToString as _;
351 let string = "abc".to_string();
352
353 test_iter(&string, AllocRingBuffer::new(8));
354 test_iter(&string, GrowableAllocRingBuffer::with_capacity(8));
355 test_iter(&string, ConstGenericRingBuffer::<&str, 8>::new());
356 }
357
358 #[test]
359 fn run_test_double_iter() {
360 fn test_double_iter(mut b: impl RingBuffer<i32>) {
361 let _ = b.enqueue(1);
362 let _ = b.enqueue(2);
363 let _ = b.enqueue(3);
364
365 let mut iter1 = b.iter();
366 let mut iter2 = b.iter();
367
368 assert_eq!(&1, iter1.next().unwrap());
369 assert_eq!(&2, iter1.next().unwrap());
370 assert_eq!(&3, iter1.next().unwrap());
371 assert_eq!(&1, iter2.next().unwrap());
372 assert_eq!(&2, iter2.next().unwrap());
373 assert_eq!(&3, iter2.next().unwrap());
374 }
375
376 test_double_iter(AllocRingBuffer::new(8));
377 test_double_iter(GrowableAllocRingBuffer::with_capacity(8));
378 test_double_iter(ConstGenericRingBuffer::<i32, 8>::new());
379 }
380
381 #[test]
382 fn run_test_iter_wrap() {
383 fn test_iter_wrap(mut b: impl RingBuffer<i32>) {
384 let _ = b.enqueue(1);
385 let _ = b.enqueue(2);
386 let _ = b.enqueue(3);
388
389 let mut iter = b.iter();
390 assert_eq!(&2, iter.next().unwrap());
391 assert_eq!(&3, iter.next().unwrap());
392 }
393
394 test_iter_wrap(AllocRingBuffer::new(2));
395 test_iter_wrap(ConstGenericRingBuffer::<i32, 2>::new());
396
397 let mut b = GrowableAllocRingBuffer::with_capacity(2);
399
400 let _ = b.enqueue(1);
401 let _ = b.enqueue(2);
402 let _ = b.enqueue(3);
404
405 let mut iter = b.iter();
406 assert_eq!(&1, iter.next().unwrap());
407 assert_eq!(&2, iter.next().unwrap());
408 assert_eq!(&3, iter.next().unwrap());
409 assert!(iter.next().is_none());
410 }
411
412 #[test]
413 fn run_test_iter_mut() {
414 fn test_iter_mut(mut b: impl RingBuffer<i32>) {
415 let _ = b.enqueue(1);
416 let _ = b.enqueue(2);
417 let _ = b.enqueue(3);
418
419 for el in b.iter_mut() {
420 *el += 1;
421 }
422
423 assert_eq!(vec![2, 3, 4], b.to_vec());
424 }
425
426 test_iter_mut(AllocRingBuffer::new(8));
427 test_iter_mut(GrowableAllocRingBuffer::with_capacity(8));
428 test_iter_mut(ConstGenericRingBuffer::<i32, 8>::new());
429 }
430
431 #[test]
432 fn run_test_iter_mut_ref() {
433 fn test_iter_mut<B>(mut b: B)
434 where
435 B: RingBuffer<i32>,
436 for<'a> &'a mut B:
437 IntoIterator<Item = &'a mut i32, IntoIter = RingBufferMutIterator<'a, i32, B>>,
438 {
439 let _ = b.enqueue(1);
440 let _ = b.enqueue(2);
441 let _ = b.enqueue(3);
442
443 for el in &mut b {
444 *el += 1;
445 }
446
447 assert_eq!(vec![2, 3, 4], b.to_vec());
448 }
449
450 test_iter_mut(AllocRingBuffer::new(8));
451 test_iter_mut(GrowableAllocRingBuffer::with_capacity(8));
452 test_iter_mut(ConstGenericRingBuffer::<i32, 8>::new());
453 }
454
455 #[test]
456 fn test_iter_mut_wrap() {
457 fn run_test_iter_mut_wrap(mut b: impl RingBuffer<i32>) {
458 let _ = b.enqueue(1);
459 let _ = b.enqueue(2);
460 let _ = b.enqueue(3);
461
462 for i in b.iter_mut() {
463 *i += 1;
464 }
465
466 assert_eq!(vec![3, 4], b.to_vec());
467 }
468
469 run_test_iter_mut_wrap(AllocRingBuffer::new(2));
470 run_test_iter_mut_wrap(ConstGenericRingBuffer::<i32, 2>::new());
471
472 let mut b = GrowableAllocRingBuffer::with_capacity(2);
474
475 let _ = b.enqueue(1);
476 let _ = b.enqueue(2);
477 let _ = b.enqueue(3);
478
479 for i in b.iter_mut() {
480 *i += 1;
481 }
482
483 assert_eq!(vec![2, 3, 4], b.to_vec());
484 }
485
486 #[test]
487 fn test_iter_mut_miri_fail() {
488 fn run_test_iter_mut_wrap(mut b: impl RingBuffer<i32>) {
489 let _ = b.enqueue(1);
490 let _ = b.enqueue(2);
491 let _ = b.enqueue(3);
492
493 let buf = b.iter_mut().collect::<Vec<_>>();
494
495 for i in buf {
496 *i += 1;
497 }
498
499 assert_eq!(vec![3, 4], b.to_vec());
500 }
501
502 run_test_iter_mut_wrap(AllocRingBuffer::new(2));
503 run_test_iter_mut_wrap(ConstGenericRingBuffer::<i32, 2>::new());
504
505 let mut b = GrowableAllocRingBuffer::with_capacity(2);
507 let _ = b.enqueue(1);
508 let _ = b.enqueue(2);
509 let _ = b.enqueue(3);
510
511 let buf = b.iter_mut().collect::<Vec<_>>();
512
513 for i in buf {
514 *i += 1;
515 }
516
517 assert_eq!(vec![2, 3, 4], b.to_vec());
518 }
519
520 #[test]
521 fn run_test_to_vec() {
522 fn test_to_vec(mut b: impl RingBuffer<i32>) {
523 let _ = b.enqueue(1);
524 let _ = b.enqueue(2);
525 let _ = b.enqueue(3);
526
527 assert_eq!(vec![1, 2, 3], b.to_vec());
528 }
529
530 test_to_vec(AllocRingBuffer::new(8));
531 test_to_vec(GrowableAllocRingBuffer::with_capacity(8));
532 test_to_vec(ConstGenericRingBuffer::<i32, 8>::new());
533 }
534
535 #[test]
536 fn run_test_to_vec_wrap() {
537 fn test_to_vec_wrap(mut b: impl RingBuffer<i32>) {
538 let _ = b.enqueue(1);
539 let _ = b.enqueue(2);
540 let _ = b.enqueue(3);
542
543 assert_eq!(vec![2, 3], b.to_vec());
544 }
545
546 test_to_vec_wrap(AllocRingBuffer::new(2));
547 test_to_vec_wrap(ConstGenericRingBuffer::<i32, 2>::new());
548
549 let mut b = GrowableAllocRingBuffer::with_capacity(2);
551
552 let _ = b.enqueue(1);
553 let _ = b.enqueue(2);
554 let _ = b.enqueue(3);
555
556 assert_eq!(vec![1, 2, 3], b.to_vec());
557 }
558
559 #[test]
560 fn run_test_index() {
561 fn test_index(mut b: impl RingBuffer<i32>) {
562 let _ = b.enqueue(2);
563 assert_eq!(b[0], 2);
564 }
565
566 test_index(AllocRingBuffer::new(8));
567 test_index(GrowableAllocRingBuffer::with_capacity(8));
568 test_index(ConstGenericRingBuffer::<i32, 8>::new());
569 }
570
571 #[test]
572 fn run_test_get() {
573 fn test_index(mut b: impl RingBuffer<i32>) {
574 let _ = b.enqueue(0);
575 let _ = b.enqueue(1);
576 let _ = b.enqueue(2);
577 let _ = b.enqueue(3);
578 let _ = b.enqueue(4);
579 let _ = b.enqueue(5);
580 let _ = b.enqueue(6);
581 let _ = b.enqueue(7);
582
583 assert_eq!(b.get(0), Some(&0));
584 assert_eq!(b.get(1), Some(&1));
585 assert_eq!(b.get(2), Some(&2));
586 assert_eq!(b.get(3), Some(&3));
587 assert_eq!(b.get(4), Some(&4));
588 assert_eq!(b.get(5), Some(&5));
589 assert_eq!(b.get(6), Some(&6));
590 assert_eq!(b.get(7), Some(&7));
591 }
592
593 test_index(AllocRingBuffer::new(8));
594 test_index(GrowableAllocRingBuffer::with_capacity(8));
595 test_index(ConstGenericRingBuffer::<i32, 8>::new());
596 }
597
598 #[test]
599 fn run_test_index_mut() {
600 fn test_index_mut(mut b: impl RingBuffer<i32>) {
601 let _ = b.enqueue(2);
602
603 assert_eq!(b[0], 2);
604
605 b[0] = 5;
606
607 assert_eq!(b[0], 5);
608 }
609
610 test_index_mut(AllocRingBuffer::new(8));
611 test_index_mut(GrowableAllocRingBuffer::with_capacity(8));
612 test_index_mut(ConstGenericRingBuffer::<i32, 8>::new());
613 }
614
615 #[test]
616 fn run_test_peek_some() {
617 fn test_peek_some(mut b: impl RingBuffer<i32>) {
618 let _ = b.enqueue(1);
619 let _ = b.enqueue(2);
620
621 assert_eq!(b.peek(), Some(&1));
622 }
623
624 test_peek_some(AllocRingBuffer::new(2));
625 test_peek_some(GrowableAllocRingBuffer::with_capacity(2));
626 test_peek_some(ConstGenericRingBuffer::<i32, 2>::new());
627 }
628
629 #[test]
630 fn run_test_peek_none() {
631 fn test_peek_none(b: impl RingBuffer<i32>) {
632 assert_eq!(b.peek(), None);
633 }
634
635 test_peek_none(AllocRingBuffer::new(8));
636 test_peek_none(GrowableAllocRingBuffer::with_capacity(8));
637 test_peek_none(ConstGenericRingBuffer::<i32, 8>::new());
638 }
639
640 #[test]
641 fn run_test_get_relative() {
642 fn test_get_relative(mut b: impl RingBuffer<i32>) {
643 let _ = b.enqueue(0);
644 let _ = b.enqueue(1);
645
646 assert_eq!(b.get(0).unwrap(), &0);
648 assert_eq!(b.get(1).unwrap(), &1);
649
650 assert_eq!(b.get(2).unwrap(), &0);
652 assert_eq!(b.get(3).unwrap(), &1);
653 }
654
655 test_get_relative(AllocRingBuffer::new(8));
656 test_get_relative(GrowableAllocRingBuffer::with_capacity(8));
657 test_get_relative(ConstGenericRingBuffer::<i32, 8>::new());
658 }
659
660 #[test]
661 fn run_test_wrapping_get_relative() {
662 fn test_wrapping_get_relative(mut b: impl RingBuffer<i32>) {
663 let _ = b.enqueue(0);
664 let _ = b.enqueue(1);
665 let _ = b.enqueue(2);
666
667 assert_eq!(b.get(0).unwrap(), &1);
676 assert_eq!(b.get(1).unwrap(), &2);
677 }
678
679 test_wrapping_get_relative(AllocRingBuffer::new(2));
680 test_wrapping_get_relative(ConstGenericRingBuffer::<i32, 2>::new());
681
682 let mut b = GrowableAllocRingBuffer::with_capacity(2);
684 let _ = b.enqueue(0);
685 let _ = b.enqueue(1);
686 let _ = b.enqueue(2);
687
688 assert_eq!(b.get(0).unwrap(), &0);
689 assert_eq!(b.get(1).unwrap(), &1);
690 assert_eq!(b.get(2).unwrap(), &2);
691 }
692
693 #[test]
694 fn run_test_get_relative_zero_length() {
695 fn test_get_relative_zero_length(b: impl RingBuffer<i32>) {
696 assert!(b.get(1).is_none());
697 }
698
699 test_get_relative_zero_length(AllocRingBuffer::new(8));
700 test_get_relative_zero_length(GrowableAllocRingBuffer::with_capacity(8));
701 test_get_relative_zero_length(ConstGenericRingBuffer::<i32, 8>::new());
702 }
703
704 #[test]
705 fn run_test_get_relative_mut() {
706 fn test_get_relative_mut(mut b: impl RingBuffer<i32>) {
707 let _ = b.enqueue(0);
708 let _ = b.enqueue(1);
709
710 *b.get_mut(0).unwrap() = 3;
717 *b.get_mut(1).unwrap() = 4;
718
719 assert_eq!(b.get(0).unwrap(), &3);
720 assert_eq!(b.get(1).unwrap(), &4);
721 }
722
723 test_get_relative_mut(AllocRingBuffer::new(8));
724 test_get_relative_mut(GrowableAllocRingBuffer::with_capacity(8));
725 test_get_relative_mut(ConstGenericRingBuffer::<i32, 8>::new());
726 }
727
728 #[test]
729 fn run_test_wrapping_get_relative_mut() {
730 fn test_wrapping_get_relative_mut(mut b: impl RingBuffer<i32>) {
731 let _ = b.enqueue(0);
732 let _ = b.enqueue(1);
733 let _ = b.enqueue(2);
734
735 *b.get_mut(0).unwrap() = 3;
736
737 assert_eq!(b.get(0).unwrap(), &3);
746 assert_eq!(b.get(1).unwrap(), &2);
747 }
748
749 test_wrapping_get_relative_mut(AllocRingBuffer::new(2));
750 test_wrapping_get_relative_mut(ConstGenericRingBuffer::<i32, 2>::new());
751
752 let mut b = GrowableAllocRingBuffer::with_capacity(2);
754
755 let _ = b.enqueue(0);
756 let _ = b.enqueue(1);
757 let _ = b.enqueue(2);
758
759 *b.get_mut(0).unwrap() = 3;
760
761 assert_eq!(b.get(0).unwrap(), &3);
762 assert_eq!(b.get(1).unwrap(), &1);
763 assert_eq!(b.get(2).unwrap(), &2);
764 }
765
766 #[test]
767 fn run_test_get_relative_mut_zero_length() {
768 fn test_get_relative_mut_zero_length(mut b: impl RingBuffer<i32>) {
769 assert!(b.get_mut(1).is_none());
770 }
771
772 test_get_relative_mut_zero_length(AllocRingBuffer::new(8));
773 test_get_relative_mut_zero_length(GrowableAllocRingBuffer::with_capacity(8));
774 test_get_relative_mut_zero_length(ConstGenericRingBuffer::<i32, 8>::new());
775 }
776
777 #[test]
778 fn run_test_from_iterator() {
779 fn test_from_iterator<T: RingBuffer<i32> + FromIterator<i32>>() {
780 let b: T = std::iter::repeat(1).take(1024).collect();
781 assert_eq!(b.len(), 1024);
782 assert_eq!(b.to_vec(), vec![1; 1024]);
783 }
784
785 test_from_iterator::<GrowableAllocRingBuffer<i32>>();
786 test_from_iterator::<ConstGenericRingBuffer<i32, 1024>>();
787 }
788
789 #[test]
790 fn run_test_from_iterator_wrap() {
791 fn test_from_iterator_wrap<T: RingBuffer<i32> + FromIterator<i32>>() {
792 let b: T = std::iter::repeat(1).take(8000).collect();
793 assert_eq!(b.len(), b.capacity());
794 assert_eq!(b.to_vec(), vec![1; b.capacity()]);
795 }
796
797 test_from_iterator_wrap::<GrowableAllocRingBuffer<i32>>();
798 test_from_iterator_wrap::<ConstGenericRingBuffer<i32, 1024>>();
799 }
800
801 #[test]
802 fn run_test_get_relative_negative() {
803 fn test_get_relative_negative(mut b: impl RingBuffer<i32>) {
804 let _ = b.enqueue(0);
805 let _ = b.enqueue(1);
806
807 assert_eq!(b.get_signed(-1).unwrap(), &1);
814 assert_eq!(b.get_signed(-2).unwrap(), &0);
815
816 assert_eq!(b.get_signed(-3).unwrap(), &1);
818 assert_eq!(b.get_signed(-4).unwrap(), &0);
819 }
820
821 test_get_relative_negative(AllocRingBuffer::new(8));
822 test_get_relative_negative(ConstGenericRingBuffer::<i32, 8>::new());
823 }
824
825 #[test]
826 fn run_test_contains() {
827 fn test_contains(mut b: impl RingBuffer<i32>) {
828 let _ = b.enqueue(1);
829 let _ = b.enqueue(2);
830
831 assert!(b.contains(&1));
832 assert!(b.contains(&2));
833 }
834
835 test_contains(AllocRingBuffer::new(8));
836 test_contains(GrowableAllocRingBuffer::with_capacity(8));
837 test_contains(ConstGenericRingBuffer::<i32, 8>::new());
838 }
839
840 #[test]
841 fn run_test_is_full() {
842 fn test_is_full(mut b: impl RingBuffer<i32>) {
843 assert!(!b.is_full());
844 let _ = b.enqueue(1);
845 assert!(!b.is_full());
846 let _ = b.enqueue(2);
847 assert!(b.is_full());
848 }
849
850 test_is_full(AllocRingBuffer::new(2));
851 test_is_full(GrowableAllocRingBuffer::with_capacity(2));
852 test_is_full(ConstGenericRingBuffer::<i32, 2>::new());
853 }
854
855 #[test]
856 fn run_test_front_some() {
857 fn test_front_some(mut b: impl RingBuffer<i32>) {
858 let _ = b.enqueue(1);
859 let _ = b.enqueue(2);
860
861 assert_eq!(b.front(), Some(&1));
862 }
863
864 test_front_some(AllocRingBuffer::new(2));
865 test_front_some(GrowableAllocRingBuffer::with_capacity(2));
866 test_front_some(ConstGenericRingBuffer::<i32, 2>::new());
867 }
868
869 #[test]
870 fn run_test_front_none() {
871 fn test_front_none(b: impl RingBuffer<i32>) {
872 assert_eq!(b.front(), None);
873 }
874
875 test_front_none(AllocRingBuffer::new(8));
876 test_front_none(GrowableAllocRingBuffer::with_capacity(8));
877 test_front_none(ConstGenericRingBuffer::<i32, 8>::new());
878 }
879
880 #[test]
881 fn run_test_back_some() {
882 fn test_back_some(mut b: impl RingBuffer<i32>) {
883 let _ = b.enqueue(1);
884 let _ = b.enqueue(2);
885
886 assert_eq!(b.back(), Some(&2));
887 }
888
889 test_back_some(AllocRingBuffer::new(2));
890 test_back_some(GrowableAllocRingBuffer::with_capacity(2));
891 test_back_some(ConstGenericRingBuffer::<i32, 2>::new());
892 }
893
894 #[test]
895 fn run_test_back_none() {
896 fn test_back_none(b: impl RingBuffer<i32>) {
897 assert_eq!(b.back(), None);
898 }
899
900 test_back_none(AllocRingBuffer::new(8));
901 test_back_none(GrowableAllocRingBuffer::with_capacity(8));
902 test_back_none(ConstGenericRingBuffer::<i32, 8>::new());
903 }
904
905 #[test]
906 fn run_test_front_some_mut() {
907 fn test_front_some_mut(mut b: impl RingBuffer<i32>) {
908 let _ = b.enqueue(1);
909 let _ = b.enqueue(2);
910
911 assert_eq!(b.front_mut(), Some(&mut 1));
912 }
913
914 test_front_some_mut(AllocRingBuffer::new(2));
915 test_front_some_mut(GrowableAllocRingBuffer::with_capacity(2));
916 test_front_some_mut(ConstGenericRingBuffer::<i32, 2>::new());
917 }
918
919 #[test]
920 fn run_test_front_none_mut() {
921 fn test_front_none_mut(mut b: impl RingBuffer<i32>) {
922 assert_eq!(b.front_mut(), None);
923 }
924
925 test_front_none_mut(AllocRingBuffer::new(8));
926 test_front_none_mut(GrowableAllocRingBuffer::with_capacity(8));
927 test_front_none_mut(ConstGenericRingBuffer::<i32, 8>::new());
928 }
929
930 #[test]
931 fn run_test_back_some_mut() {
932 fn test_back_some_mut(mut b: impl RingBuffer<i32>) {
933 let _ = b.enqueue(1);
934 let _ = b.enqueue(2);
935
936 assert_eq!(b.back_mut(), Some(&mut 2));
937 }
938
939 test_back_some_mut(AllocRingBuffer::new(2));
940 test_back_some_mut(GrowableAllocRingBuffer::with_capacity(2));
941 test_back_some_mut(ConstGenericRingBuffer::<i32, 2>::new());
942 }
943
944 #[test]
945 fn run_test_back_none_mut() {
946 fn test_back_none_mut(mut b: impl RingBuffer<i32>) {
947 assert_eq!(b.back_mut(), None);
948 }
949
950 test_back_none_mut(AllocRingBuffer::new(8));
951 test_back_none_mut(GrowableAllocRingBuffer::with_capacity(8));
952 test_back_none_mut(ConstGenericRingBuffer::<i32, 8>::new());
953 }
954
955 #[test]
956 fn run_test_dequeue() {
957 fn run_test_dequeue(mut b: impl RingBuffer<i32>) {
958 let _ = b.enqueue(0);
959 let _ = b.enqueue(1);
960
961 assert_eq!(b.len(), 2);
962
963 assert_eq!(b.dequeue(), Some(0));
964 assert_eq!(b.dequeue(), Some(1));
965
966 assert_eq!(b.len(), 0);
967
968 assert_eq!(b.dequeue(), None);
969 }
970
971 run_test_dequeue(AllocRingBuffer::new(8));
972 run_test_dequeue(GrowableAllocRingBuffer::with_capacity(8));
973 run_test_dequeue(ConstGenericRingBuffer::<i32, 8>::new());
974 }
975
976 #[test]
977 fn run_test_skip() {
978 #[allow(deprecated)]
979 fn test_skip(mut b: impl RingBuffer<i32>) {
980 let _ = b.enqueue(0);
981 let _ = b.enqueue(1);
982
983 assert_eq!(b.len(), 2);
984
985 b.skip();
986 b.skip();
987
988 assert_eq!(b.len(), 0);
989 }
990
991 test_skip(AllocRingBuffer::new(8));
992 test_skip(GrowableAllocRingBuffer::with_capacity(8));
993 test_skip(ConstGenericRingBuffer::<i32, 8>::new());
994 }
995
996 #[test]
997 fn run_test_skip_2() {
998 #[allow(deprecated)]
999 fn test_skip2(mut rb: impl RingBuffer<i32>) {
1000 rb.skip();
1001 rb.skip();
1002 rb.skip();
1003 let _ = rb.enqueue(1);
1004 assert_eq!(rb.dequeue(), Some(1));
1005 assert_eq!(rb.dequeue(), None);
1006 rb.skip();
1007 assert_eq!(rb.dequeue(), None);
1008 }
1009
1010 test_skip2(AllocRingBuffer::new(2));
1011 test_skip2(GrowableAllocRingBuffer::with_capacity(2));
1012 test_skip2(ConstGenericRingBuffer::<i32, 2>::new());
1013 }
1014
1015 #[test]
1016 #[allow(deprecated)]
1017 fn run_test_push_pop() {
1018 fn test_push_pop(mut b: impl RingBuffer<i32>) {
1019 b.push(0);
1020 b.push(1);
1021
1022 assert_eq!(b.dequeue(), Some(0));
1023 assert_eq!(b.dequeue(), Some(1));
1024 assert_eq!(b.dequeue(), None);
1025
1026 b.push(0);
1027 b.push(1);
1028
1029 assert_eq!(b.dequeue(), Some(0));
1030 assert_eq!(b.dequeue(), Some(1));
1031 assert_eq!(b.dequeue(), None);
1032 }
1033
1034 test_push_pop(AllocRingBuffer::new(8));
1035 test_push_pop(GrowableAllocRingBuffer::with_capacity(8));
1036 test_push_pop(ConstGenericRingBuffer::<i32, 8>::new());
1037 }
1038
1039 #[test]
1040 fn run_test_enqueue_dequeue_enqueue() {
1041 fn test_enqueue_dequeue_enqueue(mut b: impl RingBuffer<i32>) {
1042 let _ = b.enqueue(0);
1043 let _ = b.enqueue(1);
1044
1045 assert_eq!(b.dequeue(), Some(0));
1046 assert_eq!(b.dequeue(), Some(1));
1047 assert_eq!(b.dequeue(), None);
1048
1049 let _ = b.enqueue(0);
1050 let _ = b.enqueue(1);
1051
1052 assert_eq!(b.dequeue(), Some(0));
1053 assert_eq!(b.dequeue(), Some(1));
1054 assert_eq!(b.dequeue(), None);
1055 }
1056
1057 test_enqueue_dequeue_enqueue(AllocRingBuffer::new(8));
1058 test_enqueue_dequeue_enqueue(GrowableAllocRingBuffer::with_capacity(8));
1059 test_enqueue_dequeue_enqueue(ConstGenericRingBuffer::<i32, 8>::new());
1060 }
1061
1062 #[test]
1063 fn large_negative_index() {
1064 fn test_large_negative_index(mut b: impl RingBuffer<i32>) {
1065 let _ = b.enqueue(1);
1066 let _ = b.enqueue(2);
1067 assert_eq!(b.get_signed(1), Some(&2));
1068 assert_eq!(b.get_signed(0), Some(&1));
1069 assert_eq!(b.get_signed(-1), Some(&2));
1070 assert_eq!(b.get_signed(-2), Some(&1));
1071 assert_eq!(b.get_signed(-3), Some(&2));
1072 }
1073
1074 test_large_negative_index(AllocRingBuffer::new(2));
1075 test_large_negative_index(ConstGenericRingBuffer::<i32, 2>::new());
1076 test_large_negative_index(GrowableAllocRingBuffer::<i32>::new());
1077 }
1078
1079 #[test]
1080 fn large_negative_index_mut() {
1081 fn test_large_negative_index(mut b: impl RingBuffer<i32>) {
1082 let _ = b.enqueue(1);
1083 let _ = b.enqueue(2);
1084 assert_eq!(b.get_mut_signed(1), Some(&mut 2));
1085 assert_eq!(b.get_mut_signed(0), Some(&mut 1));
1086 assert_eq!(b.get_mut_signed(-1), Some(&mut 2));
1087 assert_eq!(b.get_mut_signed(-2), Some(&mut 1));
1088 assert_eq!(b.get_mut_signed(-3), Some(&mut 2));
1089 }
1090
1091 test_large_negative_index(AllocRingBuffer::new(2));
1092 test_large_negative_index(ConstGenericRingBuffer::<i32, 2>::new());
1093 test_large_negative_index(GrowableAllocRingBuffer::<i32>::new());
1094 }
1095
1096 #[test]
1097 fn run_test_enqueue_dequeue_enqueue_full() {
1098 fn test_enqueue_dequeue_enqueue_full(mut b: impl RingBuffer<i32>) {
1099 let _ = b.enqueue(0);
1100 let _ = b.enqueue(1);
1101 let _ = b.enqueue(2);
1102
1103 assert_eq!(b.dequeue(), Some(1));
1104 assert_eq!(b.dequeue(), Some(2));
1105 assert_eq!(b.dequeue(), None);
1106
1107 let _ = b.enqueue(0);
1108 let _ = b.enqueue(1);
1109 let _ = b.enqueue(2);
1110
1111 assert_eq!(b.dequeue(), Some(1));
1112 assert_eq!(b.dequeue(), Some(2));
1113 assert_eq!(b.dequeue(), None);
1114 }
1115
1116 test_enqueue_dequeue_enqueue_full(AllocRingBuffer::new(2));
1117 test_enqueue_dequeue_enqueue_full(ConstGenericRingBuffer::<i32, 2>::new());
1118
1119 let mut b = GrowableAllocRingBuffer::with_capacity(2);
1121 let _ = b.enqueue(0);
1122 let _ = b.enqueue(1);
1123 let _ = b.enqueue(2);
1124
1125 assert_eq!(b.dequeue(), Some(0));
1126 assert_eq!(b.dequeue(), Some(1));
1127 assert_eq!(b.dequeue(), Some(2));
1128 assert_eq!(b.dequeue(), None);
1129
1130 let _ = b.enqueue(0);
1131 let _ = b.enqueue(1);
1132 let _ = b.enqueue(2);
1133
1134 assert_eq!(b.dequeue(), Some(0));
1135 assert_eq!(b.dequeue(), Some(1));
1136 assert_eq!(b.dequeue(), Some(2));
1137 assert_eq!(b.dequeue(), None);
1138 }
1139
1140 #[test]
1141 fn run_test_enqueue_dequeue_enqueue_full_get() {
1142 fn test_enqueue_dequeue_enqueue_full_get(mut b: impl RingBuffer<i32>) {
1143 let _ = b.enqueue(0);
1144 let _ = b.enqueue(1);
1145 let _ = b.enqueue(2);
1146
1147 assert_eq!(b.dequeue(), Some(1));
1148 assert_eq!(b.dequeue(), Some(2));
1149 assert_eq!(b.dequeue(), None);
1150
1151 let _ = b.enqueue(0);
1152 let _ = b.enqueue(1);
1153 let _ = b.enqueue(2);
1154
1155 assert_eq!(b.dequeue(), Some(1));
1156 assert_eq!(b.dequeue(), Some(2));
1157 assert_eq!(b.dequeue(), None);
1158
1159 let _ = b.enqueue(0);
1160 let _ = b.enqueue(1);
1161 let _ = b.enqueue(2);
1162
1163 assert_eq!(b.get_signed(-1), Some(&2));
1164 assert_eq!(b.get_signed(-2), Some(&1));
1165 assert_eq!(b.get_signed(-3), Some(&2));
1166 }
1167
1168 test_enqueue_dequeue_enqueue_full_get(AllocRingBuffer::new(2));
1169 test_enqueue_dequeue_enqueue_full_get(ConstGenericRingBuffer::<i32, 2>::new());
1170
1171 let mut b = GrowableAllocRingBuffer::with_capacity(2);
1173
1174 let _ = b.enqueue(0);
1175 let _ = b.enqueue(1);
1176 let _ = b.enqueue(2);
1177
1178 assert_eq!(b.dequeue(), Some(0));
1179 assert_eq!(b.dequeue(), Some(1));
1180 assert_eq!(b.dequeue(), Some(2));
1181 assert_eq!(b.dequeue(), None);
1182
1183 let _ = b.enqueue(0);
1184 let _ = b.enqueue(1);
1185 let _ = b.enqueue(2);
1186
1187 assert_eq!(b.dequeue(), Some(0));
1188 assert_eq!(b.dequeue(), Some(1));
1189 assert_eq!(b.dequeue(), Some(2));
1190 assert_eq!(b.dequeue(), None);
1191
1192 let _ = b.enqueue(0);
1193 let _ = b.enqueue(1);
1194 let _ = b.enqueue(2);
1195
1196 assert_eq!(b.get_signed(-1), Some(&2));
1197 assert_eq!(b.get_signed(-2), Some(&1));
1198 assert_eq!(b.get_signed(-3), Some(&0));
1199 }
1200
1201 #[test]
1202 #[cfg_attr(miri, ignore)]
1203 fn run_test_enqueue_dequeue_enqueue_full_get_rep() {
1205 fn test_enqueue_dequeue_enqueue_full_get_rep(mut rb: impl RingBuffer<i32>) {
1206 for _ in 0..100_000 {
1207 let _ = rb.enqueue(1);
1208 let _ = rb.enqueue(2);
1209
1210 assert_eq!(rb.dequeue(), Some(1));
1211 assert_eq!(rb.dequeue(), Some(2));
1212
1213 let _ = rb.enqueue(1);
1214 let _ = rb.enqueue(2);
1215
1216 assert_eq!(rb.dequeue(), Some(1));
1217 assert_eq!(rb.dequeue(), Some(2));
1218
1219 let _ = rb.enqueue(1);
1220 let _ = rb.enqueue(2);
1221
1222 assert_eq!(rb.get_signed(-1), Some(&2));
1223 assert_eq!(rb.get_signed(-2), Some(&1));
1224 }
1225 }
1226
1227 test_enqueue_dequeue_enqueue_full_get_rep(AllocRingBuffer::new(8));
1228 test_enqueue_dequeue_enqueue_full_get_rep(GrowableAllocRingBuffer::with_capacity(8));
1229 test_enqueue_dequeue_enqueue_full_get_rep(ConstGenericRingBuffer::<i32, 8>::new());
1230 }
1231
1232 #[test]
1233 fn run_test_clone() {
1234 fn test_clone(mut rb: impl RingBuffer<i32> + Clone + Eq + Debug) {
1235 let _ = rb.enqueue(42);
1236 let _ = rb.enqueue(32);
1237 let _ = rb.enqueue(22);
1238
1239 let mut other = rb.clone();
1240
1241 assert_eq!(rb, other);
1242
1243 let _ = rb.enqueue(11);
1244 let _ = rb.enqueue(12);
1245 let _ = other.enqueue(11);
1246 let _ = other.enqueue(12);
1247
1248 assert_eq!(rb, other);
1249 }
1250
1251 test_clone(AllocRingBuffer::new(4));
1252 test_clone(GrowableAllocRingBuffer::with_capacity(4));
1253 test_clone(ConstGenericRingBuffer::<i32, 4>::new());
1254 }
1255
1256 #[test]
1257 fn run_test_default_fill() {
1258 fn test_default_fill(mut rb: impl RingBuffer<i32>) {
1259 for i in 0..rb.capacity() {
1260 for _ in 0..i {
1261 let _ = rb.enqueue(1);
1262 }
1263
1264 assert_eq!(rb.len(), i);
1265 rb.fill_default();
1266 assert_eq!(rb.len(), 4);
1267
1268 assert_eq!(rb.dequeue(), Some(0));
1270 assert_eq!(rb.dequeue(), Some(0));
1271 assert_eq!(rb.dequeue(), Some(0));
1272 assert_eq!(rb.dequeue(), Some(0));
1273 }
1274 }
1275
1276 test_default_fill(AllocRingBuffer::new(4));
1277 test_default_fill(GrowableAllocRingBuffer::with_capacity(4));
1278 test_default_fill(ConstGenericRingBuffer::<i32, 4>::new());
1279 }
1280
1281 #[test]
1282 fn run_test_eq() {
1283 let mut alloc_a = ConstGenericRingBuffer::<i32, 4>::new();
1284 let mut alloc_b = ConstGenericRingBuffer::<i32, 4>::new();
1285
1286 assert!(alloc_a.eq(&alloc_b));
1287 let _ = alloc_a.enqueue(1);
1288 assert!(!alloc_b.eq(&alloc_a));
1289 let _ = alloc_b.enqueue(1);
1290 assert!(alloc_a.eq(&alloc_b));
1291 let _ = alloc_a.enqueue(4);
1292 let _ = alloc_b.enqueue(2);
1293 assert!(!alloc_b.eq(&alloc_a));
1294 }
1295
1296 #[test]
1297 fn run_next_back_test() {
1298 fn next_back_test(mut rb: impl RingBuffer<i32>) {
1299 for i in 1..=4 {
1300 let _ = rb.enqueue(i);
1301 }
1302
1303 let mut it = rb.iter();
1304 assert_eq!(Some(&4), it.next_back());
1305 assert_eq!(Some(&3), it.next_back());
1306 assert_eq!(Some(&1), it.next());
1307 assert_eq!(Some(&2), it.next_back());
1308 assert_eq!(None, it.next_back());
1309 }
1310
1311 next_back_test(ConstGenericRingBuffer::<i32, 8>::new());
1312 next_back_test(AllocRingBuffer::new(8));
1313 next_back_test(GrowableAllocRingBuffer::with_capacity(8));
1314 }
1315
1316 #[test]
1317 fn run_next_back_test_mut() {
1318 fn next_back_test_mut(mut rb: impl RingBuffer<i32>) {
1319 for i in 1..=4 {
1320 let _ = rb.enqueue(i);
1321 }
1322
1323 let mut it = rb.iter_mut();
1324 assert_eq!(Some(&mut 4), it.next_back());
1325 assert_eq!(Some(&mut 3), it.next_back());
1326 assert_eq!(Some(&mut 1), it.next());
1327 assert_eq!(Some(&mut 2), it.next_back());
1328 assert_eq!(None, it.next_back());
1329 }
1330
1331 next_back_test_mut(ConstGenericRingBuffer::<i32, 8>::new());
1332 next_back_test_mut(AllocRingBuffer::new(8));
1333 next_back_test_mut(GrowableAllocRingBuffer::with_capacity(8));
1334 }
1335
1336 #[test]
1337 fn test_fill() {
1338 let mut b = AllocRingBuffer::from([vec![1], vec![2]]);
1339 b.fill(vec![2]);
1340 assert_eq!(b.dequeue(), Some(vec![2]));
1341 assert_eq!(b.dequeue(), Some(vec![2]));
1342 }
1343
1344 #[test]
1345 fn run_test_fill() {
1346 fn test_fill(mut rb: impl RingBuffer<i32>) {
1347 for i in 0..rb.capacity() {
1348 for _ in 0..i {
1349 let _ = rb.enqueue(1);
1350 }
1351
1352 assert_eq!(rb.len(), i);
1353 rb.fill(3);
1354 assert_eq!(rb.len(), 4);
1355
1356 assert_eq!(rb.dequeue(), Some(3));
1358 assert_eq!(rb.dequeue(), Some(3));
1359 assert_eq!(rb.dequeue(), Some(3));
1360 assert_eq!(rb.dequeue(), Some(3));
1361 }
1362 }
1363
1364 test_fill(AllocRingBuffer::new(4));
1365 test_fill(GrowableAllocRingBuffer::with_capacity(4));
1366 test_fill(ConstGenericRingBuffer::<i32, 4>::new());
1367 }
1368
1369 mod test_dropping {
1370 use super::*;
1371 use std::boxed::Box;
1372 use std::cell::{RefCell, RefMut};
1373
1374 struct DropTest {
1375 flag: bool,
1376 }
1377
1378 struct Dropee<'a> {
1379 parent: Option<RefMut<'a, DropTest>>,
1380 }
1381
1382 impl<'a> Drop for Dropee<'a> {
1383 fn drop(&mut self) {
1384 if let Some(parent) = &mut self.parent {
1385 parent.flag = true;
1386 }
1387 }
1388 }
1389
1390 macro_rules! test_dropped {
1391 ($constructor: block) => {{
1392 let dt = Box::into_raw(Box::new(RefCell::new(DropTest { flag: false })));
1393 {
1394 let d = Dropee {
1395 parent: Some(unsafe { dt.as_ref() }.unwrap().borrow_mut()),
1399 };
1400 let mut rb = { $constructor };
1401 let _ = rb.enqueue(d);
1402 let _ = rb.enqueue(Dropee { parent: None });
1403 }
1404 {
1405 assert!(unsafe { dt.as_ref() }.unwrap().borrow().flag);
1408 }
1409 unsafe {
1412 drop(Box::from_raw(dt));
1413 }
1414 }};
1415 }
1416
1417 #[test]
1418 fn run_test_drops_contents_alloc() {
1419 test_dropped!({ AllocRingBuffer::new(1) });
1420 }
1421
1422 #[test]
1423 fn run_test_drops_contents_const_generic() {
1424 test_dropped!({ ConstGenericRingBuffer::<_, 1>::new() });
1425 }
1426
1427 #[test]
1428 fn run_test_drops_contents_growable_alloc() {
1429 test_dropped!({ GrowableAllocRingBuffer::with_capacity(1) });
1430 }
1431 }
1432
1433 #[test]
1434 fn test_clone() {
1435 macro_rules! test_clone {
1436 ($e: expr) => {
1437 let mut e1 = $e;
1438 let _ = e1.enqueue(1);
1439 let _ = e1.enqueue(2);
1440
1441 let mut e2 = e1.clone();
1442
1443 let _ = e2.enqueue(11);
1444 let _ = e2.enqueue(12);
1445
1446 assert_eq!(e1.to_vec(), vec![1, 2]);
1447 assert_eq!(e2.to_vec(), vec![1, 2, 11, 12]);
1448 };
1449 }
1450
1451 test_clone!(ConstGenericRingBuffer::<_, 4>::new());
1452 test_clone!(GrowableAllocRingBuffer::<_>::new());
1453 test_clone!(AllocRingBuffer::<_>::new(4));
1454 }
1455
1456 #[test]
1457 fn iter_nth_override() {
1458 macro_rules! test_concrete {
1459 ($rb_init: expr) => {
1460 let rb = $rb_init([1, 2, 3, 4]);
1461 assert_eq!(rb.iter().nth(0), Some(&1));
1462 assert_eq!(rb.iter().nth(1), Some(&2));
1463 assert_eq!(rb.iter().nth(2), Some(&3));
1464 assert_eq!(rb.iter().nth(3), Some(&4));
1465 assert_eq!(rb.iter().nth(4), None);
1466
1467 let mut rb = $rb_init([1, 2, 3, 4]);
1468 assert_eq!(rb.iter_mut().nth(0), Some(&mut 1));
1469 assert_eq!(rb.iter_mut().nth(1), Some(&mut 2));
1470 assert_eq!(rb.iter_mut().nth(2), Some(&mut 3));
1471 assert_eq!(rb.iter_mut().nth(3), Some(&mut 4));
1472 assert_eq!(rb.iter_mut().nth(4), None);
1473
1474 let rb = $rb_init([1, 2, 3, 4]);
1475 assert_eq!(rb.clone().into_iter().nth(0), Some(1));
1476 assert_eq!(rb.clone().into_iter().nth(1), Some(2));
1477 assert_eq!(rb.clone().into_iter().nth(2), Some(3));
1478 assert_eq!(rb.clone().into_iter().nth(3), Some(4));
1479 assert_eq!(rb.clone().into_iter().nth(4), None);
1480 };
1481 }
1482
1483 test_concrete!(|values: [i32; 4]| ConstGenericRingBuffer::<_, 4>::from(values));
1484 test_concrete!(|values: [i32; 4]| GrowableAllocRingBuffer::<_>::from(values));
1485 test_concrete!(|values: [i32; 4]| AllocRingBuffer::<_>::from(values));
1486 }
1487
1488 #[test]
1489 fn iter_nth_back_override() {
1490 macro_rules! test_concrete {
1491 ($rb_init: expr) => {
1492 let rb = $rb_init([1, 2, 3, 4]);
1493 assert_eq!(rb.iter().nth_back(0), Some(&4));
1494 assert_eq!(rb.iter().nth_back(1), Some(&3));
1495 assert_eq!(rb.iter().nth_back(2), Some(&2));
1496 assert_eq!(rb.iter().nth_back(3), Some(&1));
1497 assert_eq!(rb.iter().nth_back(4), None);
1498
1499 let mut rb = $rb_init([1, 2, 3, 4]);
1500 assert_eq!(rb.iter_mut().nth_back(0), Some(&mut 4));
1501 assert_eq!(rb.iter_mut().nth_back(1), Some(&mut 3));
1502 assert_eq!(rb.iter_mut().nth_back(2), Some(&mut 2));
1503 assert_eq!(rb.iter_mut().nth_back(3), Some(&mut 1));
1504 assert_eq!(rb.iter_mut().nth_back(4), None);
1505 };
1506 }
1507
1508 test_concrete!(|values: [i32; 4]| ConstGenericRingBuffer::<_, 4>::from(values));
1509 test_concrete!(|values: [i32; 4]| GrowableAllocRingBuffer::<_>::from(values));
1510 test_concrete!(|values: [i32; 4]| AllocRingBuffer::<_>::from(values));
1511 }
1512
1513 #[test]
1514 fn test_copy_from_slice_power_of_two() {
1515 macro_rules! test_concrete {
1516 ($rb_init: expr) => {
1517 let mut rb = $rb_init([1, 2, 3, 4]);
1519 rb.copy_from_slice(0, &[5, 6, 7, 8]);
1520 assert_eq!(rb.to_vec(), alloc::vec![5, 6, 7, 8]);
1521
1522 let mut rb = $rb_init([1, 2, 3, 4]);
1524 let initial_len = rb.len();
1525 let _ = rb.enqueue(0);
1526 if rb.len() > initial_len {
1527 let _ = rb.dequeue();
1528 }
1529 rb.copy_from_slice(0, &[5, 6, 7, 8]);
1530 assert_eq!(rb.to_vec(), alloc::vec![5, 6, 7, 8]);
1531
1532 let mut rb = $rb_init([1, 2, 3, 4]);
1534 let initial_len = rb.len();
1535 for _ in 0..rb.len() {
1536 let _ = rb.enqueue(0);
1537 if rb.len() > initial_len {
1538 let _ = rb.dequeue();
1539 }
1540 }
1541 rb.copy_from_slice(0, &[5, 6, 7, 8]);
1542 assert_eq!(rb.to_vec(), alloc::vec![5, 6, 7, 8]);
1543
1544 let mut rb = $rb_init([1, 2, 3, 4]);
1546 rb.copy_from_slice(2, &[5, 6]);
1547 assert_eq!(rb.to_vec(), alloc::vec![1, 2, 5, 6]);
1548
1549 let mut rb = $rb_init([1, 2, 3, 4]);
1551 let initial_len = rb.len();
1552 let _ = rb.enqueue(0);
1553 if rb.len() > initial_len {
1554 let _ = rb.dequeue();
1555 }
1556 rb.copy_from_slice(2, &[5, 6]);
1557 assert_eq!(rb.to_vec(), alloc::vec![2, 3, 5, 6]);
1558
1559 let mut rb = $rb_init([1, 2, 3, 4]);
1561 let initial_len = rb.len();
1562 for _ in 0..rb.len() {
1563 let _ = rb.enqueue(0);
1564 if rb.len() > initial_len {
1565 let _ = rb.dequeue();
1566 }
1567 }
1568 rb.copy_from_slice(2, &[5, 6]);
1569 assert_eq!(rb.to_vec(), alloc::vec![0, 0, 5, 6]);
1570 };
1571 }
1572
1573 test_concrete!(|values: [i32; 4]| ConstGenericRingBuffer::<_, 4>::from(values));
1574 test_concrete!(|values: [i32; 4]| GrowableAllocRingBuffer::<_>::from(values));
1575 test_concrete!(|values: [i32; 4]| AllocRingBuffer::<_>::from(values));
1576 }
1577
1578 #[test]
1579 fn test_copy_from_slice_capacity_smaller_than_size() {
1580 macro_rules! test_concrete {
1581 ($rb_init: expr) => {
1582 let mut rb = $rb_init([1, 2, 3, 4, 5, 6, 7]);
1584 rb.copy_from_slice(0, &[8, 9, 10, 11, 12, 13, 14]);
1585 assert_eq!(rb.to_vec(), alloc::vec![8, 9, 10, 11, 12, 13, 14]);
1586
1587 let mut rb = $rb_init([1, 2, 3, 4, 5, 6, 7]);
1589 let initial_len = rb.len();
1590 let _ = rb.enqueue(0);
1591 if rb.len() > initial_len {
1592 let _ = rb.dequeue();
1593 }
1594 rb.copy_from_slice(0, &[8, 9, 10, 11, 12, 13, 14]);
1595 assert_eq!(rb.to_vec(), alloc::vec![8, 9, 10, 11, 12, 13, 14]);
1596
1597 let mut rb = $rb_init([1, 2, 3, 4, 5, 6, 7]);
1599 let initial_len = rb.len();
1600 for _ in 0..rb.len() {
1601 let _ = rb.enqueue(0);
1602 if rb.len() > initial_len {
1603 let _ = rb.dequeue();
1604 }
1605 }
1606 rb.copy_from_slice(0, &[8, 9, 10, 11, 12, 13, 14]);
1607 assert_eq!(rb.to_vec(), alloc::vec![8, 9, 10, 11, 12, 13, 14]);
1608
1609 let mut rb = $rb_init([1, 2, 3, 4, 5, 6, 7]);
1611 rb.copy_from_slice(2, &[8, 9, 10, 11, 12]);
1612 assert_eq!(rb.to_vec(), alloc::vec![1, 2, 8, 9, 10, 11, 12]);
1613
1614 let mut rb = $rb_init([1, 2, 3, 4, 5, 6, 7]);
1616 let initial_len = rb.len();
1617 let _ = rb.enqueue(0);
1618 if rb.len() > initial_len {
1619 let _ = rb.dequeue();
1620 }
1621 rb.copy_from_slice(2, &[8, 9, 10, 11, 12]);
1622 assert_eq!(rb.to_vec(), alloc::vec![2, 3, 8, 9, 10, 11, 12]);
1623
1624 let mut rb = $rb_init([1, 2, 3, 4, 5, 6, 7]);
1626 let initial_len = rb.len();
1627 for _ in 0..rb.len() {
1628 let _ = rb.enqueue(0);
1629 if rb.len() > initial_len {
1630 let _ = rb.dequeue();
1631 }
1632 }
1633 rb.copy_from_slice(2, &[8, 9, 10, 11, 12]);
1634 assert_eq!(rb.to_vec(), alloc::vec![0, 0, 8, 9, 10, 11, 12]);
1635 };
1636 }
1637
1638 test_concrete!(|values: [i32; 7]| ConstGenericRingBuffer::<_, 7>::from(values));
1639 test_concrete!(|values: [i32; 7]| GrowableAllocRingBuffer::<_>::from(values));
1640 test_concrete!(|values: [i32; 7]| AllocRingBuffer::<_>::from(values));
1641 }
1642
1643 #[test]
1644 fn test_copy_from_slice_non_full_rb() {
1645 macro_rules! test_concrete {
1646 ($rb_init: expr) => {
1647 let mut rb = $rb_init(&[3, 2, 1]);
1648 assert_eq!(rb.capacity(), 7);
1649 assert!(rb.len() < rb.capacity());
1651
1652 rb.copy_from_slice(0, &[1, 2, 3]);
1654 assert_eq!(rb.to_vec(), alloc::vec![1, 2, 3]);
1655
1656 let _ = rb.enqueue(4);
1657 let _ = rb.enqueue(5);
1658 let _ = rb.enqueue(6);
1659 assert_eq!(rb.to_vec(), alloc::vec![1, 2, 3, 4, 5, 6]);
1660
1661 rb.copy_from_slice(0, &[6, 5, 4, 3, 2, 1]);
1663 assert_eq!(rb.to_vec(), alloc::vec![6, 5, 4, 3, 2, 1]);
1664
1665 for i in 0..6 {
1667 let _ = rb.enqueue(i + 1);
1668 let _ = rb.dequeue();
1669 }
1670
1671 assert_eq!(rb.to_vec(), alloc::vec![1, 2, 3, 4, 5, 6]);
1673 rb.copy_from_slice(3, &[3, 2, 1]);
1675 assert_eq!(rb.to_vec(), alloc::vec![1, 2, 3, 3, 2, 1]);
1676 rb.copy_from_slice(0, &[6, 5, 4, 1, 2, 3]);
1678 assert_eq!(rb.to_vec(), alloc::vec![6, 5, 4, 1, 2, 3]);
1679 };
1680 }
1681
1682 test_concrete!(|values: &[i32]| {
1683 let mut rb = ConstGenericRingBuffer::<_, 7>::new();
1684 rb.extend(values.iter().copied());
1685 rb
1686 });
1687 test_concrete!(|values: &[i32]| {
1688 let mut rb = GrowableAllocRingBuffer::<_>::with_capacity(7);
1689 rb.extend(values.iter().copied());
1690 rb
1691 });
1692 test_concrete!(|values: &[i32]| {
1693 let mut rb = AllocRingBuffer::<_>::new(7);
1694 rb.extend(values.iter().copied());
1695 rb
1696 });
1697 }
1698
1699 #[test]
1700 fn test_copy_from_slice_empty() {
1701 macro_rules! test_concrete {
1702 ($rb_init: expr) => {
1703 let mut rb = $rb_init();
1704 rb.copy_from_slice(0, &[0; 0]);
1705 assert_eq!(rb.to_vec(), alloc::vec![]);
1706 };
1707 }
1708
1709 test_concrete!(ConstGenericRingBuffer::<i32, 1>::new);
1710 test_concrete!(|| GrowableAllocRingBuffer::<i32>::with_capacity(1));
1711 test_concrete!(|| AllocRingBuffer::<i32>::new(1));
1712 }
1713
1714 #[test]
1715 fn test_copy_to_slice_power_of_two() {
1716 macro_rules! test_concrete {
1717 ($rb_init: expr) => {
1718 let rb = $rb_init([1, 2, 3, 4]);
1720 let mut slice = [0; 4];
1721 rb.copy_to_slice(0, &mut slice);
1722 assert_eq!(slice.as_slice(), &[1, 2, 3, 4]);
1723
1724 let mut rb = $rb_init([1, 2, 3, 4]);
1726 let initial_len = rb.len();
1727 let _ = rb.enqueue(0);
1728 if rb.len() > initial_len {
1729 let _ = rb.dequeue();
1730 }
1731 let mut slice = [0; 4];
1732 rb.copy_to_slice(0, &mut slice);
1733 assert_eq!(slice.as_slice(), &[2, 3, 4, 0]);
1734
1735 let mut rb = $rb_init([4, 3, 2, 1]);
1737 let initial_len = rb.len();
1738 for i in 0..rb.len() {
1739 let _ = rb.enqueue((i + 1).try_into().unwrap());
1740 if rb.len() > initial_len {
1741 let _ = rb.dequeue();
1742 }
1743 }
1744 let mut slice = [0; 4];
1745 rb.copy_to_slice(0, &mut slice);
1746 assert_eq!(slice.as_slice(), &[1, 2, 3, 4]);
1747
1748 let rb = $rb_init([1, 2, 3, 4]);
1750 let mut slice = [0; 2];
1751 rb.copy_to_slice(2, &mut slice);
1752 assert_eq!(slice.as_slice(), &[3, 4]);
1753
1754 let mut rb = $rb_init([1, 2, 3, 4]);
1756 let initial_len = rb.len();
1757 let _ = rb.enqueue(0);
1758 if rb.len() > initial_len {
1759 let _ = rb.dequeue();
1760 }
1761 let mut slice = [0; 2];
1762 rb.copy_to_slice(2, &mut slice);
1763 assert_eq!(slice.as_slice(), &[4, 0]);
1764
1765 let mut rb = $rb_init([4, 3, 2, 1]);
1767 let initial_len = rb.len();
1768 for i in 0..rb.len() {
1769 let _ = rb.enqueue((i + 1).try_into().unwrap());
1770 if rb.len() > initial_len {
1771 let _ = rb.dequeue();
1772 }
1773 }
1774 let mut slice = [0; 2];
1775 rb.copy_to_slice(2, &mut slice);
1776 assert_eq!(slice.as_slice(), &[3, 4]);
1777 };
1778 }
1779
1780 test_concrete!(|values: [i32; 4]| ConstGenericRingBuffer::<_, 4>::from(values));
1781 test_concrete!(|values: [i32; 4]| GrowableAllocRingBuffer::<_>::from(values));
1782 test_concrete!(|values: [i32; 4]| AllocRingBuffer::<_>::from(values));
1783 }
1784
1785 #[test]
1786 fn test_copy_to_slice_capacity_smaller_than_size() {
1787 macro_rules! test_concrete {
1788 ($rb_init: expr) => {
1789 let rb = $rb_init([1, 2, 3, 4, 5, 6, 7]);
1791 let mut slice = [0; 7];
1792 rb.copy_to_slice(0, &mut slice);
1793 assert_eq!(slice.as_slice(), &[1, 2, 3, 4, 5, 6, 7]);
1794
1795 let mut rb = $rb_init([1, 2, 3, 4, 5, 6, 7]);
1797 let initial_len = rb.len();
1798 let _ = rb.enqueue(0);
1799 if rb.len() > initial_len {
1800 let _ = rb.dequeue();
1801 }
1802 let mut slice = [0; 7];
1803 rb.copy_to_slice(0, &mut slice);
1804 assert_eq!(slice.as_slice(), &[2, 3, 4, 5, 6, 7, 0]);
1805
1806 let mut rb = $rb_init([1, 2, 3, 4, 5, 6, 7]);
1808 let initial_len = rb.len();
1809 for i in 0..rb.len() {
1810 let _ = rb.enqueue((i + 1).try_into().unwrap());
1811 if rb.len() > initial_len {
1812 let _ = rb.dequeue();
1813 }
1814 }
1815 let mut slice = [0; 7];
1816 rb.copy_to_slice(0, &mut slice);
1817 assert_eq!(slice.as_slice(), &[1, 2, 3, 4, 5, 6, 7]);
1818
1819 let rb = $rb_init([1, 2, 3, 4, 5, 6, 7]);
1821 let mut slice = [0; 5];
1822 rb.copy_to_slice(2, &mut slice);
1823 assert_eq!(slice.as_slice(), &[3, 4, 5, 6, 7]);
1824
1825 let mut rb = $rb_init([1, 2, 3, 4, 5, 6, 7]);
1827 let initial_len = rb.len();
1828 let _ = rb.enqueue(0);
1829 if rb.len() > initial_len {
1830 let _ = rb.dequeue();
1831 }
1832 let mut slice = [0; 5];
1833 rb.copy_to_slice(2, &mut slice);
1834 assert_eq!(slice.as_slice(), &[4, 5, 6, 7, 0]);
1835
1836 let mut rb = $rb_init([1, 2, 3, 4, 5, 6, 7]);
1838 let initial_len = rb.len();
1839 for i in 0..rb.len() {
1840 let _ = rb.enqueue((i + 1).try_into().unwrap());
1841 if rb.len() > initial_len {
1842 let _ = rb.dequeue();
1843 }
1844 }
1845 let mut slice = [0; 5];
1846 rb.copy_to_slice(2, &mut slice);
1847 assert_eq!(slice.as_slice(), &[3, 4, 5, 6, 7]);
1848 };
1849 }
1850
1851 test_concrete!(|values: [i32; 7]| ConstGenericRingBuffer::<_, 7>::from(values));
1852 test_concrete!(|values: [i32; 7]| GrowableAllocRingBuffer::<_>::from(values));
1853 test_concrete!(|values: [i32; 7]| AllocRingBuffer::<_>::from(values));
1854 }
1855
1856 #[test]
1857 fn test_copy_to_slice_non_full_rb() {
1858 macro_rules! test_concrete {
1859 ($rb_init: expr) => {
1860 let mut rb = $rb_init(&[1, 2, 3]);
1861 assert_eq!(rb.capacity(), 7);
1862 assert!(rb.len() < rb.capacity());
1864
1865 let mut slice = [0; 3];
1867 rb.copy_to_slice(0, &mut slice);
1868 assert_eq!(slice.as_slice(), &[1, 2, 3]);
1869
1870 let _ = rb.enqueue(4);
1871 let _ = rb.enqueue(5);
1872 let _ = rb.enqueue(6);
1873 let mut slice = [0; 6];
1875 rb.copy_to_slice(0, &mut slice);
1876 assert_eq!(slice.as_slice(), &[1, 2, 3, 4, 5, 6]);
1877
1878 for i in 0..6 {
1880 let _ = rb.enqueue(i + 1);
1881 let _ = rb.dequeue();
1882 }
1883
1884 assert_eq!(rb.to_vec(), alloc::vec![1, 2, 3, 4, 5, 6]);
1886 let mut slice = [0; 6];
1888 rb.copy_to_slice(0, &mut slice);
1889 assert_eq!(slice.as_slice(), &[1, 2, 3, 4, 5, 6]);
1890 };
1891 }
1892
1893 test_concrete!(|values: &[i32]| {
1894 let mut rb = ConstGenericRingBuffer::<_, 7>::new();
1895 rb.extend(values.iter().copied());
1896 rb
1897 });
1898 test_concrete!(|values: &[i32]| {
1899 let mut rb = GrowableAllocRingBuffer::<_>::with_capacity(7);
1900 rb.extend(values.iter().copied());
1901 rb
1902 });
1903 test_concrete!(|values: &[i32]| {
1904 let mut rb = AllocRingBuffer::<_>::new(7);
1905 rb.extend(values.iter().copied());
1906 rb
1907 });
1908 }
1909
1910 #[test]
1911 fn test_copy_to_slice_empty() {
1912 macro_rules! test_concrete {
1913 ($rb_init: expr) => {
1914 let rb = $rb_init();
1915 let mut slice = [];
1916 rb.copy_to_slice(0, &mut slice);
1917 assert_eq!(slice.as_slice(), &[0; 0]);
1918 };
1919 }
1920
1921 test_concrete!(ConstGenericRingBuffer::<i32, 1>::new);
1922 test_concrete!(|| GrowableAllocRingBuffer::<i32>::with_capacity(1));
1923 test_concrete!(|| AllocRingBuffer::<i32>::new(1));
1924 }
1925
1926 #[test]
1927 fn test_set_len_primitive() {
1928 use crate::SetLen;
1929
1930 let values = [1, 2, 3, 4, 5, 6, 7, 8];
1931
1932 macro_rules! test_concrete {
1933 ($rb_init: expr) => {
1934 let mut rb = $rb_init();
1935 let initial_capacity = rb.capacity();
1936 unsafe { rb.set_len(4) };
1937 assert_eq!(rb.capacity(), initial_capacity);
1938 assert_eq!(rb.to_vec(), alloc::vec![1, 2, 3, 4]);
1939 unsafe { rb.set_len(8) };
1940 assert_eq!(rb.to_vec(), alloc::vec![1, 2, 3, 4, 5, 6, 7, 8]);
1941 };
1942 }
1943
1944 test_concrete!(|| ConstGenericRingBuffer::<i32, 8>::from(values));
1945 test_concrete!(|| AllocRingBuffer::<i32>::from(values));
1946 }
1947
1948 #[test]
1949 fn test_set_len_leak() {
1950 use crate::SetLen;
1951
1952 #[derive(Default, Clone)]
1953 struct Droppable {
1954 dropped: bool,
1955 }
1956 impl Drop for Droppable {
1957 fn drop(&mut self) {
1958 self.dropped = true;
1959 }
1960 }
1961
1962 let values = (0..8).map(|_| Droppable::default()).collect::<Vec<_>>();
1963
1964 macro_rules! test_concrete {
1965 ($rb_init: expr) => {
1966 let mut rb = $rb_init();
1967 let initial_capacity = rb.capacity();
1968 unsafe { rb.set_len(4) };
1969 assert_eq!(rb.capacity(), initial_capacity);
1970 assert!(rb.to_vec().iter().all(|item| !item.dropped));
1971 unsafe { rb.set_len(8) };
1972 assert!(rb.to_vec().iter().all(|item| !item.dropped));
1973 rb.clear();
1974 assert!(rb.to_vec().iter().all(|item| item.dropped));
1975 };
1976 }
1977
1978 test_concrete!(|| ConstGenericRingBuffer::<Droppable, 8>::from(values.clone()));
1979 test_concrete!(|| AllocRingBuffer::<Droppable>::from(values));
1980 }
1981
1982 #[test]
1983 fn test_set_len_uninit_primitive() {
1984 use crate::SetLen;
1985
1986 macro_rules! test_concrete {
1987 ($rb_init: expr) => {
1988 let mut rb = $rb_init();
1989 assert_eq!(rb.len(), 0);
1990 unsafe { rb.set_len(4) };
1991 assert_eq!(rb.len(), 4);
1992 assert_eq!(rb.to_vec(), alloc::vec![1, 2, 3, 4]);
1993 };
1994 }
1995
1996 test_concrete!(|| {
1997 let mut rb = ConstGenericRingBuffer::<i32, 8>::new();
1998 let _ = rb.buf[0].write(1);
1999 let _ = rb.buf[1].write(2);
2000 let _ = rb.buf[2].write(3);
2001 let _ = rb.buf[3].write(4);
2002 rb
2003 });
2004 test_concrete!(|| {
2005 let rb = AllocRingBuffer::<i32>::with_capacity_power_of_2(3);
2006 unsafe {
2007 *rb.buf = 1;
2008 *rb.buf.add(1) = 2;
2009 *rb.buf.add(2) = 3;
2010 *rb.buf.add(3) = 4;
2011 }
2012 rb
2013 });
2014 }
2015
2016 #[test]
2017 fn test_set_len_uninit_droppable() {
2018 use crate::SetLen;
2019
2020 #[derive(Default, Clone)]
2021 struct Droppable {
2022 dropped: bool,
2023 }
2024 impl Drop for Droppable {
2025 fn drop(&mut self) {
2026 self.dropped = true;
2027 }
2028 }
2029
2030 macro_rules! test_concrete {
2031 ($rb_init: expr) => {
2032 let mut rb = $rb_init();
2033 assert_eq!(rb.len(), 0);
2034 assert!(rb.to_vec().iter().all(|item| !item.dropped));
2035 unsafe { rb.set_len(4) };
2036 assert_eq!(rb.len(), 4);
2037 assert!(rb.to_vec().iter().all(|item| !item.dropped));
2038 rb.clear();
2039 assert!(rb.to_vec().iter().all(|item| item.dropped));
2040 };
2041 }
2042
2043 test_concrete!(|| {
2044 let mut rb = ConstGenericRingBuffer::<Droppable, 8>::new();
2045 let _ = rb.buf[0].write(Droppable::default());
2046 let _ = rb.buf[1].write(Droppable::default());
2047 let _ = rb.buf[2].write(Droppable::default());
2048 let _ = rb.buf[3].write(Droppable::default());
2049 rb
2050 });
2051 test_concrete!(|| {
2052 let rb = AllocRingBuffer::<Droppable>::with_capacity_power_of_2(3);
2053 unsafe {
2054 *rb.buf = Droppable::default();
2055 *rb.buf.add(1) = Droppable::default();
2056 *rb.buf.add(2) = Droppable::default();
2057 *rb.buf.add(3) = Droppable::default();
2058 }
2059 rb
2060 });
2061 }
2062}