array_deque/
lib.rs

1#![cfg_attr(not(feature = "std"), no_std)]
2//! A fixed-capacity circular buffer (ring buffer) implementation.
3//!
4//! This crate provides [`ArrayDeque`], a double-ended queue with a fixed capacity
5//! that uses a circular buffer for efficient operations at both ends. Unlike
6//! [`std::collections::VecDeque`], this implementation has a compile-time fixed
7//! capacity and will overwrite old elements when full.
8//!
9//! # Examples
10//!
11//! ```
12//! use array_deque::ArrayDeque;
13//!
14//! let mut deque = ArrayDeque::new(3);
15//! deque.push_back(1);
16//! deque.push_back(2);
17//! deque.push_back(3);
18//!
19//! assert_eq!(deque.pop_front(), Some(1));
20//! assert_eq!(deque.pop_back(), Some(3));
21//! ```
22//!
23//! # Features
24//!
25//! - **serde**: Enable serialization and deserialization support with serde.
26
27#[cfg(not(feature = "std"))]
28extern crate alloc;
29
30#[cfg(not(feature = "std"))]
31use alloc::{
32    alloc::{Layout, alloc, dealloc},
33    vec::Vec,
34};
35
36#[cfg(feature = "std")]
37use std::{
38    alloc::{Layout, alloc, dealloc},
39    vec::Vec,
40};
41
42use core::marker::PhantomData;
43use core::ops::{Index, IndexMut};
44use core::{fmt, ptr};
45
46#[cfg(feature = "serde")]
47use serde::{Deserialize, Deserializer, Serialize, Serializer};
48
49/// A fixed-capacity double-ended queue implemented as a circular buffer.
50///
51/// `ArrayDeque` provides efficient insertion and removal at both ends with O(1)
52/// time complexity. When the deque reaches its capacity, new elements will
53/// overwrite the oldest elements (FIFO behavior for overwrites).
54///
55/// # Examples
56///
57/// ```
58/// use array_deque::ArrayDeque;
59///
60/// let mut deque = ArrayDeque::new(3);
61/// deque.push_back(1);
62/// deque.push_back(2);
63/// deque.push_front(0);
64///
65/// assert_eq!(deque.len(), 3);
66/// assert_eq!(deque[0], 0);
67/// assert_eq!(deque[1], 1);
68/// assert_eq!(deque[2], 2);
69/// ```
70///
71/// # Capacity and Overflow Behavior
72///
73/// When the deque is full and a new element is added:
74/// - `push_back` will overwrite the front element
75/// - `push_front` will overwrite the back element
76///
77/// ```
78/// use array_deque::ArrayDeque;
79///
80/// let mut deque = ArrayDeque::new(2);
81/// deque.push_back(1);
82/// deque.push_back(2);
83/// deque.push_back(3); // Overwrites 1
84///
85/// assert_eq!(deque.pop_front(), Some(2));
86/// assert_eq!(deque.pop_front(), Some(3));
87/// ```
88pub struct ArrayDeque<T> {
89    /// Raw pointer to the allocated memory
90    ptr: *mut T,
91    /// Maximum capacity of the deque
92    cap: usize,
93    /// Current number of elements
94    len: usize,
95    /// Index of the front element
96    idx: usize,
97    /// Marker for the generic type
98    _marker: PhantomData<T>,
99}
100
101impl<T> ArrayDeque<T> {
102    /// Creates a new `ArrayDeque` with the specified capacity.
103    ///
104    /// # Arguments
105    ///
106    /// * `cap` - The fixed capacity of the deque. Must be greater than zero.
107    ///
108    /// # Panics
109    ///
110    /// Panics if `cap` is zero or if memory allocation fails.
111    ///
112    /// # Examples
113    ///
114    /// ```
115    /// use array_deque::ArrayDeque;
116    ///
117    /// let deque: ArrayDeque<i32> = ArrayDeque::new(10);
118    /// assert_eq!(deque.capacity(), 10);
119    /// assert!(deque.is_empty());
120    /// ```
121    pub fn new(cap: usize) -> Self {
122        assert!(cap > 0, "Capacity must be greater than zero");
123
124        let layout = Layout::array::<T>(cap).expect("Invalid layout");
125        let ptr = unsafe { alloc(layout) as *mut T };
126
127        if ptr.is_null() {
128            panic!("Failed to allocate memory");
129        }
130
131        Self {
132            ptr,
133            cap,
134            len: 0,
135            idx: 0,
136            _marker: PhantomData,
137        }
138    }
139
140    /// Appends an element to the back of the deque.
141    ///
142    /// If the deque is at capacity, this will overwrite the front element
143    /// and advance the front pointer.
144    ///
145    /// # Arguments
146    ///
147    /// * `value` - The element to append
148    ///
149    /// # Examples
150    ///
151    /// ```
152    /// use array_deque::ArrayDeque;
153    ///
154    /// let mut deque = ArrayDeque::new(3);
155    /// deque.push_back(1);
156    /// deque.push_back(2);
157    /// assert_eq!(deque.len(), 2);
158    /// ```
159    pub fn push_back(&mut self, value: T) {
160        let write_idx = (self.idx + self.len) % self.cap;
161        unsafe {
162            ptr::write(self.ptr.add(write_idx), value);
163        }
164        if self.len == self.cap {
165            self.idx = (self.idx + 1) % self.cap;
166        } else {
167            self.len += 1;
168        }
169    }
170
171    /// Prepends an element to the front of the deque.
172    ///
173    /// If the deque is at capacity, this will overwrite the back element.
174    ///
175    /// # Arguments
176    ///
177    /// * `value` - The element to prepend
178    ///
179    /// # Examples
180    ///
181    /// ```
182    /// use array_deque::ArrayDeque;
183    ///
184    /// let mut deque = ArrayDeque::new(3);
185    /// deque.push_front(1);
186    /// deque.push_front(2);
187    /// assert_eq!(deque[0], 2);
188    /// assert_eq!(deque[1], 1);
189    /// ```
190    pub fn push_front(&mut self, value: T) {
191        self.idx = (self.idx + self.cap - 1) % self.cap;
192        if self.len == self.cap {
193            let drop_idx = (self.idx + self.len) % self.cap;
194            unsafe {
195                ptr::drop_in_place(self.ptr.add(drop_idx));
196            }
197        } else {
198            self.len += 1;
199        }
200        unsafe {
201            ptr::write(self.ptr.add(self.idx), value);
202        }
203    }
204
205    /// Removes and returns the last element from the deque.
206    ///
207    /// # Returns
208    ///
209    /// `Some(T)` if the deque is not empty, `None` otherwise.
210    ///
211    /// # Examples
212    ///
213    /// ```
214    /// use array_deque::ArrayDeque;
215    ///
216    /// let mut deque = ArrayDeque::new(3);
217    /// deque.push_back(1);
218    /// deque.push_back(2);
219    /// assert_eq!(deque.pop_back(), Some(2));
220    /// assert_eq!(deque.pop_back(), Some(1));
221    /// assert_eq!(deque.pop_back(), None);
222    /// ```
223    pub fn pop_back(&mut self) -> Option<T> {
224        if self.len == 0 {
225            return None;
226        }
227        let tail_idx = (self.idx + self.len - 1) % self.cap;
228        self.len -= 1;
229        Some(unsafe { ptr::read(self.ptr.add(tail_idx)) })
230    }
231
232    /// Removes and returns the first element from the deque.
233    ///
234    /// # Returns
235    ///
236    /// `Some(T)` if the deque is not empty, `None` otherwise.
237    ///
238    /// # Examples
239    ///
240    /// ```
241    /// use array_deque::ArrayDeque;
242    ///
243    /// let mut deque = ArrayDeque::new(3);
244    /// deque.push_back(1);
245    /// deque.push_back(2);
246    /// assert_eq!(deque.pop_front(), Some(1));
247    /// assert_eq!(deque.pop_front(), Some(2));
248    /// assert_eq!(deque.pop_front(), None);
249    /// ```
250    pub fn pop_front(&mut self) -> Option<T> {
251        if self.len == 0 {
252            return None;
253        }
254        let front_idx = self.idx;
255        self.idx = (self.idx + 1) % self.cap;
256        self.len -= 1;
257        Some(unsafe { ptr::read(self.ptr.add(front_idx)) })
258    }
259
260    /// Returns an iterator over the elements of the deque.
261    ///
262    /// The iterator yields elements from front to back.
263    ///
264    /// # Examples
265    ///
266    /// ```
267    /// use array_deque::ArrayDeque;
268    ///
269    /// let mut deque = ArrayDeque::new(3);
270    /// deque.push_back(1);
271    /// deque.push_back(2);
272    /// deque.push_back(3);
273    ///
274    /// let mut iter = deque.iter();
275    /// assert_eq!(iter.next(), Some(&1));
276    /// assert_eq!(iter.next(), Some(&2));
277    /// assert_eq!(iter.next(), Some(&3));
278    /// assert_eq!(iter.next(), None);
279    /// ```
280    pub fn iter(&self) -> impl Iterator<Item = &T> {
281        (0..self.len).map(move |i| {
282            let idx = (self.idx + i) % self.cap;
283            unsafe { &*self.ptr.add(idx) }
284        })
285    }
286
287    /// Returns the maximum capacity of the deque.
288    ///
289    /// # Examples
290    ///
291    /// ```
292    /// use array_deque::ArrayDeque;
293    ///
294    /// let deque: ArrayDeque<i32> = ArrayDeque::new(10);
295    /// assert_eq!(deque.capacity(), 10);
296    /// ```
297    pub fn capacity(&self) -> usize {
298        self.cap
299    }
300
301    /// Returns the number of elements currently in the deque.
302    ///
303    /// # Examples
304    ///
305    /// ```
306    /// use array_deque::ArrayDeque;
307    ///
308    /// let mut deque = ArrayDeque::new(3);
309    /// assert_eq!(deque.len(), 0);
310    /// deque.push_back(1);
311    /// assert_eq!(deque.len(), 1);
312    /// ```
313    pub fn len(&self) -> usize {
314        self.len
315    }
316
317    /// Returns `true` if the deque contains no elements.
318    ///
319    /// # Examples
320    ///
321    /// ```
322    /// use array_deque::ArrayDeque;
323    ///
324    /// let mut deque = ArrayDeque::new(3);
325    /// assert!(deque.is_empty());
326    /// deque.push_back(1);
327    /// assert!(!deque.is_empty());
328    /// ```
329    pub fn is_empty(&self) -> bool {
330        self.len == 0
331    }
332
333    /// Returns `true` if the deque has reached its maximum capacity.
334    ///
335    /// # Examples
336    ///
337    /// ```
338    /// use array_deque::ArrayDeque;
339    ///
340    /// let mut deque = ArrayDeque::new(2);
341    /// assert!(!deque.is_full());
342    /// deque.push_back(1);
343    /// deque.push_back(2);
344    /// assert!(deque.is_full());
345    /// ```
346    pub fn is_full(&self) -> bool {
347        self.len == self.cap
348    }
349
350    /// Removes all elements from the deque.
351    ///
352    /// This operation properly drops all contained elements and resets
353    /// the deque to an empty state.
354    ///
355    /// # Examples
356    ///
357    /// ```
358    /// use array_deque::ArrayDeque;
359    ///
360    /// let mut deque = ArrayDeque::new(3);
361    /// deque.push_back(1);
362    /// deque.push_back(2);
363    /// deque.clear();
364    /// assert!(deque.is_empty());
365    /// assert_eq!(deque.len(), 0);
366    /// ```
367    pub fn clear(&mut self) {
368        for i in 0..self.len {
369            let idx = (self.idx + i) % self.cap;
370            unsafe {
371                ptr::drop_in_place(self.ptr.add(idx));
372            }
373        }
374        self.len = 0;
375        self.idx = 0;
376    }
377}
378
379impl<T> Drop for ArrayDeque<T> {
380    /// Properly deallocates the deque's memory and drops all contained elements.
381    fn drop(&mut self) {
382        self.clear();
383        let layout = Layout::array::<T>(self.cap).expect("Invalid layout");
384        unsafe {
385            dealloc(self.ptr.cast(), layout);
386        }
387    }
388}
389
390impl<T: fmt::Debug> fmt::Debug for ArrayDeque<T> {
391    /// Formats the deque as a debug list showing all elements from front to back.
392    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
393        f.debug_list().entries(self.iter()).finish()
394    }
395}
396
397impl<T: Clone> Clone for ArrayDeque<T> {
398    /// Creates a deep copy of the deque with the same capacity and elements.
399    ///
400    /// # Examples
401    ///
402    /// ```
403    /// use array_deque::ArrayDeque;
404    ///
405    /// let mut deque = ArrayDeque::new(3);
406    /// deque.push_back(1);
407    /// deque.push_back(2);
408    /// let cloned = deque.clone();
409    /// assert_eq!(deque.len(), cloned.len());
410    /// assert_eq!(deque[0], cloned[0]);
411    /// ```
412    fn clone(&self) -> Self {
413        let mut new = ArrayDeque::new(self.cap);
414        for item in self.iter() {
415            new.push_back(item.clone());
416        }
417        new
418    }
419}
420
421impl<T: PartialEq> PartialEq for ArrayDeque<T> {
422    /// Compares two deques for equality based on their elements and order.
423    ///
424    /// Two deques are equal if they have the same length and all elements
425    /// compare equal in the same order.
426    fn eq(&self, other: &Self) -> bool {
427        self.len == other.len && self.iter().eq(other.iter())
428    }
429}
430
431impl<T: Eq> Eq for ArrayDeque<T> {}
432
433impl<T> Index<usize> for ArrayDeque<T> {
434    type Output = T;
435
436    /// Provides indexed access to elements in the deque.
437    ///
438    /// Index 0 corresponds to the front element, index 1 to the second element, etc.
439    ///
440    /// # Panics
441    ///
442    /// Panics if the index is out of bounds (>= len()).
443    ///
444    /// # Examples
445    ///
446    /// ```
447    /// use array_deque::ArrayDeque;
448    ///
449    /// let mut deque = ArrayDeque::new(3);
450    /// deque.push_back(10);
451    /// deque.push_back(20);
452    /// assert_eq!(deque[0], 10);
453    /// assert_eq!(deque[1], 20);
454    /// ```
455    fn index(&self, i: usize) -> &Self::Output {
456        assert!(i < self.len);
457        let idx = (self.idx + i) % self.cap;
458        unsafe { &*self.ptr.add(idx) }
459    }
460}
461
462impl<T> IndexMut<usize> for ArrayDeque<T> {
463    /// Provides mutable indexed access to elements in the deque.
464    ///
465    /// # Panics
466    ///
467    /// Panics if the index is out of bounds (>= len()).
468    ///
469    /// # Examples
470    ///
471    /// ```
472    /// use array_deque::ArrayDeque;
473    ///
474    /// let mut deque = ArrayDeque::new(3);
475    /// deque.push_back(10);
476    /// deque[0] = 42;
477    /// assert_eq!(deque[0], 42);
478    /// ```
479    fn index_mut(&mut self, i: usize) -> &mut Self::Output {
480        assert!(i < self.len);
481        let idx = (self.idx + i) % self.cap;
482        unsafe { &mut *self.ptr.add(idx) }
483    }
484}
485
486impl<T> Extend<T> for ArrayDeque<T> {
487    /// Extends the deque with the contents of an iterator.
488    ///
489    /// Elements are added to the back of the deque. If the deque becomes full
490    /// during extension, older elements will be overwritten.
491    ///
492    /// # Examples
493    ///
494    /// ```
495    /// use array_deque::ArrayDeque;
496    ///
497    /// let mut deque = ArrayDeque::new(5);
498    /// deque.extend(vec![1, 2, 3]);
499    /// assert_eq!(deque.len(), 3);
500    /// ```
501    fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
502        for item in iter {
503            self.push_back(item);
504        }
505    }
506}
507
508impl<T> FromIterator<T> for ArrayDeque<T> {
509    /// Creates a deque from an iterator.
510    ///
511    /// The capacity is set to the number of elements in the iterator
512    /// (with a minimum of 1).
513    ///
514    /// # Examples
515    ///
516    /// ```
517    /// use array_deque::ArrayDeque;
518    ///
519    /// let deque: ArrayDeque<i32> = (1..4).collect();
520    /// assert_eq!(deque.len(), 3);
521    /// assert_eq!(deque[0], 1);
522    /// ```
523    fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
524        let vec: Vec<T> = iter.into_iter().collect();
525        let mut deque = ArrayDeque::new(vec.len().max(1));
526        deque.extend(vec);
527        deque
528    }
529}
530
531impl<T> From<&[T]> for ArrayDeque<T>
532where
533    T: Clone,
534{
535    /// Creates a deque from a slice by cloning all elements.
536    ///
537    /// # Examples
538    ///
539    /// ```
540    /// use array_deque::ArrayDeque;
541    ///
542    /// let slice = &[1, 2, 3];
543    /// let deque: ArrayDeque<i32> = ArrayDeque::from(slice);
544    /// assert_eq!(deque.len(), 3);
545    /// ```
546    fn from(slice: &[T]) -> Self {
547        let mut deque = ArrayDeque::new(slice.len());
548        for item in slice {
549            deque.push_back(item.clone());
550        }
551        deque
552    }
553}
554
555impl<T, const N: usize> From<[T; N]> for ArrayDeque<T> {
556    /// Creates a deque from an array by taking ownership of all elements.
557    ///
558    /// # Examples
559    ///
560    /// ```
561    /// use array_deque::ArrayDeque;
562    ///
563    /// let array = [1, 2, 3];
564    /// let deque: ArrayDeque<i32> = ArrayDeque::from(array);
565    /// assert_eq!(deque.len(), 3);
566    /// ```
567    fn from(array: [T; N]) -> Self {
568        let mut deque = ArrayDeque::new(N.max(1));
569        for item in array {
570            deque.push_back(item);
571        }
572        deque
573    }
574}
575
576impl<T> From<Vec<T>> for ArrayDeque<T> {
577    /// Creates a deque from a vector by taking ownership of all elements.
578    ///
579    /// # Examples
580    ///
581    /// ```
582    /// use array_deque::ArrayDeque;
583    ///
584    /// let vec = vec![1, 2, 3];
585    /// let deque: ArrayDeque<i32> = ArrayDeque::from(vec);
586    /// assert_eq!(deque.len(), 3);
587    /// ```
588    fn from(vec: Vec<T>) -> Self {
589        let mut deque = ArrayDeque::new(vec.len().max(1));
590        for item in vec {
591            deque.push_back(item);
592        }
593        deque
594    }
595}
596
597impl<T: Clone> From<&Vec<T>> for ArrayDeque<T> {
598    /// Creates a deque from a vector reference by cloning all elements.
599    fn from(vec: &Vec<T>) -> Self {
600        let mut deque = ArrayDeque::new(vec.len().max(1));
601        for item in vec {
602            deque.push_back(item.clone());
603        }
604        deque
605    }
606}
607
608impl<T: Clone, const N: usize> From<&[T; N]> for ArrayDeque<T> {
609    /// Creates a deque from an array reference by cloning all elements.
610    fn from(array: &[T; N]) -> Self {
611        let mut deque = ArrayDeque::new(N.max(1));
612        for item in array {
613            deque.push_back(item.clone());
614        }
615        deque
616    }
617}
618
619#[cfg(feature = "serde")]
620impl<T: Serialize> Serialize for ArrayDeque<T> {
621    /// Serializes the deque as a sequence of its elements.
622    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
623    where
624        S: Serializer,
625    {
626        use serde::ser::SerializeSeq;
627
628        let mut seq = serializer.serialize_seq(Some(self.len))?;
629        for item in self.iter() {
630            seq.serialize_element(item)?;
631        }
632        seq.end()
633    }
634}
635
636#[cfg(feature = "serde")]
637impl<'de, T: Deserialize<'de>> Deserialize<'de> for ArrayDeque<T> {
638    /// Deserializes a sequence into a deque.
639    ///
640    /// The capacity is set to the number of elements in the sequence.
641    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
642    where
643        D: Deserializer<'de>,
644    {
645        let vec: Vec<T> = Vec::deserialize(deserializer)?;
646        Ok(ArrayDeque::from(vec))
647    }
648}
649
650impl<T> IntoIterator for ArrayDeque<T> {
651    type Item = T;
652    type IntoIter = ArrayDequeIntoIter<T>;
653
654    /// Creates a consuming iterator that moves all elements out of the deque.
655    ///
656    /// The deque cannot be used after calling this method.
657    ///
658    /// # Examples
659    ///
660    /// ```
661    /// use array_deque::ArrayDeque;
662    ///
663    /// let mut deque = ArrayDeque::new(3);
664    /// deque.push_back(1);
665    /// deque.push_back(2);
666    ///
667    /// let vec: Vec<i32> = deque.into_iter().collect();
668    /// assert_eq!(vec, vec![1, 2]);
669    /// ```
670    fn into_iter(self) -> Self::IntoIter {
671        ArrayDequeIntoIter {
672            deque: self,
673            pos: 0,
674        }
675    }
676}
677
678/// An iterator that moves elements out of an `ArrayDeque`.
679///
680/// This struct is created by the `into_iter` method on `ArrayDeque`.
681pub struct ArrayDequeIntoIter<T> {
682    deque: ArrayDeque<T>,
683    pos: usize,
684}
685
686impl<T> Iterator for ArrayDequeIntoIter<T> {
687    type Item = T;
688
689    /// Advances the iterator and returns the next element.
690    fn next(&mut self) -> Option<Self::Item> {
691        if self.pos >= self.deque.len {
692            return None;
693        }
694        let idx = (self.deque.idx + self.pos) % self.deque.cap;
695        self.pos += 1;
696        Some(unsafe { ptr::read(self.deque.ptr.add(idx)) })
697    }
698
699    /// Returns the bounds on the remaining length of the iterator.
700    fn size_hint(&self) -> (usize, Option<usize>) {
701        let remaining = self.deque.len - self.pos;
702        (remaining, Some(remaining))
703    }
704}
705
706impl<'a, T> IntoIterator for &'a ArrayDeque<T> {
707    type Item = &'a T;
708    type IntoIter = ArrayDequeIter<'a, T>;
709
710    /// Creates an iterator over references to the deque's elements.
711    ///
712    /// # Examples
713    ///
714    /// ```
715    /// use array_deque::ArrayDeque;
716    ///
717    /// let mut deque = ArrayDeque::new(3);
718    /// deque.push_back(1);
719    /// deque.push_back(2);
720    ///
721    /// for item in &deque {
722    ///     println!("{}", item);
723    /// }
724    /// ```
725    fn into_iter(self) -> Self::IntoIter {
726        ArrayDequeIter {
727            deque: self,
728            pos: 0,
729        }
730    }
731}
732
733/// An iterator over references to the elements of an `ArrayDeque`.
734///
735/// This struct is created by the `iter` method on `ArrayDeque` or by
736/// using `&deque` in a for loop.
737pub struct ArrayDequeIter<'a, T> {
738    deque: &'a ArrayDeque<T>,
739    pos: usize,
740}
741
742impl<'a, T> Iterator for ArrayDequeIter<'a, T> {
743    type Item = &'a T;
744
745    /// Advances the iterator and returns the next element reference.
746    fn next(&mut self) -> Option<Self::Item> {
747        if self.pos >= self.deque.len {
748            return None;
749        }
750        let idx = (self.deque.idx + self.pos) % self.deque.cap;
751        self.pos += 1;
752        unsafe { Some(&*self.deque.ptr.add(idx)) }
753    }
754
755    /// Returns the bounds on the remaining length of the iterator.
756    fn size_hint(&self) -> (usize, Option<usize>) {
757        let remaining = self.deque.len - self.pos;
758        (remaining, Some(remaining))
759    }
760}
761
762impl<'a, T> ExactSizeIterator for ArrayDequeIter<'a, T> {}
763
764#[cfg(test)]
765mod tests {
766    use super::*;
767
768    #[test]
769    fn push_pop() {
770        let mut deque = ArrayDeque::new(3);
771        deque.push_back(1);
772        deque.push_back(2);
773        deque.push_back(3);
774        assert_eq!(deque.pop_front(), Some(1));
775        assert_eq!(deque.pop_back(), Some(3));
776        assert_eq!(deque.pop_front(), Some(2));
777        assert_eq!(deque.pop_front(), None);
778    }
779
780    #[test]
781    fn push_front_back() {
782        let mut deque = ArrayDeque::new(3);
783        deque.push_front(1);
784        deque.push_front(2);
785        deque.push_back(3);
786        assert_eq!(deque.pop_front(), Some(2));
787        assert_eq!(deque.pop_back(), Some(3));
788        assert_eq!(deque.pop_front(), Some(1));
789        assert_eq!(deque.pop_front(), None);
790    }
791
792    #[test]
793    fn iter() {
794        let mut deque = ArrayDeque::new(5);
795        deque.push_back(1);
796        deque.push_back(2);
797        deque.push_back(3);
798        let mut iter = deque.iter();
799        assert_eq!(iter.next(), Some(&1));
800        assert_eq!(iter.next(), Some(&2));
801        assert_eq!(iter.next(), Some(&3));
802        assert_eq!(iter.next(), None);
803    }
804
805    #[test]
806    fn clear() {
807        let mut deque = ArrayDeque::new(3);
808        deque.push_back(1);
809        deque.push_back(2);
810        deque.clear();
811        assert!(deque.is_empty());
812        assert_eq!(deque.len(), 0);
813    }
814
815    #[test]
816    fn capacity() {
817        let deque = ArrayDeque::<i32>::new(5);
818        assert_eq!(deque.capacity(), 5);
819        assert!(deque.is_empty());
820    }
821
822    #[test]
823    fn clone() {
824        let mut deque = ArrayDeque::new(3);
825        deque.push_back(1);
826        deque.push_back(2);
827        let cloned_deque = deque.clone();
828        assert_eq!(cloned_deque.len(), 2);
829        assert_eq!(cloned_deque[0], 1);
830        assert_eq!(cloned_deque[1], 2);
831    }
832
833    #[test]
834    fn from_iter() {
835        let vec = vec![1, 2, 3];
836        let deque: ArrayDeque<_> = vec.into_iter().collect();
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 from_slice() {
845        let slice = [1, 2, 3];
846        let deque: ArrayDeque<_> = ArrayDeque::from(&slice[..]);
847        assert_eq!(deque.len(), 3);
848        assert_eq!(deque[0], 1);
849        assert_eq!(deque[1], 2);
850        assert_eq!(deque[2], 3);
851    }
852
853    #[test]
854    fn from_array() {
855        let array = [1, 2, 3];
856        let deque: ArrayDeque<_> = ArrayDeque::from(array);
857        assert_eq!(deque.len(), 3);
858        assert_eq!(deque[0], 1);
859        assert_eq!(deque[1], 2);
860        assert_eq!(deque[2], 3);
861    }
862
863    #[test]
864    fn index() {
865        let mut deque = ArrayDeque::new(5);
866        deque.push_back(1);
867        deque.push_back(2);
868        deque.push_back(3);
869        assert_eq!(deque[0], 1);
870        assert_eq!(deque[1], 2);
871        assert_eq!(deque[2], 3);
872        assert!(
873            std::panic::catch_unwind(|| {
874                let _ = deque[3];
875            })
876            .is_err()
877        );
878    }
879
880    #[test]
881    fn index_mut() {
882        let mut deque = ArrayDeque::new(5);
883        deque.push_back(1);
884        deque.push_back(2);
885        deque.push_back(3);
886        deque[0] = 10;
887        assert_eq!(deque[0], 10);
888        assert_eq!(deque[1], 2);
889        assert_eq!(deque[2], 3);
890        assert!(
891            std::panic::catch_unwind(|| {
892                let _ = deque[3];
893            })
894            .is_err()
895        );
896    }
897
898    #[test]
899    fn extend() {
900        let mut deque = ArrayDeque::new(5);
901        deque.extend(vec![1, 2, 3]);
902        assert_eq!(deque.len(), 3);
903        assert_eq!(deque[0], 1);
904        assert_eq!(deque[1], 2);
905        assert_eq!(deque[2], 3);
906    }
907
908    #[test]
909    fn into_iter() {
910        let mut deque = ArrayDeque::new(5);
911        deque.push_back(1);
912        deque.push_back(2);
913        deque.push_back(3);
914        let mut iter = deque.into_iter();
915        assert_eq!(iter.next(), Some(1));
916        assert_eq!(iter.next(), Some(2));
917        assert_eq!(iter.next(), Some(3));
918        assert_eq!(iter.next(), None);
919    }
920
921    #[test]
922    fn into_iter_empty() {
923        let deque: ArrayDeque<i32> = ArrayDeque::new(5);
924        let mut iter = deque.into_iter();
925        assert_eq!(iter.next(), None);
926    }
927
928    #[test]
929    fn into_iter_full() {
930        let mut deque = ArrayDeque::new(3);
931        deque.push_back(1);
932        deque.push_back(2);
933        deque.push_back(3);
934        let mut iter = deque.into_iter();
935        assert_eq!(iter.next(), Some(1));
936        assert_eq!(iter.next(), Some(2));
937        assert_eq!(iter.next(), Some(3));
938        assert_eq!(iter.next(), None);
939    }
940
941    #[test]
942    fn into_iter_partial() {
943        let mut deque = ArrayDeque::new(5);
944        deque.push_back(1);
945        deque.push_back(2);
946        let mut iter = deque.into_iter();
947        assert_eq!(iter.next(), Some(1));
948        assert_eq!(iter.next(), Some(2));
949        assert_eq!(iter.next(), None);
950    }
951
952    #[test]
953    fn iter_empty() {
954        let deque: ArrayDeque<i32> = ArrayDeque::new(5);
955        let mut iter = deque.iter();
956        assert_eq!(iter.next(), None);
957    }
958
959    #[test]
960    fn iter_full() {
961        let mut deque = ArrayDeque::new(3);
962        deque.push_back(1);
963        deque.push_back(2);
964        deque.push_back(3);
965        let mut iter = deque.iter();
966        assert_eq!(iter.next(), Some(&1));
967        assert_eq!(iter.next(), Some(&2));
968        assert_eq!(iter.next(), Some(&3));
969        assert_eq!(iter.next(), None);
970    }
971
972    #[test]
973    fn iter_partial() {
974        let mut deque = ArrayDeque::new(5);
975        deque.push_back(1);
976        deque.push_back(2);
977        let mut iter = deque.iter();
978        assert_eq!(iter.next(), Some(&1));
979        assert_eq!(iter.next(), Some(&2));
980        assert_eq!(iter.next(), None);
981    }
982
983    #[test]
984    fn is_empty() {
985        let deque: ArrayDeque<i32> = ArrayDeque::new(5);
986        assert!(deque.is_empty());
987        assert_eq!(deque.len(), 0);
988    }
989
990    #[test]
991    fn is_full() {
992        let mut deque = ArrayDeque::new(3);
993        assert!(!deque.is_full());
994        deque.push_back(1);
995        deque.push_back(2);
996        assert!(!deque.is_full());
997        deque.push_back(3);
998        assert!(deque.is_full());
999    }
1000
1001    #[test]
1002    fn clear_empty() {
1003        let mut deque = ArrayDeque::<()>::new(3);
1004        deque.clear();
1005        assert!(deque.is_empty());
1006        assert_eq!(deque.len(), 0);
1007    }
1008
1009    #[test]
1010    fn clear_non_empty() {
1011        let mut deque = ArrayDeque::new(3);
1012        deque.push_back(1);
1013        deque.push_back(2);
1014        deque.clear();
1015        assert!(deque.is_empty());
1016        assert_eq!(deque.len(), 0);
1017    }
1018
1019    #[test]
1020    #[cfg(feature = "serde")]
1021    fn serde_serialize() {
1022        let mut deque = ArrayDeque::new(3);
1023        deque.push_back(1);
1024        deque.push_back(2);
1025        let serialized = serde_json::to_string(&deque).unwrap();
1026        assert_eq!(serialized, "[1,2]");
1027    }
1028
1029    #[test]
1030    #[cfg(feature = "serde")]
1031    fn serde_deserialize() {
1032        let serialized = "[1,2,3]";
1033        let deque: ArrayDeque<i32> = serde_json::from_str(serialized).unwrap();
1034        assert_eq!(deque.len(), 3);
1035        assert_eq!(deque[0], 1);
1036        assert_eq!(deque[1], 2);
1037        assert_eq!(deque[2], 3);
1038    }
1039}