diff --git a/src/pdata/array.rs b/src/pdata/array.rs deleted file mode 100644 index d8299c2..0000000 --- a/src/pdata/array.rs +++ /dev/null @@ -1,39 +0,0 @@ -use nom::{number::complete::*, IResult}; -use std::fmt; - -use crate::pdata::unpack::*; - -//------------------------------------------ - -// TODO: build a data structure representating an array? - -// FIXME: rename this struct -pub struct ArrayBlockEntry { - pub block: u64, -} - -impl Unpack for ArrayBlockEntry { - fn disk_size() -> u32 { - 8 - } - - fn unpack(i: &[u8]) -> IResult<&[u8], ArrayBlockEntry> { - let (i, n) = le_u64(i)?; - let block = n; - - Ok(( - i, - ArrayBlockEntry { - block, - } - )) - } -} - -impl fmt::Display for ArrayBlockEntry { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}", self.block) - } -} - -//------------------------------------------ diff --git a/src/pdata/array_block.rs b/src/pdata/array_block.rs index ad52bba..b082d92 100644 --- a/src/pdata/array_block.rs +++ b/src/pdata/array_block.rs @@ -33,7 +33,7 @@ impl Unpack for ArrayBlockHeader { max_entries, nr_entries, value_size, - blocknr + blocknr, }, )) } @@ -44,27 +44,17 @@ pub struct ArrayBlock { pub values: Vec, } -impl ArrayBlock { - pub fn get_header(&self) -> &ArrayBlockHeader { - &self.header - } -} - fn convert_result(r: IResult<&[u8], V>) -> Result<(&[u8], V)> { r.map_err(|_| anyhow!("parse error")) } -pub fn unpack_array_block( - data: &[u8], -) -> Result> { +pub fn unpack_array_block(data: &[u8]) -> Result> { // TODO: collect errors - let (i, header) = ArrayBlockHeader::unpack(data).map_err(|_e| anyhow!("Couldn't parse header"))?; + let (i, header) = + ArrayBlockHeader::unpack(data).map_err(|_e| anyhow!("Couldn't parse header"))?; let (_i, values) = convert_result(count(V::unpack, header.nr_entries as usize)(i))?; - Ok(ArrayBlock { - header, - values, - }) + Ok(ArrayBlock { header, values }) } //------------------------------------------ diff --git a/src/pdata/array_walker.rs b/src/pdata/array_walker.rs index e8287b1..a8d5c57 100644 --- a/src/pdata/array_walker.rs +++ b/src/pdata/array_walker.rs @@ -1,7 +1,6 @@ use std::sync::Arc; use crate::io_engine::*; -use crate::pdata::array::*; use crate::pdata::array_block::*; use crate::pdata::btree::*; use crate::pdata::btree_walker::*; @@ -11,16 +10,12 @@ use crate::pdata::unpack::*; pub struct ArrayWalker { engine: Arc, - ignore_non_fatal: bool + ignore_non_fatal: bool, } // FIXME: define another Result type for array visiting? pub trait ArrayBlockVisitor { - fn visit( - &self, - index: u64, - v: V, - ) -> anyhow::Result<()>; + fn visit(&self, index: u64, v: V) -> anyhow::Result<()>; } struct BlockValueVisitor { @@ -29,9 +24,9 @@ struct BlockValueVisitor { } impl BlockValueVisitor { - pub fn new>( + pub fn new( e: Arc, - v: Box, + v: Box>, ) -> BlockValueVisitor { BlockValueVisitor { engine: e, @@ -39,19 +34,17 @@ impl BlockValueVisitor { } } - pub fn visit_array_block( - &self, - index: u64, - array_block: ArrayBlock, - ) { - let begin = index * u64::from(array_block.header.nr_entries); + pub fn visit_array_block(&self, index: u64, array_block: ArrayBlock) { + let begin = index * array_block.header.max_entries as u64; for i in 0..array_block.header.nr_entries { - self.array_block_visitor.visit(begin + u64::from(i), array_block.values[i as usize]).unwrap(); + self.array_block_visitor + .visit(begin + i as u64, array_block.values[i as usize]) + .unwrap(); } } } -impl NodeVisitor for BlockValueVisitor { +impl NodeVisitor for BlockValueVisitor { // FIXME: return errors fn visit( &self, @@ -59,23 +52,20 @@ impl NodeVisitor for BlockValueVisitor { _kr: &KeyRange, _h: &NodeHeader, keys: &[u64], - values: &[ArrayBlockEntry], + values: &[u64], ) -> Result<()> { - for n in 0..keys.len() { - let index = keys[n]; - let b = self.engine.read(values[n].block).map_err(|_| io_err(path))?; + for (n, index) in keys.iter().enumerate() { + let b = self.engine.read(values[n]).map_err(|_| io_err(path))?; let array_block = unpack_array_block::(b.get_data()).map_err(|_| io_err(path))?; - self.visit_array_block(index, array_block); + self.visit_array_block(*index, array_block); } Ok(()) } - // FIXME: stub fn visit_again(&self, _path: &[u64], _b: u64) -> Result<()> { Ok(()) } - // FIXME: stub fn end_walk(&self) -> Result<()> { Ok(()) } @@ -90,15 +80,13 @@ impl ArrayWalker { r } - // FIXME: pass the visitor by reference? // FIXME: redefine the Result type for array visiting? - pub fn walk(&self, visitor: Box, root: u64) -> Result<()> + pub fn walk(&self, visitor: Box>, root: u64) -> Result<()> where - BV: 'static + ArrayBlockVisitor, - V: Unpack, + V: Unpack + Copy, { let w = BTreeWalker::new(self.engine.clone(), self.ignore_non_fatal); - let mut path = Vec::new(); // FIXME: eliminate this line? + let mut path = Vec::new(); path.push(0); let v = BlockValueVisitor::::new(self.engine.clone(), visitor); w.walk(&mut path, &v, root) diff --git a/src/pdata/mod.rs b/src/pdata/mod.rs index 370d244..93f8811 100644 --- a/src/pdata/mod.rs +++ b/src/pdata/mod.rs @@ -1,4 +1,3 @@ -pub mod array; pub mod array_block; pub mod array_walker; pub mod btree;