|
@@ -100,7 +100,9 @@ mod private {
|
|
|
|
|
|
/// Returns one more than the last index in the internal buffer which can be read.
|
|
|
fn buf_end(&self) -> usize {
|
|
|
- let limit = self.len().min(self.buf_start + self.sector_sz());
|
|
|
+ let len = self.len();
|
|
|
+ let sect_sz = self.sector_sz();
|
|
|
+ let limit = len.min(self.buf_start + sect_sz);
|
|
|
limit - self.buf_start
|
|
|
}
|
|
|
}
|
|
@@ -295,20 +297,19 @@ mod private {
|
|
|
seek_from: SeekFrom,
|
|
|
pre_seek: F,
|
|
|
) -> io::Result<u64> {
|
|
|
- let inner_pos = self.inner.stream_position()?;
|
|
|
- let inner_pos_new = seek_from.abs(|| Ok(inner_pos), || self.size_or_err())?;
|
|
|
- let sect_index = self.sector_index(inner_pos);
|
|
|
- let sect_index_new = self.sector_index(inner_pos_new);
|
|
|
- let pos: u64 = self.pos.try_into().box_err()?;
|
|
|
- if sect_index != sect_index_new || pos == inner_pos {
|
|
|
+ let pos = self.pos as u64;
|
|
|
+ let pos_new = seek_from.abs(|| Ok(pos), || self.size_or_err())?;
|
|
|
+ let sect_index = self.sector_index(pos);
|
|
|
+ let sect_index_new = self.sector_index(pos_new);
|
|
|
+ if sect_index != sect_index_new {
|
|
|
pre_seek(self)?;
|
|
|
let sect_sz: u64 = self.sector_sz().try_into().box_err()?;
|
|
|
let seek_to = sect_index_new * sect_sz;
|
|
|
self.inner.seek(SeekFrom::Start(seek_to))?;
|
|
|
self.fill_internal_buf()?;
|
|
|
}
|
|
|
- self.pos = inner_pos_new.try_into().box_err()?;
|
|
|
- Ok(inner_pos_new)
|
|
|
+ self.pos = pos_new.try_into().box_err()?;
|
|
|
+ Ok(pos_new)
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -421,8 +422,8 @@ mod private {
|
|
|
mod tests {
|
|
|
use super::*;
|
|
|
|
|
|
- use crate::{
|
|
|
- test_helpers::{read_check, write_fill, BtCursor, Randomizer, SectoredCursor},
|
|
|
+ use crate::test_helpers::{
|
|
|
+ integer_array, read_check, write_fill, BtCursor, Randomizer, SectoredCursor,
|
|
|
SECTOR_SZ_DEFAULT,
|
|
|
};
|
|
|
|
|
@@ -728,4 +729,28 @@ mod tests {
|
|
|
|
|
|
assert_eq!(&[0, 1, 2, 3, 4], actual.as_slice());
|
|
|
}
|
|
|
+
|
|
|
+ #[test]
|
|
|
+ fn try_seek_to_second_sector() {
|
|
|
+ const SECT_SZ: usize = 4;
|
|
|
+ const DATA_LEN: usize = 2 * SECT_SZ;
|
|
|
+ const DATA: [u8; DATA_LEN] = integer_array::<DATA_LEN>(0);
|
|
|
+ let mut sectored = SectoredBuf::new()
|
|
|
+ .try_compose(SectoredCursor::new(Vec::new(), SECT_SZ))
|
|
|
+ .unwrap();
|
|
|
+
|
|
|
+ let written = sectored
|
|
|
+ .write_from(BtCursor::new(DATA), DATA.len())
|
|
|
+ .unwrap();
|
|
|
+ assert_eq!(DATA.len(), written);
|
|
|
+ sectored.rewind().unwrap();
|
|
|
+ const OFFSET: u64 = SECT_SZ as u64 + 1;
|
|
|
+ sectored.try_seek(SeekFrom::Start(OFFSET)).unwrap();
|
|
|
+ let mut actual = BtCursor::new(Vec::new());
|
|
|
+ sectored.read_into(&mut actual, SECT_SZ).unwrap();
|
|
|
+
|
|
|
+ const EXPECTED_LEN: usize = SECT_SZ - 1;
|
|
|
+ const EXPECTED: [u8; EXPECTED_LEN] = integer_array::<EXPECTED_LEN>(OFFSET as u8);
|
|
|
+ assert_eq!(&EXPECTED, actual.into_inner().as_slice());
|
|
|
+ }
|
|
|
}
|