1use alloc::vec::Vec;
2
3pub trait Stack<T> {
4 fn len(&self) -> usize;
5 fn is_empty(&self) -> bool {
6 self.len() == 0
7 }
8
9 fn reserve(&mut self, _size: usize) {}
10 fn truncate(&mut self, size: usize);
11
12 fn push_value(&mut self, value: T) -> bool;
13 fn pop_value(&mut self) -> Option<T>;
14
15 fn stack_mut(&mut self) -> &mut [T];
16}
17
18impl<T, I: Stack<T>> Stack<T> for &mut I {
19 fn len(&self) -> usize {
20 I::len(self)
21 }
22
23 fn reserve(&mut self, size: usize) {
24 I::reserve(self, size)
25 }
26 fn truncate(&mut self, size: usize) {
27 I::truncate(self, size)
28 }
29
30 fn push_value(&mut self, value: T) -> bool {
31 I::push_value(self, value)
32 }
33 fn pop_value(&mut self) -> Option<T> {
34 I::pop_value(self)
35 }
36
37 fn stack_mut(&mut self) -> &mut [T] {
38 I::stack_mut(self)
39 }
40}
41
42pub struct StaticStack<const N: usize, T> {
43 stack: [T; N],
44 length: usize,
45}
46
47impl<const N: usize, T: Default + Copy> StaticStack<N, T> {
48 pub fn new() -> Self {
49 Self {
50 stack: [Default::default(); N],
51 length: 0,
52 }
53 }
54}
55
56impl<const N: usize, T: Copy> Stack<T> for StaticStack<N, T> {
57 fn len(&self) -> usize {
58 self.length
59 }
60
61 fn stack_mut(&mut self) -> &mut [T] {
62 &mut self.stack[0..self.length]
63 }
64
65 fn truncate(&mut self, size: usize) {
66 self.length = size;
67 assert!(size <= self.stack.len());
68 }
69
70 fn push_value(&mut self, value: T) -> bool {
71 if self.length == self.stack.len() {
72 return false;
73 }
74
75 self.stack[self.length] = value;
76 self.length += 1;
77 true
78 }
79
80 fn pop_value(&mut self) -> Option<T> {
81 if self.length > 0 {
82 self.length -= 1;
83 let value = self.stack[self.length];
84 Some(value)
85 } else {
86 None
87 }
88 }
89}
90
91pub struct HeapStack<T> {
92 stack: Vec<T>,
93}
94
95impl<T> HeapStack<T> {
96 pub fn new() -> Self {
97 Self { stack: Vec::new() }
98 }
99}
100
101impl<T> Stack<T> for HeapStack<T> {
102 fn len(&self) -> usize {
103 self.stack.len()
104 }
105
106 fn stack_mut(&mut self) -> &mut [T] {
107 &mut self.stack
108 }
109
110 fn reserve(&mut self, size: usize) {
111 self.stack.reserve(size);
112 }
113
114 fn truncate(&mut self, size: usize) {
115 self.stack.truncate(size);
116 }
117
118 fn push_value(&mut self, value: T) -> bool {
119 self.stack.push(value);
120 true
121 }
122
123 fn pop_value(&mut self) -> Option<T> {
124 self.stack.pop()
125 }
126}