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}