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.
§Allocation Semantics
- The internal read buffer is allocated eagerly in Self::new.
- Refills try to reclaim mutable ownership of that same backing allocation.
- If backing is still shared (for example, previously returned slices are alive), a pooled replacement is allocated and existing backing is left alive until all aliases drop.
- Self::read returns zero-copy slices into refill buffers. Holding those slices may force allocation on subsequent refills.
§Example
use commonware_utils::NZUsize;
use commonware_runtime::{Runner, buffer::Read, Blob, Error, Storage, deterministic, BufferPooler};
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(0, data).await.expect("unable to write data");
// Create a buffer
let buffer = 64 * 1024;
let mut reader = Read::from_pooler(&context, blob, size, NZUsize!(buffer));
// Read data sequentially
let header = reader.read(16).await.expect("unable to read data");
println!("Read header: {:?}", header.coalesce().as_ref());
// 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,
pool: BufferPool,
) -> Self
pub fn new( blob: B, blob_size: u64, buffer_size: NonZeroUsize, pool: BufferPool, ) -> Self
Creates a new Read that reads from the given blob with the specified buffer size.
Sourcepub fn from_pooler(
pooler: &impl BufferPooler,
blob: B,
blob_size: u64,
buffer_size: NonZeroUsize,
) -> Self
pub fn from_pooler( pooler: &impl BufferPooler, blob: B, blob_size: u64, buffer_size: NonZeroUsize, ) -> Self
Creates a new Read, extracting the storage BufferPool from a BufferPooler.
Sourcepub const fn buffer_remaining(&self) -> usize
pub const fn buffer_remaining(&self) -> usize
Returns how many valid bytes are remaining in the buffer.
Sourcepub const fn blob_remaining(&self) -> u64
pub const fn blob_remaining(&self) -> u64
Returns how many bytes remain in the blob from the current position.
Sourcepub const fn blob_size(&self) -> u64
pub const fn blob_size(&self) -> u64
Returns the number of bytes in the blob, as provided at construction.
Sourcepub async fn read(&mut self, len: usize) -> Result<IoBufs, Error>
pub async fn read(&mut self, len: usize) -> Result<IoBufs, Error>
Reads exactly len bytes and returns them as immutable bytes.
Returned bytes are composed of zero-copy slices from the internal read buffer. Holding returned slices can keep the current backing shared, which may require allocation on later refills.
Returns an error if not enough bytes are available.
Auto Trait Implementations§
impl<B> !Freeze for Read<B>
impl<B> !RefUnwindSafe for Read<B>
impl<B> Send for Read<B>
impl<B> Sync for Read<B>
impl<B> Unpin for Read<B>where
B: Unpin,
impl<B> UnsafeUnpin for Read<B>where
B: UnsafeUnpin,
impl<B> !UnwindSafe for Read<B>
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