trivial_kernel/context/
stack.rs

1use super::{PackedPtr, Store};
2use crate::{error::Kind, KResult};
3
4#[derive(Debug, Default, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
5pub struct Stack {
6    data: Vec<PackedPtr>,
7}
8
9impl Stack {
10    pub fn to_display<'a, S: Store>(&'a self, store: &'a S) -> DisplayStack<'a, S> {
11        DisplayStack(self, store)
12    }
13
14    pub fn push(&mut self, idx: PackedPtr) {
15        self.data.push(idx);
16    }
17
18    pub fn clear(&mut self) {
19        self.data.clear();
20    }
21
22    pub fn pop(&mut self) -> Option<PackedPtr> {
23        self.data.pop()
24    }
25
26    pub fn peek(&self) -> Option<&PackedPtr> {
27        self.data.last()
28    }
29
30    pub fn len(&self) -> usize {
31        self.data.len()
32    }
33
34    pub fn as_slice(&self) -> &[PackedPtr] {
35        &self.data
36    }
37
38    pub fn get_last(&self, nr: usize) -> KResult<&[PackedPtr]> {
39        let len = self.data.len();
40        self.data
41            .as_slice()
42            .get((len - nr)..)
43            .ok_or(Kind::ProofStackUnderflow)
44    }
45
46    pub fn truncate_last(&mut self, nr: usize) {
47        let len = self.data.len();
48        self.data.truncate(len - nr);
49    }
50}
51
52use core::fmt::{self, Display, Formatter};
53
54pub struct DisplayStack<'a, S: Store>(&'a Stack, &'a S);
55
56impl<'a, S: Store> Display for DisplayStack<'a, S> {
57    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
58        for i in self.0.data.iter().rev() {
59            let ptr = i.into();
60
61            match self.1.get_element(ptr) {
62                Some(el) => writeln!(f, "> {} {}", i, el.to_display(self.1))?,
63                None => writeln!(f, "> Invalid ptr")?,
64            }
65        }
66
67        Ok(())
68    }
69}