1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
//! Behavior semantics for `ArrayDeque`.
//!
//! `ArrayDeque` provides two different behaviors, `Saturating` and `Wrapping`,
//! determining whether to remove existing element automatically when pushing
//! to a full deque.
//!
//! The behavior is indicated by a marker type parameter of `ArrayDeque`,
//! which defaults to `Saturating`.
//!
//! ## Saturating
//!
//! Pushing any element when `ArrayDeque` is full will directly return an `Err(CapacityError)`
//! containing the element attempting to push, leaving the `ArrayDeque` unchanged.
//!
//! ```
//! use arraydeque::{ArrayDeque, Saturating, CapacityError};
//!
//! let mut tester: ArrayDeque<[_; 2], Saturating> = ArrayDeque::new();
//!
//! assert_eq!(tester.push_back(1), Ok(()));
//! assert_eq!(tester.push_back(2), Ok(()));
//! assert_eq!(tester.push_back(3), Err(CapacityError { element: 3 }));
//! ```
//!
//! ## Wrapping
//!
//! Pushing any element when `ArrayDeque` is full will pop an element at
//! the other side to spare room.
//!
//! ```
//! use arraydeque::{ArrayDeque, Wrapping};
//!
//! let mut tester: ArrayDeque<[_; 2], Wrapping> = ArrayDeque::new();
//!
//! assert_eq!(tester.push_back(1), None);
//! assert_eq!(tester.push_back(2), None);
//! assert_eq!(tester.push_back(3), Some(1));
//! ```

/// Marker trait for indicating behaviors of `ArrayDeque`.
pub trait Behavior {}

/// Behavior for `ArrayDeque` that specifies saturating write semantics.
pub struct Saturating;

impl Behavior for Saturating {}

/// Behavior for `ArrayDeque` that specifies wrapping write semantics.
pub struct Wrapping;

impl Behavior for Wrapping {}