1use core::fmt;
2use core::mem::MaybeUninit;
3use core::ops::{Index, IndexMut};
4
5#[cfg(feature = "serde")]
6use serde::{Deserialize, Deserializer, Serialize, Serializer};
7
8pub struct StackArrayDeque<T, const N: usize> {
33 data: [MaybeUninit<T>; N],
34 len: usize,
35 idx: usize,
36}
37
38impl<T, const N: usize> StackArrayDeque<T, N> {
39 pub const fn new() -> Self {
51 assert!(N > 0, "StackArrayDeque capacity must be greater than 0");
52 Self {
53 data: unsafe { MaybeUninit::uninit().assume_init() },
54 len: 0,
55 idx: 0,
56 }
57 }
58
59 pub fn push_back(&mut self, value: T) {
79 let write_idx = (self.idx + self.len) % N;
80 self.data[write_idx].write(value);
81
82 if self.len == N {
83 self.idx = (self.idx + 1) % N;
84 } else {
85 self.len += 1;
86 }
87 }
88
89 pub fn push_front(&mut self, value: T) {
109 self.idx = (self.idx + N - 1) % N;
110
111 if self.len == N {
112 let drop_idx = (self.idx + self.len) % N;
113 unsafe {
114 self.data[drop_idx].assume_init_drop();
115 }
116 } else {
117 self.len += 1;
118 }
119
120 self.data[self.idx].write(value);
121 }
122
123 pub fn pop_back(&mut self) -> Option<T> {
142 if self.len == 0 {
143 return None;
144 }
145 let tail_idx = (self.idx + self.len - 1) % N;
146 self.len -= 1;
147 Some(unsafe { self.data[tail_idx].assume_init_read() })
148 }
149
150 pub fn pop_front(&mut self) -> Option<T> {
169 if self.len == 0 {
170 return None;
171 }
172 let front_idx = self.idx;
173 self.idx = (self.idx + 1) % N;
174 self.len -= 1;
175 Some(unsafe { self.data[front_idx].assume_init_read() })
176 }
177
178 pub fn front(&self) -> Option<&T> {
191 if self.is_empty() {
192 None
193 } else {
194 Some(unsafe { self.data[self.idx].assume_init_ref() })
195 }
196 }
197
198 pub fn back(&self) -> Option<&T> {
211 if self.is_empty() {
212 None
213 } else {
214 let back_idx = (self.idx + self.len - 1) % N;
215 Some(unsafe { self.data[back_idx].assume_init_ref() })
216 }
217 }
218
219 pub fn iter(&self) -> impl Iterator<Item = &T> {
240 (0..self.len).map(move |i| {
241 let idx = (self.idx + i) % N;
242 unsafe { self.data[idx].assume_init_ref() }
243 })
244 }
245
246 pub const fn capacity(&self) -> usize {
257 N
258 }
259
260 pub const fn len(&self) -> usize {
273 self.len
274 }
275
276 pub const fn is_empty(&self) -> bool {
289 self.len == 0
290 }
291
292 pub const fn is_full(&self) -> bool {
306 self.len == N
307 }
308
309 pub fn clear(&mut self) {
327 for i in 0..self.len {
328 let idx = (self.idx + i) % N;
329 unsafe {
330 self.data[idx].assume_init_drop();
331 }
332 }
333 self.len = 0;
334 self.idx = 0;
335 }
336}
337
338impl<T, const N: usize> Drop for StackArrayDeque<T, N> {
339 fn drop(&mut self) {
341 self.clear();
342 }
343}
344
345impl<T, const N: usize> Default for StackArrayDeque<T, N> {
346 fn default() -> Self {
348 Self::new()
349 }
350}
351
352impl<T: fmt::Debug, const N: usize> fmt::Debug for StackArrayDeque<T, N> {
353 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
355 f.debug_list().entries(self.iter()).finish()
356 }
357}
358
359impl<T: Clone, const N: usize> Clone for StackArrayDeque<T, N> {
360 fn clone(&self) -> Self {
362 let mut new = StackArrayDeque::new();
363 for item in self.iter() {
364 new.push_back(item.clone());
365 }
366 new
367 }
368}
369
370impl<T: PartialEq, const N: usize> PartialEq for StackArrayDeque<T, N> {
371 fn eq(&self, other: &Self) -> bool {
373 self.len == other.len && self.iter().eq(other.iter())
374 }
375}
376
377impl<T: Eq, const N: usize> Eq for StackArrayDeque<T, N> {}
378
379impl<T, const N: usize> Index<usize> for StackArrayDeque<T, N> {
380 type Output = T;
381
382 fn index(&self, i: usize) -> &Self::Output {
390 assert!(i < self.len);
391 let idx = (self.idx + i) % N;
392 unsafe { self.data[idx].assume_init_ref() }
393 }
394}
395
396impl<T, const N: usize> IndexMut<usize> for StackArrayDeque<T, N> {
397 fn index_mut(&mut self, i: usize) -> &mut Self::Output {
403 assert!(i < self.len);
404 let idx = (self.idx + i) % N;
405 unsafe { self.data[idx].assume_init_mut() }
406 }
407}
408
409#[cfg(feature = "serde")]
410impl<T: Serialize, const N: usize> Serialize for StackArrayDeque<T, N> {
411 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
413 where
414 S: Serializer,
415 {
416 use serde::ser::SerializeSeq;
417 let mut seq = serializer.serialize_seq(Some(self.len))?;
418 for item in self.iter() {
419 seq.serialize_element(item)?;
420 }
421 seq.end()
422 }
423}
424
425#[cfg(feature = "serde")]
426impl<'de, T: Deserialize<'de>, const N: usize> Deserialize<'de> for StackArrayDeque<T, N> {
427 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
429 where
430 D: Deserializer<'de>,
431 {
432 let vec: Vec<T> = Vec::deserialize(deserializer)?;
433 if vec.len() > N {
434 return Err(serde::de::Error::custom(
435 "Too many elements for StackArrayDeque capacity",
436 ));
437 }
438 let mut deque = StackArrayDeque::new();
439 for item in vec {
440 deque.push_back(item);
441 }
442 Ok(deque)
443 }
444}
445
446impl<T, const N: usize> Extend<T> for StackArrayDeque<T, N> {
447 fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
459 for item in iter {
460 self.push_back(item);
461 }
462 }
463}
464
465impl<T, const N: usize> FromIterator<T> for StackArrayDeque<T, N> {
466 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
477 let mut dq = StackArrayDeque::new();
478 dq.extend(iter);
479 dq
480 }
481}
482
483pub struct StackArrayDequeIntoIter<T, const N: usize> {
487 deque: StackArrayDeque<T, N>,
488 pos: usize,
489}
490
491impl<T, const N: usize> Iterator for StackArrayDequeIntoIter<T, N> {
492 type Item = T;
493 fn next(&mut self) -> Option<T> {
495 if self.pos >= self.deque.len {
496 None
497 } else {
498 let idx = (self.deque.idx + self.pos) % N;
500 self.pos += 1;
501 Some(unsafe { self.deque.data[idx].assume_init_read() })
503 }
504 }
505}
506
507impl<T, const N: usize> IntoIterator for StackArrayDeque<T, N> {
508 type Item = T;
509 type IntoIter = StackArrayDequeIntoIter<T, N>;
510 fn into_iter(self) -> Self::IntoIter {
512 StackArrayDequeIntoIter {
513 deque: self,
514 pos: 0,
515 }
516 }
517}
518
519pub struct StackArrayDequeIter<'a, T, const N: usize> {
523 deque: &'a StackArrayDeque<T, N>,
524 pos: usize,
525}
526
527impl<'a, T, const N: usize> Iterator for StackArrayDequeIter<'a, T, N> {
528 type Item = &'a T;
529 fn next(&mut self) -> Option<&'a T> {
531 if self.pos >= self.deque.len {
532 None
533 } else {
534 let idx = (self.deque.idx + self.pos) % N;
535 self.pos += 1;
536 Some(unsafe { self.deque.data[idx].assume_init_ref() })
537 }
538 }
539}
540
541impl<'a, T, const N: usize> IntoIterator for &'a StackArrayDeque<T, N> {
542 type Item = &'a T;
543 type IntoIter = StackArrayDequeIter<'a, T, N>;
544 fn into_iter(self) -> Self::IntoIter {
546 StackArrayDequeIter {
547 deque: self,
548 pos: 0,
549 }
550 }
551}
552
553#[cfg(test)]
554mod tests {
555 use super::*;
556
557 #[test]
558 fn push_pop() {
559 let mut deque: StackArrayDeque<i32, 3> = StackArrayDeque::new();
560 deque.push_back(1);
561 deque.push_back(2);
562 deque.push_back(3);
563 assert_eq!(deque.pop_front(), Some(1));
564 assert_eq!(deque.pop_back(), Some(3));
565 assert_eq!(deque.pop_front(), Some(2));
566 assert_eq!(deque.pop_front(), None);
567 }
568
569 #[test]
570 fn push_front_back() {
571 let mut deque: StackArrayDeque<i32, 3> = StackArrayDeque::new();
572 deque.push_front(1);
573 deque.push_front(2);
574 deque.push_back(3);
575 assert_eq!(deque.pop_front(), Some(2));
576 assert_eq!(deque.pop_back(), Some(3));
577 assert_eq!(deque.pop_front(), Some(1));
578 assert_eq!(deque.pop_front(), None);
579 }
580
581 #[test]
582 fn iter() {
583 let mut deque: StackArrayDeque<i32, 5> = StackArrayDeque::new();
584 deque.push_back(1);
585 deque.push_back(2);
586 deque.push_back(3);
587 let mut iter = deque.iter();
588 assert_eq!(iter.next(), Some(&1));
589 assert_eq!(iter.next(), Some(&2));
590 assert_eq!(iter.next(), Some(&3));
591 assert_eq!(iter.next(), None);
592 }
593
594 #[test]
595 fn clear() {
596 let mut deque: StackArrayDeque<i32, 3> = StackArrayDeque::new();
597 deque.push_back(1);
598 deque.push_back(2);
599 deque.clear();
600 assert!(deque.is_empty());
601 assert_eq!(deque.len(), 0);
602 }
603
604 #[test]
605 fn capacity() {
606 let deque: StackArrayDeque<i32, 5> = StackArrayDeque::new();
607 assert_eq!(deque.capacity(), 5);
608 assert!(deque.is_empty());
609 }
610
611 #[test]
612 fn clone() {
613 let mut deque: StackArrayDeque<i32, 3> = StackArrayDeque::new();
614 deque.push_back(1);
615 deque.push_back(2);
616 let cloned_deque = deque.clone();
617 assert_eq!(cloned_deque.len(), 2);
618 assert_eq!(cloned_deque[0], 1);
619 assert_eq!(cloned_deque[1], 2);
620 }
621
622 #[test]
623 fn index() {
624 let mut deque: StackArrayDeque<i32, 5> = StackArrayDeque::new();
625 deque.push_back(1);
626 deque.push_back(2);
627 deque.push_back(3);
628 assert_eq!(deque[0], 1);
629 assert_eq!(deque[1], 2);
630 assert_eq!(deque[2], 3);
631 assert!(
632 std::panic::catch_unwind(|| {
633 let _ = deque[3];
634 })
635 .is_err()
636 );
637 }
638
639 #[test]
640 fn index_mut() {
641 let mut deque: StackArrayDeque<i32, 5> = StackArrayDeque::new();
642 deque.push_back(1);
643 deque.push_back(2);
644 deque.push_back(3);
645 deque[0] = 10;
646 assert_eq!(deque[0], 10);
647 assert_eq!(deque[1], 2);
648 assert_eq!(deque[2], 3);
649 assert!(
650 std::panic::catch_unwind(|| {
651 let _ = deque[3];
652 })
653 .is_err()
654 );
655 }
656
657 #[test]
658 fn iter_empty() {
659 let deque: StackArrayDeque<i32, 5> = StackArrayDeque::new();
660 let mut iter = deque.iter();
661 assert_eq!(iter.next(), None);
662 }
663
664 #[test]
665 fn iter_full() {
666 let mut deque: StackArrayDeque<i32, 3> = StackArrayDeque::new();
667 deque.push_back(1);
668 deque.push_back(2);
669 deque.push_back(3);
670 let mut iter = deque.iter();
671 assert_eq!(iter.next(), Some(&1));
672 assert_eq!(iter.next(), Some(&2));
673 assert_eq!(iter.next(), Some(&3));
674 assert_eq!(iter.next(), None);
675 }
676
677 #[test]
678 fn iter_partial() {
679 let mut deque: StackArrayDeque<i32, 5> = StackArrayDeque::new();
680 deque.push_back(1);
681 deque.push_back(2);
682 let mut iter = deque.iter();
683 assert_eq!(iter.next(), Some(&1));
684 assert_eq!(iter.next(), Some(&2));
685 assert_eq!(iter.next(), None);
686 }
687
688 #[test]
689 fn is_empty() {
690 let deque: StackArrayDeque<i32, 5> = StackArrayDeque::new();
691 assert!(deque.is_empty());
692 assert_eq!(deque.len(), 0);
693 }
694
695 #[test]
696 fn is_full() {
697 let mut deque: StackArrayDeque<i32, 3> = StackArrayDeque::new();
698 assert!(!deque.is_full());
699 deque.push_back(1);
700 deque.push_back(2);
701 assert!(!deque.is_full());
702 deque.push_back(3);
703 assert!(deque.is_full());
704 }
705
706 #[test]
707 fn clear_empty() {
708 let mut deque: StackArrayDeque<(), 3> = StackArrayDeque::new();
709 deque.clear();
710 assert!(deque.is_empty());
711 assert_eq!(deque.len(), 0);
712 }
713
714 #[test]
715 fn clear_non_empty() {
716 let mut deque: StackArrayDeque<i32, 3> = StackArrayDeque::new();
717 deque.push_back(1);
718 deque.push_back(2);
719 deque.clear();
720 assert!(deque.is_empty());
721 assert_eq!(deque.len(), 0);
722 }
723
724 #[test]
725 fn overflow_behavior_push_back() {
726 let mut deque: StackArrayDeque<i32, 3> = StackArrayDeque::new();
727 deque.push_back(1);
728 deque.push_back(2);
729 deque.push_back(3);
730 assert!(deque.is_full());
731
732 deque.push_back(4);
734 assert_eq!(deque.len(), 3);
735 assert_eq!(deque[0], 2);
736 assert_eq!(deque[1], 3);
737 assert_eq!(deque[2], 4);
738 }
739
740 #[test]
741 fn overflow_behavior_push_front() {
742 let mut deque: StackArrayDeque<i32, 3> = StackArrayDeque::new();
743 deque.push_back(1);
744 deque.push_back(2);
745 deque.push_back(3);
746 assert!(deque.is_full());
747
748 deque.push_front(0);
750 assert_eq!(deque.len(), 3);
751 assert_eq!(deque[0], 0);
752 assert_eq!(deque[1], 1);
753 assert_eq!(deque[2], 2);
754 }
755
756 #[test]
757 fn default() {
758 let deque: StackArrayDeque<i32, 5> = StackArrayDeque::default();
759 assert!(deque.is_empty());
760 assert_eq!(deque.capacity(), 5);
761 }
762
763 #[test]
764 fn debug_format() {
765 let mut deque: StackArrayDeque<i32, 3> = StackArrayDeque::new();
766 deque.push_back(1);
767 deque.push_back(2);
768 let debug_str = format!("{:?}", deque);
769 assert_eq!(debug_str, "[1, 2]");
770 }
771
772 #[test]
773 fn partial_eq() {
774 let mut deque1: StackArrayDeque<i32, 3> = StackArrayDeque::new();
775 let mut deque2: StackArrayDeque<i32, 3> = StackArrayDeque::new();
776
777 assert_eq!(deque1, deque2);
778
779 deque1.push_back(1);
780 deque1.push_back(2);
781
782 deque2.push_back(1);
783 deque2.push_back(2);
784
785 assert_eq!(deque1, deque2);
786
787 deque2.push_back(3);
788 assert_ne!(deque1, deque2);
789 }
790
791 #[test]
792 fn circular_behavior() {
793 let mut deque: StackArrayDeque<i32, 3> = StackArrayDeque::new();
794
795 deque.push_back(1);
797 deque.push_back(2);
798 deque.push_back(3);
799
800 assert_eq!(deque.pop_front(), Some(1));
802 deque.push_back(4);
803
804 assert_eq!(deque[0], 2);
805 assert_eq!(deque[1], 3);
806 assert_eq!(deque[2], 4);
807
808 assert_eq!(deque.pop_back(), Some(4));
810 deque.push_front(0);
811
812 assert_eq!(deque[0], 0);
813 assert_eq!(deque[1], 2);
814 assert_eq!(deque[2], 3);
815 }
816
817 #[test]
818 fn mixed_operations() {
819 let mut deque: StackArrayDeque<i32, 4> = StackArrayDeque::new();
820
821 deque.push_back(1);
822 deque.push_front(0);
823 deque.push_back(2);
824 deque.push_front(-1);
825
826 assert_eq!(deque.len(), 4);
827 assert!(deque.is_full());
828
829 assert_eq!(deque[0], -1);
830 assert_eq!(deque[1], 0);
831 assert_eq!(deque[2], 1);
832 assert_eq!(deque[3], 2);
833
834 assert_eq!(deque.pop_front(), Some(-1));
835 assert_eq!(deque.pop_back(), Some(2));
836 assert_eq!(deque.len(), 2);
837
838 assert_eq!(deque[0], 0);
839 assert_eq!(deque[1], 1);
840 }
841
842 #[test]
843 fn single_capacity() {
844 let mut deque: StackArrayDeque<i32, 1> = StackArrayDeque::new();
845 assert_eq!(deque.capacity(), 1);
846
847 deque.push_back(1);
848 assert_eq!(deque.len(), 1);
849 assert!(deque.is_full());
850 assert_eq!(deque[0], 1);
851
852 deque.push_back(2);
854 assert_eq!(deque.len(), 1);
855 assert_eq!(deque[0], 2);
856
857 assert_eq!(deque.pop_front(), Some(2));
858 assert!(deque.is_empty());
859 }
860}