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
use std::cell::RefCell; use std::rc::Rc; #[derive(Debug, Clone, Default)] pub(crate) struct MaxNumparamStack { stack: Rc<RefCell<Vec<i32>>>, } impl MaxNumparamStack { const ORDINARY_PARAMS: i32 = -1; pub(crate) fn new() -> Self { Self { stack: Rc::new(RefCell::new(vec![])), } } pub(crate) fn is_empty(&self) -> bool { self.stack.borrow().is_empty() } pub(crate) fn set_has_ordinary_params(&self) { self.set(Self::ORDINARY_PARAMS) } pub(crate) fn has_ordinary_params(&self) -> bool { self.top() == Self::ORDINARY_PARAMS } pub(crate) fn has_numparams(&self) -> bool { self.top() > 0 } pub(crate) fn register(&self, numparam: i32) { self.set(std::cmp::max(self.top(), numparam)) } pub(crate) fn top(&self) -> i32 { *self.stack.borrow().last().unwrap_or(&i32::MIN) } pub(crate) fn push(&self) { self.stack.borrow_mut().push(0) } pub(crate) fn pop(&self) { self.stack.borrow_mut().pop(); } fn set(&self, value: i32) { let mut stack = self.stack.borrow_mut(); let len = stack.len(); stack[len - 1] = value; } pub(crate) fn inner_clone(&self) -> Vec<i32> { self.stack.borrow().clone() } }