sans_io_runtime/collections/
dequeue.rs1use std::collections::VecDeque;
2
3#[derive(Debug)]
20pub struct DynamicDeque<T, const STACK_SIZE: usize> {
21 stack: heapless::Deque<T, STACK_SIZE>,
22 heap: VecDeque<T>,
23}
24
25impl<T, const STACK_SIZE: usize> Default for DynamicDeque<T, STACK_SIZE> {
26 fn default() -> Self {
27 Self {
28 stack: heapless::Deque::new(),
29 heap: VecDeque::new(),
30 }
31 }
32}
33
34#[allow(unused)]
35impl<T, const STATIC_SIZE: usize> DynamicDeque<T, STATIC_SIZE> {
36 pub fn from<const SIZE: usize>(prepare: [T; SIZE]) -> Self {
46 let mut instance = Self::default();
47 for item in prepare {
48 instance.push_back(item);
49 }
50 instance
51 }
52
53 pub fn push_back_stack(&mut self, value: T) -> Result<(), T> {
64 self.stack.push_back(value)
65 }
66
67 pub fn push_back(&mut self, value: T) {
73 if let Err(value) = self.stack.push_back(value) {
74 self.heap.push_back(value);
75 }
76 }
77
78 pub fn pop_front(&mut self) -> Option<T> {
84 let res = self.stack.pop_front();
85 if !self.stack.is_full() && !self.heap.is_empty() {
86 let front = self.heap.pop_front().expect("Should have");
87 if self.stack.push_back(front).is_err() {
88 panic!("cannot happen");
89 }
90 }
91 res
92 }
93
94 pub fn is_empty(&self) -> bool {
100 self.stack.is_empty()
101 }
102
103 pub fn len(&self) -> usize {
109 self.stack.len() + self.heap.len()
110 }
111
112 #[inline(always)]
115 pub fn pop2(&mut self, e: T) -> T {
116 if self.is_empty() {
117 e
118 } else {
119 let out = self.pop_front().expect("Should have because just push");
120 self.push_back(e);
121 out
122 }
123 }
124}
125
126#[cfg(test)]
127mod tests {
128 use super::*;
129
130 #[test]
131 fn test_push_back() {
132 let mut deque: DynamicDeque<i32, 2> = DynamicDeque::default();
133 assert!(deque.push_back_stack(1).is_ok());
134 assert!(deque.push_back_stack(2).is_ok());
135 assert!(deque.push_back_stack(3).is_err());
136 assert_eq!(deque.len(), 2);
137 deque.push_back(3);
138 assert_eq!(deque.len(), 3);
139 }
140
141 #[test]
142 fn test_pop_front() {
143 let mut deque: DynamicDeque<i32, 2> = DynamicDeque::default();
144 deque.push_back(1);
145 deque.push_back(2);
146 deque.push_back(3);
147 assert_eq!(deque.pop_front(), Some(1));
148 assert_eq!(deque.pop_front(), Some(2));
149 assert_eq!(deque.pop_front(), Some(3));
150 assert_eq!(deque.pop_front(), None);
151 assert_eq!(deque.len(), 0);
152 }
153
154 #[test]
155 fn test_is_empty() {
156 let mut deque: DynamicDeque<i32, 2> = DynamicDeque::default();
157 assert_eq!(deque.is_empty(), true);
158 deque.push_back(1);
159 assert_eq!(deque.is_empty(), false);
160 deque.pop_front();
161 assert_eq!(deque.is_empty(), true);
162 }
163}