use super::{
Comparator, Config, DefaultMemoryImpl, Entry, Error, Lexicographic, Memory, Range, btree,
};
use ic_memory::RuntimeMemory;
use std::ops::Bound;
pub struct BTreeMap<M: Memory = DefaultMemoryImpl, C: Comparator = Lexicographic> {
inner: btree::BTreeMap<RuntimeMemory<M>, C>,
}
impl<M: Memory, C: Comparator> BTreeMap<M, C> {
pub fn create(memory: RuntimeMemory<M>, config: Config, order: C) -> Result<Self, Error> {
btree::BTreeMap::create(memory, config, order).map(|inner| Self { inner })
}
pub fn open(memory: RuntimeMemory<M>, config: Config, order: C) -> Result<Self, Error> {
btree::BTreeMap::open(memory, config, order).map(|inner| Self { inner })
}
#[must_use]
pub fn len(&self) -> u64 {
self.inner.len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.inner.is_empty()
}
#[must_use]
pub fn memory_bytes(&self) -> u64 {
self.inner.memory_bytes()
}
pub fn get(&self, key: &[u8]) -> Result<Option<Vec<u8>>, Error> {
self.inner.get(key)
}
pub fn contains_key(&self, key: &[u8]) -> Result<bool, Error> {
self.inner.contains_key(key)
}
pub fn insert(&mut self, key: &[u8], value: &[u8]) -> Result<Option<Vec<u8>>, Error> {
self.inner.insert(key, value)
}
pub fn remove(&mut self, key: &[u8]) -> Result<Option<Vec<u8>>, Error> {
self.inner.remove(key)
}
pub fn range(
&self,
lower: Bound<&[u8]>,
upper: Bound<&[u8]>,
) -> Result<Range<'_, M, C>, Error> {
self.inner.range(lower, upper)
}
#[must_use]
pub fn iter(&self) -> Range<'_, M, C> {
self.inner.iter()
}
pub fn validate(&self) -> Result<(), Error> {
self.inner.validate()
}
}
impl<'a, M: Memory, C: Comparator> IntoIterator for &'a BTreeMap<M, C> {
type Item = Result<Entry<'a, M, C>, Error>;
type IntoIter = Range<'a, M, C>;
fn into_iter(self) -> Self::IntoIter {
self.iter()
}
}
#[cfg(all(test, not(target_arch = "wasm32")))]
#[path = "governed/tests.rs"]
mod tests;