1use core::fmt;
2use core::iter::FusedIterator;
3use core::marker::PhantomData;
4use core::mem::MaybeUninit;
5use core::{ptr, slice};
6
7pub struct Deque<T, const N: usize> {
42 buffer: [MaybeUninit<T>; N],
43
44 front: usize,
46 back: usize,
48
49 full: bool,
52}
53
54impl<T, const N: usize> Deque<T, N> {
55 const INIT: MaybeUninit<T> = MaybeUninit::uninit();
56
57 pub const fn new() -> Self {
71 crate::sealed::greater_than_0::<N>();
73
74 Self {
75 buffer: [Self::INIT; N],
76 front: 0,
77 back: 0,
78 full: false,
79 }
80 }
81
82 fn increment(i: usize) -> usize {
83 if i + 1 == N {
84 0
85 } else {
86 i + 1
87 }
88 }
89
90 fn decrement(i: usize) -> usize {
91 if i == 0 {
92 N - 1
93 } else {
94 i - 1
95 }
96 }
97
98 pub const fn capacity(&self) -> usize {
100 N
101 }
102
103 pub const fn len(&self) -> usize {
105 if self.full {
106 N
107 } else if self.back < self.front {
108 self.back + N - self.front
109 } else {
110 self.back - self.front
111 }
112 }
113
114 pub fn clear(&mut self) {
116 unsafe { self.drop_contents() }
118 self.front = 0;
119 self.back = 0;
120 self.full = false;
121 }
122
123 unsafe fn drop_contents(&mut self) {
127 let (a, b) = self.as_mut_slices();
129 ptr::drop_in_place(a);
130 ptr::drop_in_place(b);
131 }
132
133 pub fn is_empty(&self) -> bool {
135 self.front == self.back && !self.full
136 }
137
138 pub fn is_full(&self) -> bool {
140 self.full
141 }
142
143 pub fn as_slices(&self) -> (&[T], &[T]) {
145 unsafe {
147 if self.is_empty() {
148 (&[], &[])
149 } else if self.back <= self.front {
150 (
151 slice::from_raw_parts(
152 self.buffer.as_ptr().add(self.front) as *const T,
153 N - self.front,
154 ),
155 slice::from_raw_parts(self.buffer.as_ptr() as *const T, self.back),
156 )
157 } else {
158 (
159 slice::from_raw_parts(
160 self.buffer.as_ptr().add(self.front) as *const T,
161 self.back - self.front,
162 ),
163 &[],
164 )
165 }
166 }
167 }
168
169 pub fn as_mut_slices(&mut self) -> (&mut [T], &mut [T]) {
171 let ptr = self.buffer.as_mut_ptr();
172
173 unsafe {
175 if self.is_empty() {
176 (&mut [], &mut [])
177 } else if self.back <= self.front {
178 (
179 slice::from_raw_parts_mut(ptr.add(self.front) as *mut T, N - self.front),
180 slice::from_raw_parts_mut(ptr as *mut T, self.back),
181 )
182 } else {
183 (
184 slice::from_raw_parts_mut(
185 ptr.add(self.front) as *mut T,
186 self.back - self.front,
187 ),
188 &mut [],
189 )
190 }
191 }
192 }
193
194 pub fn front(&self) -> Option<&T> {
196 if self.is_empty() {
197 None
198 } else {
199 Some(unsafe { &*self.buffer.get_unchecked(self.front).as_ptr() })
200 }
201 }
202
203 pub fn front_mut(&mut self) -> Option<&mut T> {
205 if self.is_empty() {
206 None
207 } else {
208 Some(unsafe { &mut *self.buffer.get_unchecked_mut(self.front).as_mut_ptr() })
209 }
210 }
211
212 pub fn back(&self) -> Option<&T> {
214 if self.is_empty() {
215 None
216 } else {
217 let index = Self::decrement(self.back);
218 Some(unsafe { &*self.buffer.get_unchecked(index).as_ptr() })
219 }
220 }
221
222 pub fn back_mut(&mut self) -> Option<&mut T> {
224 if self.is_empty() {
225 None
226 } else {
227 let index = Self::decrement(self.back);
228 Some(unsafe { &mut *self.buffer.get_unchecked_mut(index).as_mut_ptr() })
229 }
230 }
231
232 pub fn pop_front(&mut self) -> Option<T> {
234 if self.is_empty() {
235 None
236 } else {
237 Some(unsafe { self.pop_front_unchecked() })
238 }
239 }
240
241 pub fn pop_back(&mut self) -> Option<T> {
243 if self.is_empty() {
244 None
245 } else {
246 Some(unsafe { self.pop_back_unchecked() })
247 }
248 }
249
250 pub fn push_front(&mut self, item: T) -> Result<(), T> {
254 if self.is_full() {
255 Err(item)
256 } else {
257 unsafe { self.push_front_unchecked(item) }
258 Ok(())
259 }
260 }
261
262 pub fn push_back(&mut self, item: T) -> Result<(), T> {
266 if self.is_full() {
267 Err(item)
268 } else {
269 unsafe { self.push_back_unchecked(item) }
270 Ok(())
271 }
272 }
273
274 pub unsafe fn pop_front_unchecked(&mut self) -> T {
281 debug_assert!(!self.is_empty());
282
283 let index = self.front;
284 self.full = false;
285 self.front = Self::increment(self.front);
286 (self.buffer.get_unchecked_mut(index).as_ptr() as *const T).read()
287 }
288
289 pub unsafe fn pop_back_unchecked(&mut self) -> T {
296 debug_assert!(!self.is_empty());
297
298 self.full = false;
299 self.back = Self::decrement(self.back);
300 (self.buffer.get_unchecked_mut(self.back).as_ptr() as *const T).read()
301 }
302
303 pub unsafe fn push_front_unchecked(&mut self, item: T) {
309 debug_assert!(!self.is_full());
310
311 let index = Self::decrement(self.front);
312 *self.buffer.get_unchecked_mut(index) = MaybeUninit::new(item);
315 self.front = index;
316 if self.front == self.back {
317 self.full = true;
318 }
319 }
320
321 pub unsafe fn push_back_unchecked(&mut self, item: T) {
327 debug_assert!(!self.is_full());
328
329 *self.buffer.get_unchecked_mut(self.back) = MaybeUninit::new(item);
332 self.back = Self::increment(self.back);
333 if self.front == self.back {
334 self.full = true;
335 }
336 }
337
338 pub fn iter(&self) -> Iter<'_, T, N> {
340 let done = self.is_empty();
341 Iter {
342 _phantom: PhantomData,
343 buffer: &self.buffer as *const MaybeUninit<T>,
344 front: self.front,
345 back: self.back,
346 done,
347 }
348 }
349
350 pub fn iter_mut(&mut self) -> IterMut<'_, T, N> {
352 let done = self.is_empty();
353 IterMut {
354 _phantom: PhantomData,
355 buffer: &mut self.buffer as *mut _ as *mut MaybeUninit<T>,
356 front: self.front,
357 back: self.back,
358 done,
359 }
360 }
361}
362
363impl<T, const N: usize> Default for Deque<T, N> {
366 fn default() -> Self {
367 Self::new()
368 }
369}
370
371impl<T, const N: usize> Drop for Deque<T, N> {
372 fn drop(&mut self) {
373 unsafe { self.drop_contents() }
376 }
377}
378
379impl<T: fmt::Debug, const N: usize> fmt::Debug for Deque<T, N> {
380 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
381 f.debug_list().entries(self).finish()
382 }
383}
384
385#[derive(Clone)]
390pub struct IntoIter<T, const N: usize> {
391 deque: Deque<T, N>,
392}
393
394impl<T, const N: usize> Iterator for IntoIter<T, N> {
395 type Item = T;
396 fn next(&mut self) -> Option<Self::Item> {
397 self.deque.pop_front()
398 }
399}
400
401impl<T, const N: usize> IntoIterator for Deque<T, N> {
402 type Item = T;
403 type IntoIter = IntoIter<T, N>;
404
405 fn into_iter(self) -> Self::IntoIter {
406 IntoIter { deque: self }
407 }
408}
409
410#[derive(Clone)]
414pub struct Iter<'a, T, const N: usize> {
415 buffer: *const MaybeUninit<T>,
416 _phantom: PhantomData<&'a T>,
417 front: usize,
418 back: usize,
419 done: bool,
420}
421
422impl<'a, T, const N: usize> Iterator for Iter<'a, T, N> {
423 type Item = &'a T;
424 fn next(&mut self) -> Option<Self::Item> {
425 if self.done {
426 None
427 } else {
428 let index = self.front;
429 self.front = Deque::<T, N>::increment(self.front);
430 if self.front == self.back {
431 self.done = true;
432 }
433 Some(unsafe { &*(self.buffer.add(index) as *const T) })
434 }
435 }
436
437 fn size_hint(&self) -> (usize, Option<usize>) {
438 let len = if self.done {
439 0
440 } else if self.back <= self.front {
441 self.back + N - self.front
442 } else {
443 self.back - self.front
444 };
445
446 (len, Some(len))
447 }
448}
449
450impl<'a, T, const N: usize> DoubleEndedIterator for Iter<'a, T, N> {
451 fn next_back(&mut self) -> Option<Self::Item> {
452 if self.done {
453 None
454 } else {
455 self.back = Deque::<T, N>::decrement(self.back);
456 if self.front == self.back {
457 self.done = true;
458 }
459 Some(unsafe { &*(self.buffer.add(self.back) as *const T) })
460 }
461 }
462}
463
464impl<'a, T, const N: usize> ExactSizeIterator for Iter<'a, T, N> {}
465impl<'a, T, const N: usize> FusedIterator for Iter<'a, T, N> {}
466
467pub struct IterMut<'a, T, const N: usize> {
471 buffer: *mut MaybeUninit<T>,
472 _phantom: PhantomData<&'a mut T>,
473 front: usize,
474 back: usize,
475 done: bool,
476}
477
478impl<'a, T, const N: usize> Iterator for IterMut<'a, T, N> {
479 type Item = &'a mut T;
480 fn next(&mut self) -> Option<Self::Item> {
481 if self.done {
482 None
483 } else {
484 let index = self.front;
485 self.front = Deque::<T, N>::increment(self.front);
486 if self.front == self.back {
487 self.done = true;
488 }
489 Some(unsafe { &mut *(self.buffer.add(index) as *mut T) })
490 }
491 }
492
493 fn size_hint(&self) -> (usize, Option<usize>) {
494 let len = if self.done {
495 0
496 } else if self.back <= self.front {
497 self.back + N - self.front
498 } else {
499 self.back - self.front
500 };
501
502 (len, Some(len))
503 }
504}
505
506impl<'a, T, const N: usize> DoubleEndedIterator for IterMut<'a, T, N> {
507 fn next_back(&mut self) -> Option<Self::Item> {
508 if self.done {
509 None
510 } else {
511 self.back = Deque::<T, N>::decrement(self.back);
512 if self.front == self.back {
513 self.done = true;
514 }
515 Some(unsafe { &mut *(self.buffer.add(self.back) as *mut T) })
516 }
517 }
518}
519
520impl<'a, T, const N: usize> ExactSizeIterator for IterMut<'a, T, N> {}
521impl<'a, T, const N: usize> FusedIterator for IterMut<'a, T, N> {}
522
523impl<'a, T, const N: usize> IntoIterator for &'a Deque<T, N> {
524 type Item = &'a T;
525 type IntoIter = Iter<'a, T, N>;
526
527 fn into_iter(self) -> Self::IntoIter {
528 self.iter()
529 }
530}
531
532impl<'a, T, const N: usize> IntoIterator for &'a mut Deque<T, N> {
533 type Item = &'a mut T;
534 type IntoIter = IterMut<'a, T, N>;
535
536 fn into_iter(self) -> Self::IntoIter {
537 self.iter_mut()
538 }
539}
540
541impl<T, const N: usize> Clone for Deque<T, N>
542where
543 T: Clone,
544{
545 fn clone(&self) -> Self {
546 let mut res = Deque::new();
547 for i in self {
548 unsafe { res.push_back_unchecked(i.clone()) }
551 }
552 res
553 }
554}
555
556#[cfg(test)]
557mod tests {
558 use crate::Deque;
559
560 #[test]
561 fn static_new() {
562 static mut _V: Deque<i32, 4> = Deque::new();
563 }
564
565 #[test]
566 fn stack_new() {
567 let mut _v: Deque<i32, 4> = Deque::new();
568 }
569
570 #[test]
571 fn drop() {
572 droppable!();
573
574 {
575 let mut v: Deque<Droppable, 2> = Deque::new();
576 v.push_back(Droppable::new()).ok().unwrap();
577 v.push_back(Droppable::new()).ok().unwrap();
578 v.pop_front().unwrap();
579 }
580
581 assert_eq!(Droppable::count(), 0);
582
583 {
584 let mut v: Deque<Droppable, 2> = Deque::new();
585 v.push_back(Droppable::new()).ok().unwrap();
586 v.push_back(Droppable::new()).ok().unwrap();
587 }
588
589 assert_eq!(Droppable::count(), 0);
590 {
591 let mut v: Deque<Droppable, 2> = Deque::new();
592 v.push_front(Droppable::new()).ok().unwrap();
593 v.push_front(Droppable::new()).ok().unwrap();
594 }
595
596 assert_eq!(Droppable::count(), 0);
597 }
598
599 #[test]
600 fn full() {
601 let mut v: Deque<i32, 4> = Deque::new();
602
603 v.push_back(0).unwrap();
604 v.push_front(1).unwrap();
605 v.push_back(2).unwrap();
606 v.push_back(3).unwrap();
607
608 assert!(v.push_front(4).is_err());
609 assert!(v.push_back(4).is_err());
610 assert!(v.is_full());
611 }
612
613 #[test]
614 fn empty() {
615 let mut v: Deque<i32, 4> = Deque::new();
616 assert!(v.is_empty());
617
618 v.push_back(0).unwrap();
619 assert!(!v.is_empty());
620
621 v.push_front(1).unwrap();
622 assert!(!v.is_empty());
623
624 v.pop_front().unwrap();
625 v.pop_front().unwrap();
626
627 assert!(v.pop_front().is_none());
628 assert!(v.pop_back().is_none());
629 assert!(v.is_empty());
630 }
631
632 #[test]
633 fn front_back() {
634 let mut v: Deque<i32, 4> = Deque::new();
635 assert_eq!(v.front(), None);
636 assert_eq!(v.front_mut(), None);
637 assert_eq!(v.back(), None);
638 assert_eq!(v.back_mut(), None);
639
640 v.push_back(4).unwrap();
641 assert_eq!(v.front(), Some(&4));
642 assert_eq!(v.front_mut(), Some(&mut 4));
643 assert_eq!(v.back(), Some(&4));
644 assert_eq!(v.back_mut(), Some(&mut 4));
645
646 v.push_front(3).unwrap();
647 assert_eq!(v.front(), Some(&3));
648 assert_eq!(v.front_mut(), Some(&mut 3));
649 assert_eq!(v.back(), Some(&4));
650 assert_eq!(v.back_mut(), Some(&mut 4));
651
652 v.pop_back().unwrap();
653 assert_eq!(v.front(), Some(&3));
654 assert_eq!(v.front_mut(), Some(&mut 3));
655 assert_eq!(v.back(), Some(&3));
656 assert_eq!(v.back_mut(), Some(&mut 3));
657
658 v.pop_front().unwrap();
659 assert_eq!(v.front(), None);
660 assert_eq!(v.front_mut(), None);
661 assert_eq!(v.back(), None);
662 assert_eq!(v.back_mut(), None);
663 }
664
665 #[test]
666 fn iter() {
667 let mut v: Deque<i32, 4> = Deque::new();
668
669 v.push_back(0).unwrap();
670 v.push_back(1).unwrap();
671 v.push_front(2).unwrap();
672 v.push_front(3).unwrap();
673 v.pop_back().unwrap();
674 v.push_front(4).unwrap();
675
676 let mut items = v.iter();
677
678 assert_eq!(items.next(), Some(&4));
679 assert_eq!(items.next(), Some(&3));
680 assert_eq!(items.next(), Some(&2));
681 assert_eq!(items.next(), Some(&0));
682 assert_eq!(items.next(), None);
683 }
684
685 #[test]
686 fn iter_mut() {
687 let mut v: Deque<i32, 4> = Deque::new();
688
689 v.push_back(0).unwrap();
690 v.push_back(1).unwrap();
691 v.push_front(2).unwrap();
692 v.push_front(3).unwrap();
693 v.pop_back().unwrap();
694 v.push_front(4).unwrap();
695
696 let mut items = v.iter_mut();
697
698 assert_eq!(items.next(), Some(&mut 4));
699 assert_eq!(items.next(), Some(&mut 3));
700 assert_eq!(items.next(), Some(&mut 2));
701 assert_eq!(items.next(), Some(&mut 0));
702 assert_eq!(items.next(), None);
703 }
704
705 #[test]
706 fn iter_move() {
707 let mut v: Deque<i32, 4> = Deque::new();
708 v.push_back(0).unwrap();
709 v.push_back(1).unwrap();
710 v.push_back(2).unwrap();
711 v.push_back(3).unwrap();
712
713 let mut items = v.into_iter();
714
715 assert_eq!(items.next(), Some(0));
716 assert_eq!(items.next(), Some(1));
717 assert_eq!(items.next(), Some(2));
718 assert_eq!(items.next(), Some(3));
719 assert_eq!(items.next(), None);
720 }
721
722 #[test]
723 fn iter_move_drop() {
724 droppable!();
725
726 {
727 let mut deque: Deque<Droppable, 2> = Deque::new();
728 deque.push_back(Droppable::new()).ok().unwrap();
729 deque.push_back(Droppable::new()).ok().unwrap();
730 let mut items = deque.into_iter();
731 let _ = items.next();
733 let _ = items.next();
734 }
735
736 assert_eq!(Droppable::count(), 0);
737
738 {
739 let mut deque: Deque<Droppable, 2> = Deque::new();
740 deque.push_back(Droppable::new()).ok().unwrap();
741 deque.push_back(Droppable::new()).ok().unwrap();
742 let _items = deque.into_iter();
743 }
745
746 assert_eq!(Droppable::count(), 0);
747
748 {
749 let mut deque: Deque<Droppable, 2> = Deque::new();
750 deque.push_back(Droppable::new()).ok().unwrap();
751 deque.push_back(Droppable::new()).ok().unwrap();
752 let mut items = deque.into_iter();
753 let _ = items.next(); }
755
756 assert_eq!(Droppable::count(), 0);
757 }
758
759 #[test]
760 fn push_and_pop() {
761 let mut q: Deque<i32, 4> = Deque::new();
762 assert_eq!(q.len(), 0);
763
764 assert_eq!(q.pop_front(), None);
765 assert_eq!(q.pop_back(), None);
766 assert_eq!(q.len(), 0);
767
768 q.push_back(0).unwrap();
769 assert_eq!(q.len(), 1);
770
771 assert_eq!(q.pop_back(), Some(0));
772 assert_eq!(q.len(), 0);
773
774 q.push_back(0).unwrap();
775 q.push_back(1).unwrap();
776 q.push_front(2).unwrap();
777 q.push_front(3).unwrap();
778 assert_eq!(q.len(), 4);
779
780 assert_eq!(q.pop_front(), Some(3));
782 assert_eq!(q.len(), 3);
783 assert_eq!(q.pop_front(), Some(2));
784 assert_eq!(q.len(), 2);
785 assert_eq!(q.pop_back(), Some(1));
786 assert_eq!(q.len(), 1);
787 assert_eq!(q.pop_front(), Some(0));
788 assert_eq!(q.len(), 0);
789
790 assert_eq!(q.pop_front(), None);
792 assert_eq!(q.pop_back(), None);
793 assert_eq!(q.len(), 0);
794 }
795
796 #[test]
797 fn as_slices() {
798 let mut q: Deque<i32, 4> = Deque::new();
799 assert_eq!(q.len(), 0);
800
801 q.push_back(0).unwrap();
802 q.push_back(1).unwrap();
803 q.push_back(2).unwrap();
804 q.push_back(3).unwrap();
805 assert_eq!(q.as_slices(), (&[0, 1, 2, 3][..], &[][..]));
806
807 q.pop_front().unwrap();
808 assert_eq!(q.as_slices(), (&[1, 2, 3][..], &[][..]));
809
810 q.push_back(4).unwrap();
811 assert_eq!(q.as_slices(), (&[1, 2, 3][..], &[4][..]));
812 }
813
814 #[test]
815 fn clear() {
816 let mut q: Deque<i32, 4> = Deque::new();
817 assert_eq!(q.len(), 0);
818
819 q.push_back(0).unwrap();
820 q.push_back(1).unwrap();
821 q.push_back(2).unwrap();
822 q.push_back(3).unwrap();
823 assert_eq!(q.len(), 4);
824
825 q.clear();
826 assert_eq!(q.len(), 0);
827
828 q.push_back(0).unwrap();
829 assert_eq!(q.len(), 1);
830 }
831}