struct Stack { v: Vec, } impl Stack { fn pop(&mut self) -> Result { self.v.pop().ok_or(String::from("stack underflow")) } fn pop_int(&mut self) -> Result { Ok(self.pop()? as i64 >> 1) } fn push_int(&mut self, i: i64) { self.v.push((i as u64) << 1 | 1); } fn pop_pointer(&mut self) -> Result { Ok(Pointer::from_bytes(self.pop()?)) } fn push_pointer(&mut self, p: Pointer) { self.v.push(p.bytes()); } fn pop_usize(&mut self) -> Result { Ok(usize::try_from(self.pop()?).unwrap() >> 1) } fn push_usize(&mut self, p: usize) { self.v.push(u64::try_from(p).unwrap() << 1 | 1); } }