diff --git a/src/info.rs b/src/info.rs index 8a1398d..97f95aa 100644 --- a/src/info.rs +++ b/src/info.rs @@ -1,11 +1,11 @@ -use std::collections::HashMap; +use std::{collections::HashMap, io}; use eyre::{bail, Context}; use rayon::prelude::*; use crate::{ - chunk::{read_chunk, MessageDataHeader}, - index::BagIndex, + chunk::{read_chunk, ChunkHeader, MessageDataHeader}, + index::{BagIndex, IndexData}, parse::Op, reader::{BagReader, SliceReader}, Result, @@ -26,23 +26,36 @@ impl BagInfo { self } - pub fn compute(reader: &mut R, index: &BagIndex) -> Result { + pub fn compute( + reader: &mut R, + index: &BagIndex, + ) -> Result { + index + .chunks + .par_iter() + .try_fold(BagInfo::default, |mut info, chunk| -> Result<_> { + let mut reader = reader.clone(); + reader.seek(io::SeekFrom::Start(chunk.pos))?; + let chunk_header = ChunkHeader::read(&mut reader)?; + info.total_uncompressed += chunk_header.uncompressed_size as u64; + reader.skip_data()?; + for _ in &chunk.connections { + let index = IndexData::read(&mut reader)?; + *info.per_connection.entry(index.conn_id).or_insert(0) += + index.entries.len() as u64; + } + Ok(info) + }) + .try_reduce(BagInfo::default, |a, b| Ok(a.combine(b))) + } + + pub fn compute_without_index( + reader: &mut R, + index: &BagIndex, + ) -> Result { index .chunks .par_iter() - // .try_fold(BagInfo::default, |mut info, chunk| -> rsbag::Result<_> { - // let mut reader = reader.clone(); - // reader.seek(io::SeekFrom::Start(chunk.pos))?; - // let chunk_header = ChunkHeader::read(&mut reader)?; - // info.total_uncompressed += chunk_header.uncompressed_size as u64; - // reader.skip_data()?; - // for _ in &chunk.connections { - // let index = IndexData::read(&mut reader)?; - // *info.per_connection.entry(index.conn_id).or_insert(0) += - // index.entries.len() as u64; - // } - // Ok(info) - // }) .try_fold(BagInfo::default, |mut info, chunk| -> Result<_> { let mut reader = reader.clone(); let data = read_chunk(&mut reader, chunk.pos)