1#[cfg(not(feature = "std"))]
2extern crate alloc;
3
4#[cfg(not(feature = "std"))]
5use alloc::{
6 alloc::{Layout, alloc, dealloc},
7 collections::VecDeque,
8 vec::Vec,
9};
10
11#[cfg(feature = "std")]
12use std::{
13 alloc::{Layout, alloc, dealloc},
14 collections::VecDeque,
15 vec::Vec,
16};
17
18use core::marker::PhantomData;
19use core::ops::{Index, IndexMut};
20use core::{fmt, ptr};
21
22#[cfg(feature = "serde")]
23use serde::{Deserialize, Deserializer, Serialize, Serializer};
24
25pub struct ArrayDeque<T> {
49 ptr: *mut T,
51 cap: usize,
53 len: usize,
55 idx: usize,
57 _marker: PhantomData<T>,
59}
60
61impl<T> ArrayDeque<T> {
62 pub fn new(cap: usize) -> Self {
82 assert!(cap > 0, "Capacity must be greater than zero");
83
84 let layout = Layout::array::<T>(cap).expect("Invalid layout");
85 let ptr = unsafe { alloc(layout) as *mut T };
86
87 if ptr.is_null() {
88 panic!("Failed to allocate memory");
89 }
90
91 Self {
92 ptr,
93 cap,
94 len: 0,
95 idx: 0,
96 _marker: PhantomData,
97 }
98 }
99
100 pub fn push_back(&mut self, value: T) {
120 let write_idx = (self.idx + self.len) % self.cap;
121 if self.len == self.cap {
122 unsafe {
123 ptr::drop_in_place(self.ptr.add(write_idx));
124 }
125 }
126 unsafe {
127 ptr::write(self.ptr.add(write_idx), value);
128 }
129 if self.len == self.cap {
130 self.idx = (self.idx + 1) % self.cap;
131 } else {
132 self.len += 1;
133 }
134 }
135
136 pub fn push_front(&mut self, value: T) {
156 self.idx = (self.idx + self.cap - 1) % self.cap;
157 if self.len == self.cap {
158 let drop_idx = (self.idx + self.len) % self.cap;
159 unsafe {
160 ptr::drop_in_place(self.ptr.add(drop_idx));
161 }
162 } else {
163 self.len += 1;
164 }
165 unsafe {
166 ptr::write(self.ptr.add(self.idx), value);
167 }
168 }
169
170 pub fn pop_back(&mut self) -> Option<T> {
189 if self.len == 0 {
190 return None;
191 }
192 let tail_idx = (self.idx + self.len - 1) % self.cap;
193 self.len -= 1;
194 Some(unsafe { ptr::read(self.ptr.add(tail_idx)) })
195 }
196
197 pub fn pop_front(&mut self) -> Option<T> {
216 if self.len == 0 {
217 return None;
218 }
219 let front_idx = self.idx;
220 self.idx = (self.idx + 1) % self.cap;
221 self.len -= 1;
222 Some(unsafe { ptr::read(self.ptr.add(front_idx)) })
223 }
224
225 pub fn front(&self) -> Option<&T> {
238 if self.is_empty() {
239 None
240 } else {
241 Some(unsafe { &*self.ptr.add(self.idx) })
242 }
243 }
244
245 pub fn back(&self) -> Option<&T> {
258 if self.is_empty() {
259 None
260 } else {
261 let back_idx = if self.idx + self.len <= self.cap {
262 self.idx + self.len - 1
263 } else {
264 (self.idx + self.len - 1) % self.cap
265 };
266 Some(unsafe { &*self.ptr.add(back_idx) })
267 }
268 }
269
270 pub fn iter(&self) -> impl Iterator<Item = &T> {
284 (0..self.len).map(move |i| {
285 let idx = (self.idx + i) % self.cap;
286 unsafe { &*self.ptr.add(idx) }
287 })
288 }
289
290 pub fn capacity(&self) -> usize {
301 self.cap
302 }
303
304 pub fn len(&self) -> usize {
317 self.len
318 }
319
320 pub fn is_empty(&self) -> bool {
333 self.len == 0
334 }
335
336 pub fn is_full(&self) -> bool {
349 self.len == self.cap
350 }
351
352 pub fn clear(&mut self) {
367 for i in 0..self.len {
368 let idx = (self.idx + i) % self.cap;
369 unsafe {
370 ptr::drop_in_place(self.ptr.add(idx));
371 }
372 }
373 self.len = 0;
374 self.idx = 0;
375 }
376}
377
378impl<T> Drop for ArrayDeque<T> {
379 fn drop(&mut self) {
381 self.clear();
382 let layout = Layout::array::<T>(self.cap).expect("Invalid layout");
383 unsafe {
384 dealloc(self.ptr.cast(), layout);
385 }
386 }
387}
388
389impl<T: fmt::Debug> fmt::Debug for ArrayDeque<T> {
390 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
392 f.debug_list().entries(self.iter()).finish()
393 }
394}
395
396impl<T: Clone> Clone for ArrayDeque<T> {
397 fn clone(&self) -> Self {
412 let mut new = ArrayDeque::new(self.cap);
413 for item in self.iter() {
414 new.push_back(item.clone());
415 }
416 new
417 }
418}
419
420impl<T: PartialEq> PartialEq for ArrayDeque<T> {
421 fn eq(&self, other: &Self) -> bool {
424 self.len == other.len && self.iter().eq(other.iter())
425 }
426}
427
428impl<T: Eq> Eq for ArrayDeque<T> {}
429
430impl<T> Index<usize> for ArrayDeque<T> {
431 type Output = T;
432
433 fn index(&self, index: usize) -> &Self::Output {
439 assert!(index < self.len, "Index out of bounds");
440 let actual_idx = self.idx + index;
441 let actual_idx = if actual_idx >= self.cap {
442 actual_idx - self.cap
443 } else {
444 actual_idx
445 };
446 unsafe { &*self.ptr.add(actual_idx) }
447 }
448}
449
450impl<T> IndexMut<usize> for ArrayDeque<T> {
451 fn index_mut(&mut self, index: usize) -> &mut Self::Output {
457 assert!(index < self.len);
458 let idx = (self.idx + index) % self.cap;
459 unsafe { &mut *self.ptr.add(idx) }
460 }
461}
462
463impl<T> Extend<T> for ArrayDeque<T> {
464 fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
476 for item in iter {
477 self.push_back(item);
478 }
479 }
480}
481
482impl<T> FromIterator<T> for ArrayDeque<T> {
483 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
495 let vec: Vec<T> = iter.into_iter().collect();
496 let mut deque = ArrayDeque::new(vec.len().max(1));
497 deque.extend(vec);
498 deque
499 }
500}
501
502impl<T: Clone> From<&[T]> for ArrayDeque<T> {
503 fn from(slice: &[T]) -> Self {
505 let mut deque = ArrayDeque::new(slice.len().max(1));
506 for item in slice {
507 deque.push_back(item.clone());
508 }
509 deque
510 }
511}
512
513impl<T, const N: usize> From<[T; N]> for ArrayDeque<T> {
514 fn from(array: [T; N]) -> Self {
516 let mut deque = ArrayDeque::new(N.max(1));
517 for item in array {
518 deque.push_back(item);
519 }
520 deque
521 }
522}
523
524impl<T> From<Vec<T>> for ArrayDeque<T> {
525 fn from(vec: Vec<T>) -> Self {
527 let mut deque = ArrayDeque::new(vec.len().max(1));
528 for item in vec {
529 deque.push_back(item);
530 }
531 deque
532 }
533}
534
535impl<T> From<VecDeque<T>> for ArrayDeque<T> {
536 fn from(mut vec_deque: VecDeque<T>) -> Self {
538 let mut deque = ArrayDeque::new(vec_deque.len().max(1));
539 while let Some(item) = vec_deque.pop_front() {
540 deque.push_back(item);
541 }
542 deque
543 }
544}
545
546impl<T> From<ArrayDeque<T>> for VecDeque<T> {
547 fn from(deque: ArrayDeque<T>) -> Self {
549 deque.into_iter().collect()
550 }
551}
552
553impl<T: Clone> From<&ArrayDeque<T>> for VecDeque<T> {
554 fn from(deque: &ArrayDeque<T>) -> Self {
556 deque.iter().cloned().collect()
557 }
558}
559
560impl<T: Clone> From<&Vec<T>> for ArrayDeque<T> {
561 fn from(vec: &Vec<T>) -> Self {
563 let mut deque = ArrayDeque::new(vec.len().max(1));
564 for item in vec {
565 deque.push_back(item.clone());
566 }
567 deque
568 }
569}
570
571impl<T: Clone, const N: usize> From<&[T; N]> for ArrayDeque<T> {
572 fn from(array: &[T; N]) -> Self {
574 let mut deque = ArrayDeque::new(N.max(1));
575 for item in array {
576 deque.push_back(item.clone());
577 }
578 deque
579 }
580}
581
582#[cfg(feature = "serde")]
583impl<T: Serialize> Serialize for ArrayDeque<T> {
584 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
586 where
587 S: Serializer,
588 {
589 use serde::ser::SerializeSeq;
590
591 let mut seq = serializer.serialize_seq(Some(self.len))?;
592 for item in self.iter() {
593 seq.serialize_element(item)?;
594 }
595 seq.end()
596 }
597}
598
599#[cfg(feature = "serde")]
600impl<'de, T: Deserialize<'de>> Deserialize<'de> for ArrayDeque<T> {
601 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
603 where
604 D: Deserializer<'de>,
605 {
606 let vec: Vec<T> = Vec::deserialize(deserializer)?;
607 Ok(ArrayDeque::from(vec))
608 }
609}
610
611impl<T> IntoIterator for ArrayDeque<T> {
612 type Item = T;
613 type IntoIter = ArrayDequeIntoIter<T>;
614 fn into_iter(self) -> Self::IntoIter {
616 ArrayDequeIntoIter { deque: self }
617 }
618}
619
620pub struct ArrayDequeIntoIter<T> {
624 deque: ArrayDeque<T>,
625}
626
627impl<T> Iterator for ArrayDequeIntoIter<T> {
628 type Item = T;
629
630 fn next(&mut self) -> Option<T> {
632 self.deque.pop_front()
633 }
634}
635
636impl<'a, T> IntoIterator for &'a ArrayDeque<T> {
637 type Item = &'a T;
638 type IntoIter = ArrayDequeIter<'a, T>;
639 fn into_iter(self) -> Self::IntoIter {
641 ArrayDequeIter {
642 deque: self,
643 pos: 0,
644 }
645 }
646}
647
648pub struct ArrayDequeIter<'a, T> {
652 deque: &'a ArrayDeque<T>,
653 pos: usize,
654}
655
656impl<'a, T> Iterator for ArrayDequeIter<'a, T> {
657 type Item = &'a T;
658
659 fn next(&mut self) -> Option<&'a T> {
661 if self.pos >= self.deque.len {
662 return None;
663 }
664 let idx = (self.deque.idx + self.pos) % self.deque.cap;
665 self.pos += 1;
666 unsafe { Some(&*self.deque.ptr.add(idx)) }
667 }
668}
669
670impl<'a, T> ExactSizeIterator for ArrayDequeIter<'a, T> {}
671
672#[cfg(test)]
673mod tests {
674 use super::*;
675 use core::sync::atomic::{AtomicUsize, Ordering};
676
677 #[cfg(not(feature = "std"))]
678 use alloc::{sync::Arc, vec};
679 #[cfg(feature = "std")]
680 use std::sync::Arc;
681
682 #[derive(Clone)]
683 struct DropCounter {
684 drops: Arc<AtomicUsize>,
685 }
686
687 impl DropCounter {
688 fn new(drops: Arc<AtomicUsize>) -> Self {
689 Self { drops }
690 }
691 }
692
693 impl Drop for DropCounter {
694 fn drop(&mut self) {
695 self.drops.fetch_add(1, Ordering::SeqCst);
696 }
697 }
698
699 #[test]
700 fn push_pop() {
701 let mut deque = ArrayDeque::new(3);
702 deque.push_back(1);
703 deque.push_back(2);
704 deque.push_back(3);
705 assert_eq!(deque.pop_front(), Some(1));
706 assert_eq!(deque.pop_back(), Some(3));
707 assert_eq!(deque.pop_front(), Some(2));
708 assert_eq!(deque.pop_front(), None);
709 }
710
711 #[test]
712 fn push_front_back() {
713 let mut deque = ArrayDeque::new(3);
714 deque.push_front(1);
715 deque.push_front(2);
716 deque.push_back(3);
717 assert_eq!(deque.pop_front(), Some(2));
718 assert_eq!(deque.pop_back(), Some(3));
719 assert_eq!(deque.pop_front(), Some(1));
720 assert_eq!(deque.pop_front(), None);
721 }
722
723 #[test]
724 fn iter() {
725 let mut deque = ArrayDeque::new(5);
726 deque.push_back(1);
727 deque.push_back(2);
728 deque.push_back(3);
729 let mut iter = deque.iter();
730 assert_eq!(iter.next(), Some(&1));
731 assert_eq!(iter.next(), Some(&2));
732 assert_eq!(iter.next(), Some(&3));
733 assert_eq!(iter.next(), None);
734 }
735
736 #[test]
737 fn clear() {
738 let mut deque = ArrayDeque::new(3);
739 deque.push_back(1);
740 deque.push_back(2);
741 deque.clear();
742 assert!(deque.is_empty());
743 assert_eq!(deque.len(), 0);
744 }
745
746 #[test]
747 fn capacity() {
748 let deque = ArrayDeque::<i32>::new(5);
749 assert_eq!(deque.capacity(), 5);
750 assert!(deque.is_empty());
751 }
752
753 #[test]
754 fn clone() {
755 let mut deque = ArrayDeque::new(3);
756 deque.push_back(1);
757 deque.push_back(2);
758 let cloned_deque = deque.clone();
759 assert_eq!(cloned_deque.len(), 2);
760 assert_eq!(cloned_deque[0], 1);
761 assert_eq!(cloned_deque[1], 2);
762 }
763
764 #[test]
765 fn from_iter() {
766 let vec = vec![1, 2, 3];
767 let deque: ArrayDeque<_> = vec.into_iter().collect();
768 assert_eq!(deque.len(), 3);
769 assert_eq!(deque[0], 1);
770 assert_eq!(deque[1], 2);
771 assert_eq!(deque[2], 3);
772 }
773
774 #[test]
775 fn from_slice() {
776 let slice = [1, 2, 3];
777 let deque: ArrayDeque<_> = ArrayDeque::from(&slice[..]);
778 assert_eq!(deque.len(), 3);
779 assert_eq!(deque[0], 1);
780 assert_eq!(deque[1], 2);
781 assert_eq!(deque[2], 3);
782 }
783
784 #[test]
785 fn from_array() {
786 let array = [1, 2, 3];
787 let deque: ArrayDeque<_> = ArrayDeque::from(array);
788 assert_eq!(deque.len(), 3);
789 assert_eq!(deque[0], 1);
790 assert_eq!(deque[1], 2);
791 assert_eq!(deque[2], 3);
792 }
793
794 #[test]
795 fn index() {
796 let mut deque = ArrayDeque::new(5);
797 deque.push_back(1);
798 deque.push_back(2);
799 deque.push_back(3);
800 assert_eq!(deque[0], 1);
801 assert_eq!(deque[1], 2);
802 assert_eq!(deque[2], 3);
803 }
804
805 #[test]
806 #[should_panic]
807 fn index_out_of_bounds_panics() {
808 let mut deque = ArrayDeque::new(5);
809 deque.push_back(1);
810 let _ = deque[1];
811 }
812
813 #[test]
814 fn index_mut() {
815 let mut deque = ArrayDeque::new(5);
816 deque.push_back(1);
817 deque.push_back(2);
818 deque.push_back(3);
819 deque[0] = 10;
820 assert_eq!(deque[0], 10);
821 assert_eq!(deque[1], 2);
822 assert_eq!(deque[2], 3);
823 }
824
825 #[test]
826 #[should_panic]
827 fn index_mut_out_of_bounds_panics() {
828 let mut deque = ArrayDeque::new(5);
829 deque.push_back(1);
830 deque[1] = 99;
831 }
832
833 #[test]
834 fn extend() {
835 let mut deque = ArrayDeque::new(5);
836 deque.extend(vec![1, 2, 3]);
837 assert_eq!(deque.len(), 3);
838 assert_eq!(deque[0], 1);
839 assert_eq!(deque[1], 2);
840 assert_eq!(deque[2], 3);
841 }
842
843 #[test]
844 fn into_iter() {
845 let mut deque = ArrayDeque::new(5);
846 deque.push_back(1);
847 deque.push_back(2);
848 deque.push_back(3);
849 let mut iter = deque.into_iter();
850 assert_eq!(iter.next(), Some(1));
851 assert_eq!(iter.next(), Some(2));
852 assert_eq!(iter.next(), Some(3));
853 assert_eq!(iter.next(), None);
854 }
855
856 #[test]
857 fn into_iter_empty() {
858 let deque: ArrayDeque<i32> = ArrayDeque::new(5);
859 let mut iter = deque.into_iter();
860 assert_eq!(iter.next(), None);
861 }
862
863 #[test]
864 fn into_iter_full() {
865 let mut deque = ArrayDeque::new(3);
866 deque.push_back(1);
867 deque.push_back(2);
868 deque.push_back(3);
869 let mut iter = deque.into_iter();
870 assert_eq!(iter.next(), Some(1));
871 assert_eq!(iter.next(), Some(2));
872 assert_eq!(iter.next(), Some(3));
873 assert_eq!(iter.next(), None);
874 }
875
876 #[test]
877 fn into_iter_partial() {
878 let mut deque = ArrayDeque::new(5);
879 deque.push_back(1);
880 deque.push_back(2);
881 let mut iter = deque.into_iter();
882 assert_eq!(iter.next(), Some(1));
883 assert_eq!(iter.next(), Some(2));
884 assert_eq!(iter.next(), None);
885 }
886
887 #[test]
888 fn iter_empty() {
889 let deque: ArrayDeque<i32> = ArrayDeque::new(5);
890 let mut iter = deque.iter();
891 assert_eq!(iter.next(), None);
892 }
893
894 #[test]
895 fn iter_full() {
896 let mut deque = ArrayDeque::new(3);
897 deque.push_back(1);
898 deque.push_back(2);
899 deque.push_back(3);
900 let mut iter = deque.iter();
901 assert_eq!(iter.next(), Some(&1));
902 assert_eq!(iter.next(), Some(&2));
903 assert_eq!(iter.next(), Some(&3));
904 assert_eq!(iter.next(), None);
905 }
906
907 #[test]
908 fn iter_partial() {
909 let mut deque = ArrayDeque::new(5);
910 deque.push_back(1);
911 deque.push_back(2);
912 let mut iter = deque.iter();
913 assert_eq!(iter.next(), Some(&1));
914 assert_eq!(iter.next(), Some(&2));
915 assert_eq!(iter.next(), None);
916 }
917
918 #[test]
919 fn is_empty() {
920 let deque: ArrayDeque<i32> = ArrayDeque::new(5);
921 assert!(deque.is_empty());
922 assert_eq!(deque.len(), 0);
923 }
924
925 #[test]
926 fn is_full() {
927 let mut deque = ArrayDeque::new(3);
928 assert!(!deque.is_full());
929 deque.push_back(1);
930 deque.push_back(2);
931 assert!(!deque.is_full());
932 deque.push_back(3);
933 assert!(deque.is_full());
934 }
935
936 #[test]
937 fn clear_empty() {
938 let mut deque = ArrayDeque::<()>::new(3);
939 deque.clear();
940 assert!(deque.is_empty());
941 assert_eq!(deque.len(), 0);
942 }
943
944 #[test]
945 fn clear_non_empty() {
946 let mut deque = ArrayDeque::new(3);
947 deque.push_back(1);
948 deque.push_back(2);
949 deque.clear();
950 assert!(deque.is_empty());
951 assert_eq!(deque.len(), 0);
952 }
953
954 #[test]
955 fn push_back_overwrite_drops_replaced_element() {
956 let drops = Arc::new(AtomicUsize::new(0));
957 {
958 let mut deque = ArrayDeque::new(2);
959 deque.push_back(DropCounter::new(drops.clone()));
960 deque.push_back(DropCounter::new(drops.clone()));
961 deque.push_back(DropCounter::new(drops.clone()));
962
963 assert_eq!(drops.load(Ordering::SeqCst), 1);
964 }
965
966 assert_eq!(drops.load(Ordering::SeqCst), 3);
967 }
968
969 #[test]
970 fn into_iter_partial_consumption_no_double_drop() {
971 let drops = Arc::new(AtomicUsize::new(0));
972
973 {
974 let mut deque = ArrayDeque::new(2);
975 deque.push_back(DropCounter::new(drops.clone()));
976 deque.push_back(DropCounter::new(drops.clone()));
977
978 let mut iter = deque.into_iter();
979 let _first = iter.next();
980 assert_eq!(drops.load(Ordering::SeqCst), 0);
981 }
982
983 assert_eq!(drops.load(Ordering::SeqCst), 2);
984 }
985
986 #[test]
987 fn from_empty_slice_is_empty_with_min_capacity() {
988 let slice: &[i32] = &[];
989 let deque = ArrayDeque::from(slice);
990
991 assert!(deque.is_empty());
992 assert_eq!(deque.capacity(), 1);
993 }
994
995 #[test]
996 fn from_vecdeque_preserves_order_and_len() {
997 let vec_deque: VecDeque<_> = [1, 2, 3].into_iter().collect();
998 let deque = ArrayDeque::from(vec_deque);
999
1000 assert_eq!(deque.len(), 3);
1001 assert_eq!(deque[0], 1);
1002 assert_eq!(deque[1], 2);
1003 assert_eq!(deque[2], 3);
1004 }
1005
1006 #[test]
1007 fn into_vecdeque_preserves_order() {
1008 let mut deque = ArrayDeque::new(3);
1009 deque.push_back(1);
1010 deque.push_back(2);
1011 deque.push_back(3);
1012
1013 let vec_deque: VecDeque<_> = VecDeque::from(deque);
1014 assert_eq!(vec_deque.into_iter().collect::<Vec<_>>(), vec![1, 2, 3]);
1015 }
1016
1017 #[test]
1018 #[cfg(feature = "serde")]
1019 fn serde_serialize() {
1020 let mut deque = ArrayDeque::new(3);
1021 deque.push_back(1);
1022 deque.push_back(2);
1023 let serialized = serde_json::to_string(&deque).unwrap();
1024 assert_eq!(serialized, "[1,2]");
1025 }
1026
1027 #[test]
1028 #[cfg(feature = "serde")]
1029 fn serde_deserialize() {
1030 let serialized = "[1,2,3]";
1031 let deque: ArrayDeque<i32> = serde_json::from_str(serialized).unwrap();
1032 assert_eq!(deque.len(), 3);
1033 assert_eq!(deque[0], 1);
1034 assert_eq!(deque[1], 2);
1035 assert_eq!(deque[2], 3);
1036 }
1037}