ringbuffer/
lib.rs

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)] // to support older rust versions
14#![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/// Used internally. Computes the bitmask used to properly wrap the ringbuffers.
38#[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/// Used internally. Computes the bitmask used to properly wrap the ringbuffers.
46#[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        //! Test for issue #43
66
67        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            // Now we are wrapping
140            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        // the growable ringbuffer actually should grow instead of wrap
150        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            // Wrap
387            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        // the growable ringbuffer shouldn't actually stop growing
398        let mut b = GrowableAllocRingBuffer::with_capacity(2);
399
400        let _ = b.enqueue(1);
401        let _ = b.enqueue(2);
402        // No wrap
403        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        // The growable ringbuffer actually shouldn't wrap
473        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        // the growable ringbuffer actually shouldn't wrap
506        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            // Wrap
541            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        // The growable ringbuffer should actually remember all items
550        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            // get[(index + 1) % len] = 1
647            assert_eq!(b.get(0).unwrap(), &0);
648            assert_eq!(b.get(1).unwrap(), &1);
649
650            // Wraps around
651            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            // [0, ...]
668            //      ^
669            // [0, 1]
670            //  ^
671            // [2, 1]
672            //     ^
673            // get(0) == b[index] = 1
674            // get(1) == b[(index+1) % len] = 1
675            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        // the growable ringbuffer actually shouldn't wrap
683        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            // [0, ...]
711            //      ^
712            // [0, 1, ...]
713            //         ^
714            // get[(index + 0) % len] = 0 (wrap to 0 because len == 2)
715            // get[(index + 1) % len] = 1
716            *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            // [0, ...]
738            //      ^
739            // [0, 1]
740            //  ^
741            // [2, 1]
742            //     ^
743            // get(0) == b[index] = 1
744            // get(1) == b[(index+1) % len] = 1
745            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        // the growable ringbuffer actually shouldn't wrap
753        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            // [0, ...]
808            //      ^
809            // [0, 1, ...]
810            //         ^
811            // get[(index + -1) % len] = 1
812            // get[(index + -2) % len] = 0 (wrap to 1 because len == 2)
813            assert_eq!(b.get_signed(-1).unwrap(), &1);
814            assert_eq!(b.get_signed(-2).unwrap(), &0);
815
816            // Wraps around
817            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        // the growable ringbuffer should actually keep growing and dequeue all items
1120        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        // the growable ringbuffer should actually keep growing and dequeue all items
1172        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    // this test takes far too long with Miri enabled
1204    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                // 4x
1269                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                // 4x
1357                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                        // Safety:
1396                        // We know the pointer is initialized as it was created just above.
1397                        // Also no other mutable borrow can exist at this time
1398                        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                    // Safety:
1406                    // We know the pointer exists and is no longer borrowed as the block above limited it
1407                    assert!(unsafe { dt.as_ref() }.unwrap().borrow().flag);
1408                }
1409                // Safety:
1410                // No other references exist to box so we can safely drop it
1411                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                // same-sized slice
1518                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                // same-sized slice after a push
1523                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                // same-sized slice after a roundtrip
1533                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                // from offset
1545                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                // from offset after a push
1550                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                // from offset after a roundtrip
1560                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                // same-sized slice
1583                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                // same-sized slice after a push
1588                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                // same-sized slice after a roundtrip
1598                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                // from offset
1610                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                // from offset after a push
1615                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                // from offset after a roundtrip
1625                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                // we have some space left
1650                assert!(rb.len() < rb.capacity());
1651
1652                // copy preserves length
1653                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                // still preserving length
1662                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                // making sure the read/write ptrs have traversed the ring
1666                for i in 0..6 {
1667                    let _ = rb.enqueue(i + 1);
1668                    let _ = rb.dequeue();
1669                }
1670
1671                // sanity check
1672                assert_eq!(rb.to_vec(), alloc::vec![1, 2, 3, 4, 5, 6]);
1673                // copy from offset
1674                rb.copy_from_slice(3, &[3, 2, 1]);
1675                assert_eq!(rb.to_vec(), alloc::vec![1, 2, 3, 3, 2, 1]);
1676                // copy again
1677                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                // same-sized slice
1719                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                // same-sized slice after a push
1725                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                // same-sized slice after a roundtrip
1736                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                // from offset
1749                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                // from offset after a push
1755                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                // from offset after a roundtrip
1766                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                // same-sized slice
1790                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                // same-sized slice after a push
1796                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                // same-sized slice after a roundtrip
1807                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                // from offset
1820                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                // from offset after a push
1826                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                // from offset after a roundtrip
1837                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                // we have some space left
1863                assert!(rb.len() < rb.capacity());
1864
1865                // copy based on length
1866                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                // still based on length
1874                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                // making sure the read/write ptrs have traversed the ring
1879                for i in 0..6 {
1880                    let _ = rb.enqueue(i + 1);
1881                    let _ = rb.dequeue();
1882                }
1883
1884                // sanity check
1885                assert_eq!(rb.to_vec(), alloc::vec![1, 2, 3, 4, 5, 6]);
1886                // copy again
1887                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}