Range reads M0/M1 (indexed lookups, Storage trait), ZFP, in-place editing #17
@@ -385,13 +385,13 @@ impl ObjectHeader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let chunk0_msg_start = pos;
|
let chunk0_msg_start = pos;
|
||||||
let chunk0_msg_end = abs(pos)
|
let Some(chunk0_abs_end) = abs(pos).checked_add(chunk0_size) else {
|
||||||
.checked_add(chunk0_size)
|
return Err(FormatError::UnexpectedEof {
|
||||||
.ok_or(FormatError::UnexpectedEof {
|
|
||||||
expected: usize::MAX,
|
expected: usize::MAX,
|
||||||
available: file_len,
|
available: file_len,
|
||||||
})?
|
});
|
||||||
- base;
|
};
|
||||||
|
let chunk0_msg_end = chunk0_abs_end - base;
|
||||||
|
|
||||||
// The whole first chunk, prefix to checksum, in one read (its
|
// The whole first chunk, prefix to checksum, in one read (its
|
||||||
// bounds check is the one on the checksum's 4 bytes).
|
// bounds check is the one on the checksum's 4 bytes).
|
||||||
@@ -1364,7 +1364,11 @@ mod tests {
|
|||||||
let want = ObjectHeader::parse(&f, at, 8, 8);
|
let want = ObjectHeader::parse(&f, at, 8, 8);
|
||||||
let storage = CountingStorage::new(f.clone());
|
let storage = CountingStorage::new(f.clone());
|
||||||
let got = ObjectHeader::parse_in(&storage, at as u64, 8, 8);
|
let got = ObjectHeader::parse_in(&storage, at as u64, 8, 8);
|
||||||
assert_eq!(format!("{got:?}"), format!("{want:?}"), "at {at}, cut {cut}");
|
assert_eq!(
|
||||||
|
format!("{got:?}"),
|
||||||
|
format!("{want:?}"),
|
||||||
|
"at {at}, cut {cut}"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -215,7 +215,11 @@ pub fn read_exact_at(
|
|||||||
/// storage. For structures whose size is only known once their prefix has
|
/// storage. For structures whose size is only known once their prefix has
|
||||||
/// been parsed and whose parsers bound-check what they are given.
|
/// been parsed and whose parsers bound-check what they are given.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn read_upto(file: &dyn Storage, offset: u64, max: usize) -> Result<Cow<'_, [u8]>, FormatError> {
|
pub fn read_upto(
|
||||||
|
file: &dyn Storage,
|
||||||
|
offset: u64,
|
||||||
|
max: usize,
|
||||||
|
) -> Result<Cow<'_, [u8]>, FormatError> {
|
||||||
let avail = file.len().saturating_sub(offset);
|
let avail = file.len().saturating_sub(offset);
|
||||||
let len = usize::try_from(avail).map_or(max, |a| a.min(max));
|
let len = usize::try_from(avail).map_or(max, |a| a.min(max));
|
||||||
let bytes = file.read_at(offset, len)?;
|
let bytes = file.read_at(offset, len)?;
|
||||||
|
|||||||
@@ -520,7 +520,10 @@ fn image_block_in(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Where the image block is, checked against a file of `file_len` bytes.
|
/// Where the image block is, checked against a file of `file_len` bytes.
|
||||||
fn image_block_range(file_len: u64, location: CacheImageLocation) -> Result<(u64, usize), FormatError> {
|
fn image_block_range(
|
||||||
|
file_len: u64,
|
||||||
|
location: CacheImageLocation,
|
||||||
|
) -> Result<(u64, usize), FormatError> {
|
||||||
let bad = FormatError::InvalidCacheImage;
|
let bad = FormatError::InvalidCacheImage;
|
||||||
let start = usize::try_from(location.address).map_err(|_| bad("address out of range"))?;
|
let start = usize::try_from(location.address).map_err(|_| bad("address out of range"))?;
|
||||||
let len = usize::try_from(location.length).map_err(|_| bad("length out of range"))?;
|
let len = usize::try_from(location.length).map_err(|_| bad("length out of range"))?;
|
||||||
@@ -883,9 +886,15 @@ mod tests {
|
|||||||
read_superblock_extension_in(&storage, &sb),
|
read_superblock_extension_in(&storage, &sb),
|
||||||
read_superblock_extension(&f, &sb)
|
read_superblock_extension(&f, &sb)
|
||||||
);
|
);
|
||||||
assert_eq!(cache_image_state_in(&storage, &sb), cache_image_state(&f, &sb));
|
assert_eq!(
|
||||||
|
cache_image_state_in(&storage, &sb),
|
||||||
|
cache_image_state(&f, &sb)
|
||||||
|
);
|
||||||
if let Ok(CacheImageState::Loaded(image)) = cache_image_state(&f, &sb) {
|
if let Ok(CacheImageState::Loaded(image)) = cache_image_state(&f, &sb) {
|
||||||
assert_eq!(&*image.block_in(&storage).unwrap(), image.block(&f).unwrap());
|
assert_eq!(
|
||||||
|
&*image.block_in(&storage).unwrap(),
|
||||||
|
image.block(&f).unwrap()
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user