|
@@ -1,4 +1,7 @@
|
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
+
|
|
|
|
+//! Contains the [SectoredBuf] type.
|
|
|
|
+
|
|
use log::error;
|
|
use log::error;
|
|
use positioned_io::Size;
|
|
use positioned_io::Size;
|
|
use safemem::write_bytes;
|
|
use safemem::write_bytes;
|
|
@@ -7,7 +10,7 @@ use std::io::{self, Read, Seek, SeekFrom, Write};
|
|
use crate::{
|
|
use crate::{
|
|
bterr, error::DisplayErr, suppress_err_if_non_zero, BlockError, BlockMeta, BoxInIoErr,
|
|
bterr, error::DisplayErr, suppress_err_if_non_zero, BlockError, BlockMeta, BoxInIoErr,
|
|
Decompose, MetaAccess, Positioned, ReadDual, ReadExt, Result, Sectored, SeekFromExt, SizeExt,
|
|
Decompose, MetaAccess, Positioned, ReadDual, ReadExt, Result, Sectored, SeekFromExt, SizeExt,
|
|
- Split, TryCompose, TrySeek, WriteDual, ZeroExtendable, EMPTY_SLICE,
|
|
|
|
|
|
+ Split, TrySeek, WriteDual, ZeroExtendable, EMPTY_SLICE,
|
|
};
|
|
};
|
|
|
|
|
|
pub use private::SectoredBuf;
|
|
pub use private::SectoredBuf;
|
|
@@ -29,41 +32,32 @@ mod private {
|
|
pos: usize,
|
|
pos: usize,
|
|
}
|
|
}
|
|
|
|
|
|
- impl SectoredBuf<()> {
|
|
|
|
- pub fn new() -> SectoredBuf<()> {
|
|
|
|
- SectoredBuf {
|
|
|
|
- inner: (),
|
|
|
|
- pos: 0,
|
|
|
|
|
|
+ impl<T: Sectored + Read + Seek + AsRef<BlockMeta>> SectoredBuf<T> {
|
|
|
|
+ /// Creates a new [SectoredBuf] which buffers the given stream.
|
|
|
|
+ pub fn new(inner: T) -> Result<SectoredBuf<T>> {
|
|
|
|
+ let sect_sz = inner.sector_sz();
|
|
|
|
+ let mut sectored = SectoredBuf {
|
|
|
|
+ inner,
|
|
buf: Vec::new(),
|
|
buf: Vec::new(),
|
|
buf_start: 0,
|
|
buf_start: 0,
|
|
dirty: false,
|
|
dirty: false,
|
|
- }
|
|
|
|
|
|
+ pos: 0,
|
|
|
|
+ };
|
|
|
|
+ sectored.buf.resize(sect_sz, 0);
|
|
|
|
+ sectored.inner.rewind()?;
|
|
|
|
+ sectored.fill_internal_buf()?;
|
|
|
|
+ Ok(sectored)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- /// Returns the slice of the internal buffer which is ready to be read from.
|
|
|
|
- /// If the buffer all the bytes in the buffer have been consumed, then the buffer is refilled.
|
|
|
|
- /// The returned slice will be empty if and only if there are no additional bytes in the
|
|
|
|
- /// inner stream.
|
|
|
|
- macro_rules! readable_slice {
|
|
|
|
- ($self:expr) => {{
|
|
|
|
- let pos = $self.buf_pos();
|
|
|
|
- let end = $self.buf_end();
|
|
|
|
- if pos == end && $self.pos < $self.len() {
|
|
|
|
- match $self.fill_internal_buf() {
|
|
|
|
- Ok(nread) => {
|
|
|
|
- if nread > 0 {
|
|
|
|
- Ok(&$self.buf[..$self.buf_end()])
|
|
|
|
- } else {
|
|
|
|
- Ok(&$self.buf[..0])
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- Err(err) => Err(err),
|
|
|
|
- }
|
|
|
|
- } else {
|
|
|
|
- Ok(&$self.buf[pos..end])
|
|
|
|
- }
|
|
|
|
- }};
|
|
|
|
|
|
+ impl<T: Read + Write + Seek + MetaAccess> SectoredBuf<T> {
|
|
|
|
+ /// Updates the size stored in the metadata of the block.
|
|
|
|
+ pub fn update_size(inner: &mut T, size: usize) -> Result<()> {
|
|
|
|
+ inner.mut_meta_body().access_secrets(|secrets| {
|
|
|
|
+ secrets.size = secrets.size.max(size as u64);
|
|
|
|
+ Ok(())
|
|
|
|
+ })
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
impl<T> SectoredBuf<T> {
|
|
impl<T> SectoredBuf<T> {
|
|
@@ -127,12 +121,6 @@ mod private {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- impl Default for SectoredBuf<()> {
|
|
|
|
- fn default() -> Self {
|
|
|
|
- Self::new()
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
impl<T> Split<SectoredBuf<&'static [u8]>, T> for SectoredBuf<T> {
|
|
impl<T> Split<SectoredBuf<&'static [u8]>, T> for SectoredBuf<T> {
|
|
fn split(self) -> (SectoredBuf<&'static [u8]>, T) {
|
|
fn split(self) -> (SectoredBuf<&'static [u8]>, T) {
|
|
let new_self = SectoredBuf {
|
|
let new_self = SectoredBuf {
|
|
@@ -162,26 +150,6 @@ mod private {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- impl<T: Sectored + Read + Seek + AsRef<BlockMeta>> TryCompose<T, SectoredBuf<T>>
|
|
|
|
- for SectoredBuf<()>
|
|
|
|
- {
|
|
|
|
- type Error = crate::Error;
|
|
|
|
- fn try_compose(self, inner: T) -> Result<SectoredBuf<T>> {
|
|
|
|
- let sect_sz = inner.sector_sz();
|
|
|
|
- let mut sectored = SectoredBuf {
|
|
|
|
- inner,
|
|
|
|
- buf: self.buf,
|
|
|
|
- buf_start: 0,
|
|
|
|
- dirty: false,
|
|
|
|
- pos: 0,
|
|
|
|
- };
|
|
|
|
- sectored.buf.resize(sect_sz, 0);
|
|
|
|
- sectored.inner.rewind()?;
|
|
|
|
- sectored.fill_internal_buf()?;
|
|
|
|
- Ok(sectored)
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
impl<T> Sectored for SectoredBuf<T> {
|
|
impl<T> Sectored for SectoredBuf<T> {
|
|
fn sector_sz(&self) -> usize {
|
|
fn sector_sz(&self) -> usize {
|
|
self.buf.len()
|
|
self.buf.len()
|
|
@@ -254,15 +222,6 @@ mod private {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- impl<T: Read + Write + Seek + MetaAccess> SectoredBuf<T> {
|
|
|
|
- pub fn update_size(inner: &mut T, pos: usize) -> Result<()> {
|
|
|
|
- inner.mut_meta_body().access_secrets(|secrets| {
|
|
|
|
- secrets.size = secrets.size.max(pos as u64);
|
|
|
|
- Ok(())
|
|
|
|
- })
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
impl<T: Read + Write + Seek + MetaAccess> ZeroExtendable for SectoredBuf<T> {
|
|
impl<T: Read + Write + Seek + MetaAccess> ZeroExtendable for SectoredBuf<T> {
|
|
fn zero_extend(&mut self, num_zeros: u64) -> io::Result<()> {
|
|
fn zero_extend(&mut self, num_zeros: u64) -> io::Result<()> {
|
|
if num_zeros == 0 {
|
|
if num_zeros == 0 {
|
|
@@ -309,6 +268,31 @@ mod private {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /// Returns the slice of the internal buffer which is ready to be read from.
|
|
|
|
+ /// If the buffer all the bytes in the buffer have been consumed, then the buffer is refilled.
|
|
|
|
+ /// The returned slice will be empty if and only if there are no additional bytes in the
|
|
|
|
+ /// inner stream.
|
|
|
|
+ macro_rules! readable_slice {
|
|
|
|
+ ($self:expr) => {{
|
|
|
|
+ let pos = $self.buf_pos();
|
|
|
|
+ let end = $self.buf_end();
|
|
|
|
+ if pos == end && $self.pos < $self.len() {
|
|
|
|
+ match $self.fill_internal_buf() {
|
|
|
|
+ Ok(nread) => {
|
|
|
|
+ if nread > 0 {
|
|
|
|
+ Ok(&$self.buf[..$self.buf_end()])
|
|
|
|
+ } else {
|
|
|
|
+ Ok(&$self.buf[..0])
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ Err(err) => Err(err),
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ Ok(&$self.buf[pos..end])
|
|
|
|
+ }
|
|
|
|
+ }};
|
|
|
|
+ }
|
|
|
|
+
|
|
impl<T: Read + Seek + AsRef<BlockMeta>> Read for SectoredBuf<T> {
|
|
impl<T: Read + Seek + AsRef<BlockMeta>> Read for SectoredBuf<T> {
|
|
fn read(&mut self, mut dest: &mut [u8]) -> io::Result<usize> {
|
|
fn read(&mut self, mut dest: &mut [u8]) -> io::Result<usize> {
|
|
if self.pos == self.len() {
|
|
if self.pos == self.len() {
|
|
@@ -508,8 +492,7 @@ mod tests {
|
|
};
|
|
};
|
|
|
|
|
|
fn make_sectored_buf(sect_sz: usize, sect_ct: usize) -> SectoredBuf<SectoredCursor<Vec<u8>>> {
|
|
fn make_sectored_buf(sect_sz: usize, sect_ct: usize) -> SectoredBuf<SectoredCursor<Vec<u8>>> {
|
|
- SectoredBuf::new()
|
|
|
|
- .try_compose(SectoredCursor::new(vec![0u8; sect_sz * sect_ct], sect_sz))
|
|
|
|
|
|
+ SectoredBuf::new(SectoredCursor::new(vec![0u8; sect_sz * sect_ct], sect_sz))
|
|
.expect("compose for sectored buffer failed")
|
|
.expect("compose for sectored buffer failed")
|
|
}
|
|
}
|
|
|
|
|
|
@@ -553,9 +536,7 @@ mod tests {
|
|
sectored.write_all(&expected).expect("write failed");
|
|
sectored.write_all(&expected).expect("write failed");
|
|
sectored.flush().expect("flush failed");
|
|
sectored.flush().expect("flush failed");
|
|
let inner = sectored.into_inner();
|
|
let inner = sectored.into_inner();
|
|
- let mut sectored = SectoredBuf::new()
|
|
|
|
- .try_compose(inner)
|
|
|
|
- .expect("failed to compose sectored buffer");
|
|
|
|
|
|
+ let mut sectored = SectoredBuf::new(inner).expect("failed to compose sectored buffer");
|
|
let mut actual = vec![0u8; expected.len()];
|
|
let mut actual = vec![0u8; expected.len()];
|
|
sectored
|
|
sectored
|
|
.fill_buf(actual.as_mut_slice())
|
|
.fill_buf(actual.as_mut_slice())
|
|
@@ -659,9 +640,8 @@ mod tests {
|
|
#[test]
|
|
#[test]
|
|
fn sectored_buf_read_past_end() {
|
|
fn sectored_buf_read_past_end() {
|
|
const LEN: usize = 32;
|
|
const LEN: usize = 32;
|
|
- let mut sectored = SectoredBuf::new()
|
|
|
|
- .try_compose(SectoredCursor::new([0u8; LEN], LEN))
|
|
|
|
- .expect("compose failed");
|
|
|
|
|
|
+ let mut sectored =
|
|
|
|
+ SectoredBuf::new(SectoredCursor::new([0u8; LEN], LEN)).expect("compose failed");
|
|
const BUF_LEN: usize = LEN + 1;
|
|
const BUF_LEN: usize = LEN + 1;
|
|
sectored.write(&[1u8; BUF_LEN - 1]).expect("write failed");
|
|
sectored.write(&[1u8; BUF_LEN - 1]).expect("write failed");
|
|
sectored.seek(SeekFrom::Start(0)).expect("seek failed");
|
|
sectored.seek(SeekFrom::Start(0)).expect("seek failed");
|
|
@@ -675,9 +655,8 @@ mod tests {
|
|
/// Tests that the data written in try_compose is actually written back to the underlying stream.
|
|
/// Tests that the data written in try_compose is actually written back to the underlying stream.
|
|
#[test]
|
|
#[test]
|
|
fn sectored_buf_write_back() {
|
|
fn sectored_buf_write_back() {
|
|
- let mut sectored = SectoredBuf::new()
|
|
|
|
- .try_compose(SectoredCursor::new(vec![0u8; 24], 16))
|
|
|
|
- .expect("compose failed");
|
|
|
|
|
|
+ let mut sectored =
|
|
|
|
+ SectoredBuf::new(SectoredCursor::new(vec![0u8; 24], 16)).expect("compose failed");
|
|
let expected = [1u8; 8];
|
|
let expected = [1u8; 8];
|
|
sectored.write(&expected).expect("first write failed");
|
|
sectored.write(&expected).expect("first write failed");
|
|
sectored.write(&[2u8; 8]).expect("second write failed");
|
|
sectored.write(&[2u8; 8]).expect("second write failed");
|
|
@@ -690,9 +669,8 @@ mod tests {
|
|
#[test]
|
|
#[test]
|
|
fn sectored_buf_write_past_end() {
|
|
fn sectored_buf_write_past_end() {
|
|
const LEN: usize = 8;
|
|
const LEN: usize = 8;
|
|
- let mut sectored = SectoredBuf::new()
|
|
|
|
- .try_compose(SectoredCursor::new(vec![0u8; 0], LEN))
|
|
|
|
- .expect("compos failed");
|
|
|
|
|
|
+ let mut sectored =
|
|
|
|
+ SectoredBuf::new(SectoredCursor::new(vec![0u8; 0], LEN)).expect("compos failed");
|
|
let expected = [1u8; LEN + 1];
|
|
let expected = [1u8; LEN + 1];
|
|
sectored.write(&expected).expect("write failed");
|
|
sectored.write(&expected).expect("write failed");
|
|
sectored.seek(SeekFrom::Start(0)).expect("seek failed");
|
|
sectored.seek(SeekFrom::Start(0)).expect("seek failed");
|
|
@@ -704,9 +682,7 @@ mod tests {
|
|
#[test]
|
|
#[test]
|
|
fn read_into_count_limits_read_bytes() {
|
|
fn read_into_count_limits_read_bytes() {
|
|
const DATA: [u8; 8] = [0, 1, 2, 3, 4, 5, 6, 7];
|
|
const DATA: [u8; 8] = [0, 1, 2, 3, 4, 5, 6, 7];
|
|
- let mut sectored = SectoredBuf::new()
|
|
|
|
- .try_compose(SectoredCursor::new(Vec::new(), DATA.len()))
|
|
|
|
- .unwrap();
|
|
|
|
|
|
+ let mut sectored = SectoredBuf::new(SectoredCursor::new(Vec::new(), DATA.len())).unwrap();
|
|
|
|
|
|
sectored.write(&DATA).unwrap();
|
|
sectored.write(&DATA).unwrap();
|
|
sectored.rewind().unwrap();
|
|
sectored.rewind().unwrap();
|
|
@@ -720,9 +696,7 @@ mod tests {
|
|
#[test]
|
|
#[test]
|
|
fn read_into_read_spans_multiple_sectors() {
|
|
fn read_into_read_spans_multiple_sectors() {
|
|
const DATA: [u8; 8] = [0, 1, 2, 3, 4, 5, 6, 7];
|
|
const DATA: [u8; 8] = [0, 1, 2, 3, 4, 5, 6, 7];
|
|
- let mut sectored = SectoredBuf::new()
|
|
|
|
- .try_compose(SectoredCursor::new(Vec::new(), DATA.len()))
|
|
|
|
- .unwrap();
|
|
|
|
|
|
+ let mut sectored = SectoredBuf::new(SectoredCursor::new(Vec::new(), DATA.len())).unwrap();
|
|
|
|
|
|
sectored.write(&DATA).unwrap();
|
|
sectored.write(&DATA).unwrap();
|
|
sectored.write(&DATA).unwrap();
|
|
sectored.write(&DATA).unwrap();
|
|
@@ -740,9 +714,7 @@ mod tests {
|
|
#[test]
|
|
#[test]
|
|
fn read_into_read_past_len() {
|
|
fn read_into_read_past_len() {
|
|
const DATA: [u8; 8] = [0, 1, 2, 3, 4, 5, 6, 7];
|
|
const DATA: [u8; 8] = [0, 1, 2, 3, 4, 5, 6, 7];
|
|
- let mut sectored = SectoredBuf::new()
|
|
|
|
- .try_compose(SectoredCursor::new(Vec::new(), DATA.len()))
|
|
|
|
- .unwrap();
|
|
|
|
|
|
+ let mut sectored = SectoredBuf::new(SectoredCursor::new(Vec::new(), DATA.len())).unwrap();
|
|
|
|
|
|
sectored.write(&DATA).unwrap();
|
|
sectored.write(&DATA).unwrap();
|
|
sectored.rewind().unwrap();
|
|
sectored.rewind().unwrap();
|
|
@@ -757,9 +729,7 @@ mod tests {
|
|
#[test]
|
|
#[test]
|
|
fn write_from_full_cursor() {
|
|
fn write_from_full_cursor() {
|
|
const DATA: [u8; 8] = [0, 1, 2, 3, 4, 5, 6, 7];
|
|
const DATA: [u8; 8] = [0, 1, 2, 3, 4, 5, 6, 7];
|
|
- let mut sectored = SectoredBuf::new()
|
|
|
|
- .try_compose(SectoredCursor::new(Vec::new(), DATA.len()))
|
|
|
|
- .unwrap();
|
|
|
|
|
|
+ let mut sectored = SectoredBuf::new(SectoredCursor::new(Vec::new(), DATA.len())).unwrap();
|
|
|
|
|
|
let written = sectored
|
|
let written = sectored
|
|
.write_from(BtCursor::new(DATA), DATA.len())
|
|
.write_from(BtCursor::new(DATA), DATA.len())
|
|
@@ -773,9 +743,7 @@ mod tests {
|
|
#[test]
|
|
#[test]
|
|
fn write_from_count_limits_bytes_read() {
|
|
fn write_from_count_limits_bytes_read() {
|
|
const DATA: [u8; 8] = [0, 1, 2, 3, 4, 5, 6, 7];
|
|
const DATA: [u8; 8] = [0, 1, 2, 3, 4, 5, 6, 7];
|
|
- let mut sectored = SectoredBuf::new()
|
|
|
|
- .try_compose(SectoredCursor::new(Vec::new(), DATA.len()))
|
|
|
|
- .unwrap();
|
|
|
|
|
|
+ let mut sectored = SectoredBuf::new(SectoredCursor::new(Vec::new(), DATA.len())).unwrap();
|
|
let mut cursor = BtCursor::new(DATA);
|
|
let mut cursor = BtCursor::new(DATA);
|
|
|
|
|
|
let written = sectored.write_from(&mut cursor, DATA.len() / 2).unwrap();
|
|
let written = sectored.write_from(&mut cursor, DATA.len() / 2).unwrap();
|
|
@@ -795,9 +763,7 @@ mod tests {
|
|
fn write_from_write_spans_multiple_sectors() {
|
|
fn write_from_write_spans_multiple_sectors() {
|
|
const SECT_SZ: usize = 4;
|
|
const SECT_SZ: usize = 4;
|
|
const DATA: [u8; SECT_SZ + 1] = [0, 1, 2, 3, 4];
|
|
const DATA: [u8; SECT_SZ + 1] = [0, 1, 2, 3, 4];
|
|
- let mut sectored = SectoredBuf::new()
|
|
|
|
- .try_compose(SectoredCursor::new(Vec::new(), SECT_SZ))
|
|
|
|
- .unwrap();
|
|
|
|
|
|
+ let mut sectored = SectoredBuf::new(SectoredCursor::new(Vec::new(), SECT_SZ)).unwrap();
|
|
|
|
|
|
let written = sectored
|
|
let written = sectored
|
|
.write_from(BtCursor::new(DATA), DATA.len())
|
|
.write_from(BtCursor::new(DATA), DATA.len())
|
|
@@ -815,9 +781,7 @@ mod tests {
|
|
const SECT_SZ: usize = 4;
|
|
const SECT_SZ: usize = 4;
|
|
const DATA_LEN: usize = 2 * SECT_SZ;
|
|
const DATA_LEN: usize = 2 * SECT_SZ;
|
|
const DATA: [u8; DATA_LEN] = integer_array::<DATA_LEN>(0);
|
|
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 mut sectored = SectoredBuf::new(SectoredCursor::new(Vec::new(), SECT_SZ)).unwrap();
|
|
|
|
|
|
let written = sectored
|
|
let written = sectored
|
|
.write_from(BtCursor::new(DATA), DATA.len())
|
|
.write_from(BtCursor::new(DATA), DATA.len())
|
|
@@ -837,9 +801,7 @@ mod tests {
|
|
#[test]
|
|
#[test]
|
|
fn seek_past_end_is_error() {
|
|
fn seek_past_end_is_error() {
|
|
const SECT_SZ: usize = 4;
|
|
const SECT_SZ: usize = 4;
|
|
- let mut sectored = SectoredBuf::new()
|
|
|
|
- .try_compose(SectoredCursor::new(Vec::new(), SECT_SZ))
|
|
|
|
- .unwrap();
|
|
|
|
|
|
+ let mut sectored = SectoredBuf::new(SectoredCursor::new(Vec::new(), SECT_SZ)).unwrap();
|
|
|
|
|
|
let result = sectored.seek(SeekFrom::Start(1));
|
|
let result = sectored.seek(SeekFrom::Start(1));
|
|
|
|
|
|
@@ -854,9 +816,7 @@ mod tests {
|
|
#[test]
|
|
#[test]
|
|
fn seek_to_zero_when_empty() {
|
|
fn seek_to_zero_when_empty() {
|
|
const SECT_SZ: usize = 4;
|
|
const SECT_SZ: usize = 4;
|
|
- let mut sectored = SectoredBuf::new()
|
|
|
|
- .try_compose(SectoredCursor::new(Vec::new(), SECT_SZ))
|
|
|
|
- .unwrap();
|
|
|
|
|
|
+ let mut sectored = SectoredBuf::new(SectoredCursor::new(Vec::new(), SECT_SZ)).unwrap();
|
|
|
|
|
|
let pos = sectored.seek(SeekFrom::Start(0)).unwrap();
|
|
let pos = sectored.seek(SeekFrom::Start(0)).unwrap();
|
|
|
|
|
|
@@ -869,9 +829,7 @@ mod tests {
|
|
const SECT_SZ: usize = 4;
|
|
const SECT_SZ: usize = 4;
|
|
const DATA_LEN: usize = 2 * SECT_SZ;
|
|
const DATA_LEN: usize = 2 * SECT_SZ;
|
|
const DATA: [u8; DATA_LEN] = integer_array::<DATA_LEN>(0);
|
|
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 mut sectored = SectoredBuf::new(SectoredCursor::new(Vec::new(), SECT_SZ)).unwrap();
|
|
|
|
|
|
sectored.write(&DATA).unwrap();
|
|
sectored.write(&DATA).unwrap();
|
|
const MID_FIRST: usize = SECT_SZ / 2;
|
|
const MID_FIRST: usize = SECT_SZ / 2;
|
|
@@ -896,9 +854,7 @@ mod tests {
|
|
#[test]
|
|
#[test]
|
|
fn read_into_reads_nothing_when_at_end() {
|
|
fn read_into_reads_nothing_when_at_end() {
|
|
const SECT_SZ: usize = 8;
|
|
const SECT_SZ: usize = 8;
|
|
- let mut sectored = SectoredBuf::new()
|
|
|
|
- .try_compose(SectoredCursor::new(Vec::new(), SECT_SZ))
|
|
|
|
- .unwrap();
|
|
|
|
|
|
+ let mut sectored = SectoredBuf::new(SectoredCursor::new(Vec::new(), SECT_SZ)).unwrap();
|
|
|
|
|
|
sectored.write([1u8; 6].as_slice()).unwrap();
|
|
sectored.write([1u8; 6].as_slice()).unwrap();
|
|
let mut actual = Cursor::new(Vec::new());
|
|
let mut actual = Cursor::new(Vec::new());
|
|
@@ -909,9 +865,7 @@ mod tests {
|
|
|
|
|
|
#[test]
|
|
#[test]
|
|
fn zero_extend_less_than_sect_sz() {
|
|
fn zero_extend_less_than_sect_sz() {
|
|
- let mut sectored = SectoredBuf::new()
|
|
|
|
- .try_compose(SectoredCursor::new(Vec::new(), 8))
|
|
|
|
- .unwrap();
|
|
|
|
|
|
+ let mut sectored = SectoredBuf::new(SectoredCursor::new(Vec::new(), 8)).unwrap();
|
|
|
|
|
|
let written = sectored.write([1u8; 4].as_slice()).unwrap();
|
|
let written = sectored.write([1u8; 4].as_slice()).unwrap();
|
|
assert_eq!(4, written);
|
|
assert_eq!(4, written);
|
|
@@ -926,9 +880,7 @@ mod tests {
|
|
#[test]
|
|
#[test]
|
|
fn zero_extend_multiple_sectors() {
|
|
fn zero_extend_multiple_sectors() {
|
|
const SECT_SZ: usize = 8;
|
|
const SECT_SZ: usize = 8;
|
|
- let mut sectored = SectoredBuf::new()
|
|
|
|
- .try_compose(SectoredCursor::new(Vec::new(), SECT_SZ))
|
|
|
|
- .unwrap();
|
|
|
|
|
|
+ let mut sectored = SectoredBuf::new(SectoredCursor::new(Vec::new(), SECT_SZ)).unwrap();
|
|
|
|
|
|
let written = sectored.write([1u8; SECT_SZ / 2].as_slice()).unwrap();
|
|
let written = sectored.write([1u8; SECT_SZ / 2].as_slice()).unwrap();
|
|
assert_eq!(SECT_SZ / 2, written);
|
|
assert_eq!(SECT_SZ / 2, written);
|
|
@@ -950,9 +902,7 @@ mod tests {
|
|
#[test]
|
|
#[test]
|
|
fn zero_extend_multiple_sectors_with_remainder() {
|
|
fn zero_extend_multiple_sectors_with_remainder() {
|
|
const SECT_SZ: usize = 8;
|
|
const SECT_SZ: usize = 8;
|
|
- let mut sectored = SectoredBuf::new()
|
|
|
|
- .try_compose(SectoredCursor::new(Vec::new(), SECT_SZ))
|
|
|
|
- .unwrap();
|
|
|
|
|
|
+ let mut sectored = SectoredBuf::new(SectoredCursor::new(Vec::new(), SECT_SZ)).unwrap();
|
|
|
|
|
|
let written = sectored.write([1u8; SECT_SZ / 2].as_slice()).unwrap();
|
|
let written = sectored.write([1u8; SECT_SZ / 2].as_slice()).unwrap();
|
|
assert_eq!(SECT_SZ / 2, written);
|
|
assert_eq!(SECT_SZ / 2, written);
|
|
@@ -975,9 +925,7 @@ mod tests {
|
|
const SECT_SZ: usize = crate::SECTOR_SZ_DEFAULT;
|
|
const SECT_SZ: usize = crate::SECTOR_SZ_DEFAULT;
|
|
const DIVISOR: usize = 8;
|
|
const DIVISOR: usize = 8;
|
|
const READ_SZ: usize = SECT_SZ / DIVISOR;
|
|
const READ_SZ: usize = SECT_SZ / DIVISOR;
|
|
- let mut sectored = SectoredBuf::new()
|
|
|
|
- .try_compose(SectoredCursor::new(Vec::new(), SECT_SZ))
|
|
|
|
- .unwrap();
|
|
|
|
|
|
+ let mut sectored = SectoredBuf::new(SectoredCursor::new(Vec::new(), SECT_SZ)).unwrap();
|
|
let mut expected = vec![0u8; READ_SZ];
|
|
let mut expected = vec![0u8; READ_SZ];
|
|
|
|
|
|
for index in 0..(DIVISOR as u8 + 1) {
|
|
for index in 0..(DIVISOR as u8 + 1) {
|