pub struct Read<B: Blob> { /* private fields */ }Expand description
A reader that buffers content from a Blob to optimize the performance of a full scan of contents.
§Example
use commonware_utils::NZUsize;
use commonware_runtime::{Runner, buffer::Read, Blob, Error, Storage, deterministic};
let executor = deterministic::Runner::default();
executor.start(|context| async move {
// Open a blob and add some data (e.g., a journal file)
let (blob, size) = context.open("my_partition", b"my_data").await.expect("unable to open blob");
let data = b"Hello, world! This is a test.".to_vec();
let size = data.len() as u64;
blob.write_at(data, 0).await.expect("unable to write data");
// Create a buffer
let buffer = 64 * 1024;
let mut reader = Read::new(blob, size, NZUsize!(buffer));
// Read data sequentially
let mut header = [0u8; 16];
reader.read_exact(&mut header, 16).await.expect("unable to read data");
println!("Read header: {:?}", header);
// Position is still at 16 (after header)
assert_eq!(reader.position(), 16);
});Implementations§
Source§impl<B: Blob> Read<B>
impl<B: Blob> Read<B>
Sourcepub fn new(blob: B, blob_size: u64, buffer_size: NonZeroUsize) -> Self
pub fn new(blob: B, blob_size: u64, buffer_size: NonZeroUsize) -> Self
Creates a new Read that reads from the given blob with the specified buffer size.
§Panics
Panics if buffer_size is zero.
Sourcepub fn buffer_remaining(&self) -> usize
pub fn buffer_remaining(&self) -> usize
Returns how many valid bytes are remaining in the buffer.
Sourcepub fn blob_remaining(&self) -> u64
pub fn blob_remaining(&self) -> u64
Returns how many bytes remain in the blob from the current position.
Sourcepub fn blob_size(&self) -> u64
pub fn blob_size(&self) -> u64
Returns the number of bytes in the blob, as provided at construction.
Sourcepub async fn read_exact(
&mut self,
buf: &mut [u8],
size: usize,
) -> Result<(), Error>
pub async fn read_exact( &mut self, buf: &mut [u8], size: usize, ) -> Result<(), Error>
Reads exactly size bytes into the provided buffer. Returns an error if not enough bytes
are available.
§Panics
Panics if size is greater than the length of buf.
Auto Trait Implementations§
impl<B> Freeze for Read<B>where
B: Freeze,
impl<B> RefUnwindSafe for Read<B>where
B: RefUnwindSafe,
impl<B> Send for Read<B>
impl<B> Sync for Read<B>
impl<B> Unpin for Read<B>where
B: Unpin,
impl<B> UnwindSafe for Read<B>where
B: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
Source§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more