computer: part 2

This commit is contained in:
nym21
2025-03-20 21:40:06 +01:00
parent 29c10f8854
commit 52cfbf60d4
24 changed files with 997 additions and 107 deletions
+31 -3
View File
@@ -73,7 +73,7 @@ where
let base = Base::import(path, version, compressed)?;
if *compressed {
let pages_meta = CompressedPagesMetadata::read(Self::path_pages_meta_(path).as_path())?;
let pages_meta = Self::read_pages_meta_(path)?;
Ok(Self::Compressed { base, pages_meta })
} else {
@@ -81,6 +81,13 @@ where
}
}
fn read_pages_meta(&self) -> Result<CompressedPagesMetadata> {
Self::read_pages_meta_(self.path())
}
fn read_pages_meta_(path: &Path) -> Result<CompressedPagesMetadata> {
CompressedPagesMetadata::read(Self::path_pages_meta_(path).as_path())
}
#[inline]
pub fn get(&mut self, index: I) -> Result<Option<&T>> {
self.get_(index.to_usize()?)
@@ -215,7 +222,25 @@ where
let page_index = Self::index_to_page_index(index);
if page.as_ref().is_none_or(|b| b.0 != page_index) {
let values = self.decode_page(page_index).unwrap();
let pages_meta = match self {
Self::Raw { .. } => None,
Self::Compressed { .. } => Some(self.read_pages_meta().unwrap()),
};
let values = Self::decode_page_(
self.base()
.read_stored_length()
.unwrap()
.to_usize()
.unwrap(),
page_index,
&self.base().open_file().unwrap(),
pages_meta.as_ref(),
)
.inspect_err(|_| {
dbg!(from, to);
})
.unwrap();
page.replace((page_index, values));
}
@@ -717,7 +742,7 @@ where
}
pub fn index_type_to_string(&self) -> &str {
std::any::type_name::<I>()
I::to_string()
}
}
@@ -787,6 +812,9 @@ impl<I, T> Base<I, T> {
path.join("vec")
}
pub fn read_stored_length(&self) -> Result<Length> {
Length::try_from(self.path_length().as_path())
}
fn write_stored_length(&self) -> io::Result<()> {
self.stored_len.write(&self.path_length())
}
@@ -19,6 +19,7 @@ where
+ Sync,
{
fn to_usize(self) -> Result<usize>;
fn to_string<'a>() -> &'a str;
}
impl<I> StoredIndex for I
where
@@ -40,4 +41,9 @@ where
fn to_usize(self) -> Result<usize> {
self.try_into().map_err(|_| Error::FailedKeyTryIntoUsize)
}
#[inline]
fn to_string<'a>() -> &'a str {
std::any::type_name::<I>()
}
}