store generated as vec

This commit is contained in:
NikVolf 2019-10-11 08:44:20 +03:00
parent e701687b69
commit 6b7a3dec9c
1 changed files with 8 additions and 12 deletions

View File

@ -12,14 +12,11 @@ use crate::{Entry, EntryLink, NodeData, Error, EntryKind};
pub struct Tree { pub struct Tree {
stored: HashMap<u32, Entry>, stored: HashMap<u32, Entry>,
generated: HashMap<u32, Entry>, generated: Vec<Entry>,
// number of persistent(!) tree entries // number of persistent(!) tree entries
stored_count: u32, stored_count: u32,
// number of virtual nodes generated
generated_count: u32,
root: EntryLink, root: EntryLink,
} }
@ -28,7 +25,7 @@ impl Tree {
pub fn resolve_link(&self, link: EntryLink) -> Result<IndexedNode, Error> { pub fn resolve_link(&self, link: EntryLink) -> Result<IndexedNode, Error> {
match link { match link {
EntryLink::Generated(index) => { EntryLink::Generated(index) => {
let node = self.generated.get(&index).ok_or(Error::ExpectedInMemory(link))?; let node = self.generated.get(index as usize).ok_or(Error::ExpectedInMemory(link))?;
Ok(IndexedNode { Ok(IndexedNode {
node, node,
link, link,
@ -52,14 +49,13 @@ impl Tree {
} }
fn push_generated(&mut self, data: Entry) -> EntryLink { fn push_generated(&mut self, data: Entry) -> EntryLink {
let idx = self.generated_count; self.generated.push(data);
self.generated_count = self.generated_count + 1; EntryLink::Generated(self.generated.len() as u32 - 1)
self.generated.insert(idx, data);
EntryLink::Generated(idx)
} }
/// Populate tree with plain list of the leaves/nodes. Mostly for tests, /// Populate tree with plain list of the leaves/nodes. For now, only for tests,
/// since this `Tree` structure is for partially loaded tree. /// since this `Tree` structure is for partially loaded tree (but it might change)
#[cfg(test)]
pub fn populate(loaded: Vec<Entry>, root: EntryLink) -> Self { pub fn populate(loaded: Vec<Entry>, root: EntryLink) -> Self {
let mut result = Tree::invalid(); let mut result = Tree::invalid();
result.stored_count = loaded.len() as u32; result.stored_count = loaded.len() as u32;
@ -71,12 +67,12 @@ impl Tree {
result result
} }
// Empty tree with invalid root
fn invalid() -> Self { fn invalid() -> Self {
Tree { Tree {
root: EntryLink::Generated(0), root: EntryLink::Generated(0),
generated: Default::default(), generated: Default::default(),
stored: Default::default(), stored: Default::default(),
generated_count: 0,
stored_count: 0, stored_count: 0,
} }
} }