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 create(memory: RuntimeMemory<M>) -> Self {
assert_eq!(memory.size(), 0, "collection memory is not empty");
Self::reset(memory)
}
pub fn reset(memory: RuntimeMemory<M>) -> Self {
Self {
inner: substrate::Vec::new(memory),
}
}
pub fn load(memory: RuntimeMemory<M>) -> Self {
assert!(memory.size() > 0, "collection memory is empty");
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()
}
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()
}
}