use { crate::utils::{ clonecell::UnsafeCellCloneSafe, ptr_ext::{MutPtrExt, PtrExt}, }, std::{cell::UnsafeCell, mem}, }; pub struct Stack { vec: UnsafeCell>, } impl Default for Stack { fn default() -> Self { Self { vec: Default::default(), } } } impl Stack { pub fn push(&self, v: T) { unsafe { self.vec.get().deref_mut().push(v); } } pub fn pop(&self) -> Option { unsafe { self.vec.get().deref_mut().pop() } } pub fn to_vec(&self) -> Vec where T: UnsafeCellCloneSafe, { unsafe { let v = self.vec.get().deref(); (*v).clone() } } pub fn take(&self) -> Vec { unsafe { mem::take(self.vec.get().deref_mut()) } } }