use alloc::vec::Vec;
use crate::merkle::{
NodeIndex,
smt::{Map, SmtLeaf, large::subtree::Subtree},
};
#[derive(Debug, Clone)]
pub enum SubtreeUpdate {
Store {
index: NodeIndex,
subtree: Subtree,
},
Delete {
index: NodeIndex,
},
}
#[derive(Debug)]
pub struct StorageUpdateParts {
pub leaf_updates: Map<u64, Option<SmtLeaf>>,
pub subtree_updates: Vec<SubtreeUpdate>,
pub leaf_count_delta: isize,
pub entry_count_delta: isize,
}
#[derive(Default, Debug, Clone)]
pub struct StorageUpdates {
leaf_updates: Map<u64, Option<SmtLeaf>>,
subtree_updates: Vec<SubtreeUpdate>,
leaf_count_delta: isize,
entry_count_delta: isize,
}
impl StorageUpdates {
pub fn new() -> Self {
Self::default()
}
pub fn from_parts(
leaf_updates: Map<u64, Option<SmtLeaf>>,
subtree_updates: impl IntoIterator<Item = SubtreeUpdate>,
leaf_count_delta: isize,
entry_count_delta: isize,
) -> Self {
Self {
leaf_updates,
subtree_updates: subtree_updates.into_iter().collect(),
leaf_count_delta,
entry_count_delta,
}
}
pub fn insert_leaf(&mut self, index: u64, leaf: SmtLeaf) {
self.leaf_updates.insert(index, Some(leaf));
}
pub fn remove_leaf(&mut self, index: u64) {
self.leaf_updates.insert(index, None);
}
pub fn insert_subtree(&mut self, subtree: Subtree) {
let index = subtree.root_index();
self.subtree_updates.push(SubtreeUpdate::Store { index, subtree });
}
pub fn remove_subtree(&mut self, index: NodeIndex) {
self.subtree_updates.push(SubtreeUpdate::Delete { index });
}
pub fn is_empty(&self) -> bool {
self.leaf_updates.is_empty() && self.subtree_updates.is_empty()
}
pub fn leaf_update_count(&self) -> usize {
self.leaf_updates.len()
}
pub fn subtree_update_count(&self) -> usize {
self.subtree_updates.len()
}
pub fn leaf_updates(&self) -> &Map<u64, Option<SmtLeaf>> {
&self.leaf_updates
}
pub fn subtree_updates(&self) -> &[SubtreeUpdate] {
&self.subtree_updates
}
pub fn leaf_count_delta(&self) -> isize {
self.leaf_count_delta
}
pub fn entry_count_delta(&self) -> isize {
self.entry_count_delta
}
pub fn set_leaf_count_delta(&mut self, delta: isize) {
self.leaf_count_delta = delta;
}
pub fn set_entry_count_delta(&mut self, delta: isize) {
self.entry_count_delta = delta;
}
pub fn adjust_leaf_count_delta(&mut self, adjustment: isize) {
self.leaf_count_delta += adjustment;
}
pub fn adjust_entry_count_delta(&mut self, adjustment: isize) {
self.entry_count_delta += adjustment;
}
pub fn into_leaf_updates(self) -> Map<u64, Option<SmtLeaf>> {
self.leaf_updates
}
pub fn into_subtree_updates(self) -> Vec<SubtreeUpdate> {
self.subtree_updates
}
pub fn into_parts(self) -> StorageUpdateParts {
StorageUpdateParts {
leaf_updates: self.leaf_updates,
subtree_updates: self.subtree_updates,
leaf_count_delta: self.leaf_count_delta,
entry_count_delta: self.entry_count_delta,
}
}
}