bmatcher_core/
stack.rs

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}