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