use alloc::{boxed::Box, vec::Vec};
use core::{
fmt,
ops::{Deref, DerefMut},
};
use crate::{
Word,
merkle::{
NodeIndex,
smt::{InnerNode, Map, SmtLeaf, large::subtree::Subtree},
},
};
mod error;
pub use error::StorageError;
#[cfg(feature = "rocksdb")]
mod rocksdb;
#[cfg(feature = "rocksdb")]
pub use rocksdb::{RocksDbConfig, RocksDbSnapshotStorage, RocksDbStorage};
mod memory;
pub use memory::{MemoryStorage, MemoryStorageSnapshot};
mod updates;
pub use updates::{StorageUpdateParts, StorageUpdates, SubtreeUpdate};
pub trait SmtStorageReader: 'static + fmt::Debug + Send + Sync {
fn leaf_count(&self) -> Result<usize, StorageError>;
fn entry_count(&self) -> Result<usize, StorageError>;
fn get_leaf(&self, index: u64) -> Result<Option<SmtLeaf>, StorageError>;
fn get_leaves(&self, indices: &[u64]) -> Result<Vec<Option<SmtLeaf>>, StorageError>;
fn has_leaves(&self) -> Result<bool, StorageError>;
fn get_subtree(&self, index: NodeIndex) -> Result<Option<Subtree>, StorageError>;
fn get_subtrees(&self, indices: &[NodeIndex]) -> Result<Vec<Option<Subtree>>, StorageError>;
fn get_leaf_and_subtrees(
&self,
leaf_index: u64,
subtree_indices: &[NodeIndex],
) -> Result<(Option<SmtLeaf>, Vec<Option<Subtree>>), StorageError> {
let leaf = self.get_leaf(leaf_index)?;
let subtrees = subtree_indices
.iter()
.map(|&idx| self.get_subtree(idx))
.collect::<Result<Vec<_>, _>>()?;
Ok((leaf, subtrees))
}
fn get_inner_node(&self, index: NodeIndex) -> Result<Option<InnerNode>, StorageError>;
fn iter_leaves(&self) -> Result<Box<dyn Iterator<Item = (u64, SmtLeaf)> + '_>, StorageError>;
fn iter_subtrees(&self) -> Result<Box<dyn Iterator<Item = Subtree> + '_>, StorageError>;
fn get_depth24(&self) -> Result<Vec<(u64, Word)>, StorageError>;
}
impl<T: SmtStorageReader + ?Sized> SmtStorageReader for Box<T> {
#[inline]
fn leaf_count(&self) -> Result<usize, StorageError> {
self.deref().leaf_count()
}
#[inline]
fn entry_count(&self) -> Result<usize, StorageError> {
self.deref().entry_count()
}
#[inline]
fn get_leaf(&self, index: u64) -> Result<Option<SmtLeaf>, StorageError> {
self.deref().get_leaf(index)
}
#[inline]
fn get_leaves(&self, indices: &[u64]) -> Result<Vec<Option<SmtLeaf>>, StorageError> {
self.deref().get_leaves(indices)
}
#[inline]
fn has_leaves(&self) -> Result<bool, StorageError> {
self.deref().has_leaves()
}
#[inline]
fn get_subtree(&self, index: NodeIndex) -> Result<Option<Subtree>, StorageError> {
self.deref().get_subtree(index)
}
#[inline]
fn get_subtrees(&self, indices: &[NodeIndex]) -> Result<Vec<Option<Subtree>>, StorageError> {
self.deref().get_subtrees(indices)
}
#[inline]
fn get_leaf_and_subtrees(
&self,
leaf_index: u64,
subtree_indices: &[NodeIndex],
) -> Result<(Option<SmtLeaf>, Vec<Option<Subtree>>), StorageError> {
self.deref().get_leaf_and_subtrees(leaf_index, subtree_indices)
}
#[inline]
fn get_inner_node(&self, index: NodeIndex) -> Result<Option<InnerNode>, StorageError> {
self.deref().get_inner_node(index)
}
#[inline]
fn iter_leaves(&self) -> Result<Box<dyn Iterator<Item = (u64, SmtLeaf)> + '_>, StorageError> {
self.deref().iter_leaves()
}
#[inline]
fn iter_subtrees(&self) -> Result<Box<dyn Iterator<Item = Subtree> + '_>, StorageError> {
self.deref().iter_subtrees()
}
#[inline]
fn get_depth24(&self) -> Result<Vec<(u64, Word)>, StorageError> {
self.deref().get_depth24()
}
}
pub trait SmtStorage: SmtStorageReader {
type Reader: SmtStorageReader;
fn reader(&self) -> Result<Self::Reader, StorageError>;
fn insert_value(
&mut self,
index: u64,
key: Word,
value: Word,
) -> Result<Option<Word>, StorageError>;
fn remove_value(&mut self, index: u64, key: Word) -> Result<Option<Word>, StorageError>;
fn set_leaves(&mut self, leaves: Map<u64, SmtLeaf>) -> Result<(), StorageError>;
fn remove_leaf(&mut self, index: u64) -> Result<Option<SmtLeaf>, StorageError>;
fn set_subtree(&mut self, subtree: &Subtree) -> Result<(), StorageError>;
fn set_subtrees(&mut self, subtrees: Vec<Subtree>) -> Result<(), StorageError>;
fn remove_subtree(&mut self, index: NodeIndex) -> Result<(), StorageError>;
fn set_inner_node(
&mut self,
index: NodeIndex,
node: InnerNode,
) -> Result<Option<InnerNode>, StorageError>;
fn remove_inner_node(&mut self, index: NodeIndex) -> Result<Option<InnerNode>, StorageError>;
fn apply(&mut self, updates: StorageUpdates) -> Result<(), StorageError>;
}
impl<T: SmtStorage + ?Sized> SmtStorage for Box<T> {
type Reader = T::Reader;
#[inline]
fn reader(&self) -> Result<Self::Reader, StorageError> {
self.deref().reader()
}
#[inline]
fn insert_value(
&mut self,
index: u64,
key: Word,
value: Word,
) -> Result<Option<Word>, StorageError> {
self.deref_mut().insert_value(index, key, value)
}
#[inline]
fn remove_value(&mut self, index: u64, key: Word) -> Result<Option<Word>, StorageError> {
self.deref_mut().remove_value(index, key)
}
#[inline]
fn set_leaves(&mut self, leaves: Map<u64, SmtLeaf>) -> Result<(), StorageError> {
self.deref_mut().set_leaves(leaves)
}
#[inline]
fn remove_leaf(&mut self, index: u64) -> Result<Option<SmtLeaf>, StorageError> {
self.deref_mut().remove_leaf(index)
}
#[inline]
fn set_subtree(&mut self, subtree: &Subtree) -> Result<(), StorageError> {
self.deref_mut().set_subtree(subtree)
}
#[inline]
fn set_subtrees(&mut self, subtrees: Vec<Subtree>) -> Result<(), StorageError> {
self.deref_mut().set_subtrees(subtrees)
}
#[inline]
fn remove_subtree(&mut self, index: NodeIndex) -> Result<(), StorageError> {
self.deref_mut().remove_subtree(index)
}
#[inline]
fn set_inner_node(
&mut self,
index: NodeIndex,
node: InnerNode,
) -> Result<Option<InnerNode>, StorageError> {
self.deref_mut().set_inner_node(index, node)
}
#[inline]
fn remove_inner_node(&mut self, index: NodeIndex) -> Result<Option<InnerNode>, StorageError> {
self.deref_mut().remove_inner_node(index)
}
#[inline]
fn apply(&mut self, updates: StorageUpdates) -> Result<(), StorageError> {
self.deref_mut().apply(updates)
}
}