use std::collections::HashMap;
use moloch_core::{Hash, Result};
pub trait MmrStore: Clone {
fn get(&self, pos: u64) -> Result<Option<Hash>>;
fn insert(&mut self, pos: u64, hash: Hash) -> Result<()>;
fn size(&self) -> u64;
fn set_size(&mut self, size: u64);
}
#[derive(Clone, Default)]
pub struct MemStore {
nodes: HashMap<u64, Hash>,
size: u64,
}
impl MemStore {
pub fn new() -> Self {
Self::default()
}
pub fn nodes(&self) -> &HashMap<u64, Hash> {
&self.nodes
}
}
impl MmrStore for MemStore {
fn get(&self, pos: u64) -> Result<Option<Hash>> {
Ok(self.nodes.get(&pos).copied())
}
fn insert(&mut self, pos: u64, hash: Hash) -> Result<()> {
self.nodes.insert(pos, hash);
if pos >= self.size {
self.size = pos + 1;
}
Ok(())
}
fn size(&self) -> u64 {
self.size
}
fn set_size(&mut self, size: u64) {
self.size = size;
}
}
#[cfg(test)]
mod tests {
use super::*;
use moloch_core::hash;
#[test]
fn test_mem_store() {
let mut store = MemStore::new();
let h1 = hash(b"test1");
let h2 = hash(b"test2");
store.insert(0, h1).unwrap();
store.insert(1, h2).unwrap();
assert_eq!(store.get(0).unwrap(), Some(h1));
assert_eq!(store.get(1).unwrap(), Some(h2));
assert_eq!(store.get(2).unwrap(), None);
assert_eq!(store.size(), 2);
}
}