cairo_lang_utils/
deque.rs1extern crate alloc;
2
3use alloc::collections::VecDeque;
4use alloc::vec::Vec;
5use core::ops::{Deref, DerefMut};
6
7#[derive(Clone, Debug, PartialEq, Eq)]
10pub struct Deque<T>(VecDeque<T>);
11
12impl<T> Deref for Deque<T> {
13 type Target = VecDeque<T>;
14
15 fn deref(&self) -> &Self::Target {
16 &self.0
17 }
18}
19
20impl<T> DerefMut for Deque<T> {
21 fn deref_mut(&mut self) -> &mut Self::Target {
22 &mut self.0
23 }
24}
25
26#[cfg(feature = "salsa")]
27unsafe impl<T: salsa::Update> salsa::Update for Deque<T> {
28 unsafe fn maybe_update(old_pointer: *mut Self, new_deque: Self) -> bool {
29 let old_deque: &mut Self = unsafe { &mut *old_pointer };
30
31 if old_deque.len() != new_deque.len() {
33 old_deque.clear();
34 old_deque.extend(new_deque);
35 return true;
36 }
37
38 let mut changed = false;
40 for (old_item, new_item) in old_deque.iter_mut().zip(new_deque) {
41 changed |= unsafe { T::maybe_update(old_item, new_item) };
42 }
43 changed
44 }
45}
46
47impl<T> Default for Deque<T> {
48 fn default() -> Self {
49 Self(VecDeque::new())
50 }
51}
52
53impl<T> Deque<T> {
54 pub fn new() -> Self {
56 Self(VecDeque::new())
57 }
58
59 pub fn with_capacity(capacity: usize) -> Self {
61 Self(VecDeque::with_capacity(capacity))
62 }
63}
64
65impl<T> IntoIterator for Deque<T> {
66 type Item = T;
67 type IntoIter = alloc::collections::vec_deque::IntoIter<T>;
68
69 fn into_iter(self) -> Self::IntoIter {
70 self.0.into_iter()
71 }
72}
73
74impl<T> FromIterator<T> for Deque<T> {
75 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
76 Self(VecDeque::from_iter(iter))
77 }
78}
79
80impl<T, const N: usize> From<[T; N]> for Deque<T> {
81 fn from(arr: [T; N]) -> Self {
82 Self(VecDeque::from(arr))
83 }
84}
85
86impl<T> From<Vec<T>> for Deque<T> {
87 fn from(vec: Vec<T>) -> Self {
88 Self(VecDeque::from(vec))
89 }
90}
91
92impl<T> From<Deque<T>> for Vec<T> {
93 fn from(deque: Deque<T>) -> Self {
94 deque.0.into()
95 }
96}