store generated as vec
This commit is contained in:
parent
e701687b69
commit
6b7a3dec9c
20
src/tree.rs
20
src/tree.rs
|
@ -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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue