sparse_merkle_tree/
default_store.rs

1use crate::{
2    collections,
3    error::Error,
4    traits::{StoreReadOps, StoreWriteOps},
5    tree::{BranchKey, BranchNode},
6    H256,
7};
8
9#[derive(Debug, Clone, Default)]
10pub struct DefaultStore<V> {
11    branches_map: Map<BranchKey, BranchNode>,
12    leaves_map: Map<H256, V>,
13}
14
15impl<V> DefaultStore<V> {
16    pub fn branches_map(&self) -> &Map<BranchKey, BranchNode> {
17        &self.branches_map
18    }
19    pub fn leaves_map(&self) -> &Map<H256, V> {
20        &self.leaves_map
21    }
22    pub fn clear(&mut self) {
23        self.branches_map.clear();
24        self.leaves_map.clear();
25    }
26}
27
28impl<V: Clone> StoreReadOps<V> for DefaultStore<V> {
29    fn get_branch(&self, branch_key: &BranchKey) -> Result<Option<BranchNode>, Error> {
30        Ok(self.branches_map.get(branch_key).map(Clone::clone))
31    }
32    fn get_leaf(&self, leaf_key: &H256) -> Result<Option<V>, Error> {
33        Ok(self.leaves_map.get(leaf_key).map(Clone::clone))
34    }
35}
36
37impl<V> StoreWriteOps<V> for DefaultStore<V> {
38    fn insert_branch(&mut self, branch_key: BranchKey, branch: BranchNode) -> Result<(), Error> {
39        self.branches_map.insert(branch_key, branch);
40        Ok(())
41    }
42    fn insert_leaf(&mut self, leaf_key: H256, leaf: V) -> Result<(), Error> {
43        self.leaves_map.insert(leaf_key, leaf);
44        Ok(())
45    }
46    fn remove_branch(&mut self, branch_key: &BranchKey) -> Result<(), Error> {
47        self.branches_map.remove(branch_key);
48        Ok(())
49    }
50    fn remove_leaf(&mut self, leaf_key: &H256) -> Result<(), Error> {
51        self.leaves_map.remove(leaf_key);
52        Ok(())
53    }
54}
55
56cfg_if::cfg_if! {
57    if #[cfg(feature = "std")] {
58        pub type Map<K, V> = collections::HashMap<K, V>;
59        pub type Entry<'a, K, V> = collections::hash_map::Entry<'a, K, V>;
60    } else {
61        pub type Map<K, V> = collections::BTreeMap<K, V>;
62        pub type Entry<'a, K, V> = collections::btree_map::Entry<'a, K, V>;
63    }
64}