use super::{Memory, Storable};
use crate::substrate::{self, DefaultMemoryImpl};
use ic_memory::RuntimeMemory;
pub struct StableVec<T: Storable, M: Memory = DefaultMemoryImpl> {
inner: substrate::Vec<T, RuntimeMemory<M>>,
}
impl<T: Storable, M: Memory> StableVec<T, M> {
pub fn new(memory: RuntimeMemory<M>) -> Self {
Self {
inner: substrate::Vec::new(memory),
}
}
pub fn init(memory: RuntimeMemory<M>) -> Self {
Self {
inner: substrate::Vec::init(memory),
}
}
pub fn get(&self, index: u64) -> Option<T> {
self.inner.get(index)
}
pub fn set(&self, index: u64, item: &T) {
self.inner.set(index, item);
}
pub fn push(&self, item: &T) {
self.inner.push(item);
}
pub fn pop(&self) -> Option<T> {
self.inner.pop()
}
#[must_use]
pub fn reset(self) -> Self {
Self::new(self.inner.into_memory())
}
pub fn len(&self) -> u64 {
self.inner.len()
}
pub fn is_empty(&self) -> bool {
self.inner.is_empty()
}
pub fn iter(&self) -> impl DoubleEndedIterator<Item = T> + '_ {
self.inner.iter()
}
}