use std::collections::BTreeMap;
use crate::prelude::*;
pub struct MemLog {
pub entries: BTreeMap<Index, (Term, Vec<u8>)>,
pub stable: Option<Index>,
}
impl MemLog {
pub fn new() -> MemLog {
MemLog { entries: BTreeMap::new(), stable: None }
}
pub fn highest_index(&self) -> Index {
self.entries.keys().next_back().map_or(Index(0), |index| *index)
}
pub fn add(&mut self, entry: Entry) {
debug_assert!(self.stable.map_or(true, |stable| entry.index > stable));
debug_assert!({
let mut preceding = self.entries.range(..entry.index);
preceding.next_back().map_or(true, |prev| *prev.0 + 1 == entry.index)
});
let _ = self.entries.split_off(&entry.index);
self.entries.insert(entry.index, (entry.term, entry.payload));
}
pub fn get(&self, index: Index) -> Option<&Vec<u8>> {
self.entries.get(&index).map(|value| &value.1)
}
pub fn mark_stable(&mut self, index: Index) {
self.stable = Some(index);
}
}