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!(std::panic::catch_unwind(|| {
632 let _ = deque[3];
633 })
634 .is_err());
635 }
636
637 #[test]
638 fn index_mut() {
639 let mut deque: StackArrayDeque<i32, 5> = StackArrayDeque::new();
640 deque.push_back(1);
641 deque.push_back(2);
642 deque.push_back(3);
643 deque[0] = 10;
644 assert_eq!(deque[0], 10);
645 assert_eq!(deque[1], 2);
646 assert_eq!(deque[2], 3);
647 assert!(std::panic::catch_unwind(|| {
648 let _ = deque[3];
649 })
650 .is_err());
651 }
652
653 #[test]
654 fn iter_empty() {
655 let deque: StackArrayDeque<i32, 5> = StackArrayDeque::new();
656 let mut iter = deque.iter();
657 assert_eq!(iter.next(), None);
658 }
659
660 #[test]
661 fn iter_full() {
662 let mut deque: StackArrayDeque<i32, 3> = StackArrayDeque::new();
663 deque.push_back(1);
664 deque.push_back(2);
665 deque.push_back(3);
666 let mut iter = deque.iter();
667 assert_eq!(iter.next(), Some(&1));
668 assert_eq!(iter.next(), Some(&2));
669 assert_eq!(iter.next(), Some(&3));
670 assert_eq!(iter.next(), None);
671 }
672
673 #[test]
674 fn iter_partial() {
675 let mut deque: StackArrayDeque<i32, 5> = StackArrayDeque::new();
676 deque.push_back(1);
677 deque.push_back(2);
678 let mut iter = deque.iter();
679 assert_eq!(iter.next(), Some(&1));
680 assert_eq!(iter.next(), Some(&2));
681 assert_eq!(iter.next(), None);
682 }
683
684 #[test]
685 fn is_empty() {
686 let deque: StackArrayDeque<i32, 5> = StackArrayDeque::new();
687 assert!(deque.is_empty());
688 assert_eq!(deque.len(), 0);
689 }
690
691 #[test]
692 fn is_full() {
693 let mut deque: StackArrayDeque<i32, 3> = StackArrayDeque::new();
694 assert!(!deque.is_full());
695 deque.push_back(1);
696 deque.push_back(2);
697 assert!(!deque.is_full());
698 deque.push_back(3);
699 assert!(deque.is_full());
700 }
701
702 #[test]
703 fn clear_empty() {
704 let mut deque: StackArrayDeque<(), 3> = StackArrayDeque::new();
705 deque.clear();
706 assert!(deque.is_empty());
707 assert_eq!(deque.len(), 0);
708 }
709
710 #[test]
711 fn clear_non_empty() {
712 let mut deque: StackArrayDeque<i32, 3> = StackArrayDeque::new();
713 deque.push_back(1);
714 deque.push_back(2);
715 deque.clear();
716 assert!(deque.is_empty());
717 assert_eq!(deque.len(), 0);
718 }
719
720 #[test]
721 fn overflow_behavior_push_back() {
722 let mut deque: StackArrayDeque<i32, 3> = StackArrayDeque::new();
723 deque.push_back(1);
724 deque.push_back(2);
725 deque.push_back(3);
726 assert!(deque.is_full());
727
728 deque.push_back(4);
730 assert_eq!(deque.len(), 3);
731 assert_eq!(deque[0], 2);
732 assert_eq!(deque[1], 3);
733 assert_eq!(deque[2], 4);
734 }
735
736 #[test]
737 fn overflow_behavior_push_front() {
738 let mut deque: StackArrayDeque<i32, 3> = StackArrayDeque::new();
739 deque.push_back(1);
740 deque.push_back(2);
741 deque.push_back(3);
742 assert!(deque.is_full());
743
744 deque.push_front(0);
746 assert_eq!(deque.len(), 3);
747 assert_eq!(deque[0], 0);
748 assert_eq!(deque[1], 1);
749 assert_eq!(deque[2], 2);
750 }
751
752 #[test]
753 fn default() {
754 let deque: StackArrayDeque<i32, 5> = StackArrayDeque::default();
755 assert!(deque.is_empty());
756 assert_eq!(deque.capacity(), 5);
757 }
758
759 #[test]
760 fn debug_format() {
761 let mut deque: StackArrayDeque<i32, 3> = StackArrayDeque::new();
762 deque.push_back(1);
763 deque.push_back(2);
764 let debug_str = format!("{:?}", deque);
765 assert_eq!(debug_str, "[1, 2]");
766 }
767
768 #[test]
769 fn partial_eq() {
770 let mut deque1: StackArrayDeque<i32, 3> = StackArrayDeque::new();
771 let mut deque2: StackArrayDeque<i32, 3> = StackArrayDeque::new();
772
773 assert_eq!(deque1, deque2);
774
775 deque1.push_back(1);
776 deque1.push_back(2);
777
778 deque2.push_back(1);
779 deque2.push_back(2);
780
781 assert_eq!(deque1, deque2);
782
783 deque2.push_back(3);
784 assert_ne!(deque1, deque2);
785 }
786
787 #[test]
788 fn circular_behavior() {
789 let mut deque: StackArrayDeque<i32, 3> = StackArrayDeque::new();
790
791 deque.push_back(1);
793 deque.push_back(2);
794 deque.push_back(3);
795
796 assert_eq!(deque.pop_front(), Some(1));
798 deque.push_back(4);
799
800 assert_eq!(deque[0], 2);
801 assert_eq!(deque[1], 3);
802 assert_eq!(deque[2], 4);
803
804 assert_eq!(deque.pop_back(), Some(4));
806 deque.push_front(0);
807
808 assert_eq!(deque[0], 0);
809 assert_eq!(deque[1], 2);
810 assert_eq!(deque[2], 3);
811 }
812
813 #[test]
814 fn mixed_operations() {
815 let mut deque: StackArrayDeque<i32, 4> = StackArrayDeque::new();
816
817 deque.push_back(1);
818 deque.push_front(0);
819 deque.push_back(2);
820 deque.push_front(-1);
821
822 assert_eq!(deque.len(), 4);
823 assert!(deque.is_full());
824
825 assert_eq!(deque[0], -1);
826 assert_eq!(deque[1], 0);
827 assert_eq!(deque[2], 1);
828 assert_eq!(deque[3], 2);
829
830 assert_eq!(deque.pop_front(), Some(-1));
831 assert_eq!(deque.pop_back(), Some(2));
832 assert_eq!(deque.len(), 2);
833
834 assert_eq!(deque[0], 0);
835 assert_eq!(deque[1], 1);
836 }
837
838 #[test]
839 fn single_capacity() {
840 let mut deque: StackArrayDeque<i32, 1> = StackArrayDeque::new();
841 assert_eq!(deque.capacity(), 1);
842
843 deque.push_back(1);
844 assert_eq!(deque.len(), 1);
845 assert!(deque.is_full());
846 assert_eq!(deque[0], 1);
847
848 deque.push_back(2);
850 assert_eq!(deque.len(), 1);
851 assert_eq!(deque[0], 2);
852
853 assert_eq!(deque.pop_front(), Some(2));
854 assert!(deque.is_empty());
855 }
856}