pub struct LazyCache<R>{ /* private fields */ }Expand description
A lazy-loading cache reader with a multi-tiered caching strategy.
Wraps a Read + Seek type and provides efficient cached reads using
a hierarchy of caches: hot (head/tail), warm (memory-mapped), and cold (direct).
The cache automatically loads data in blocks as needed, minimizing I/O operations for sequential and random access patterns.
§Cache Tiers
- Hot cache: Small buffers at the head and tail of the source, always available.
- Warm cache: Memory-mapped region for frequently accessed data.
- Cold cache: Fallback buffer for reads that don’t fit in other caches.
See LazyCache::from_read_seek, LazyCache::open, LazyCache::with_hot_cache,
and LazyCache::with_warm_cache for construction.
Implementations§
Source§impl LazyCache<File>
impl LazyCache<File>
Sourcepub fn open<P: AsRef<Path>>(path: P) -> Result<Self, Error>
pub fn open<P: AsRef<Path>>(path: P) -> Result<Self, Error>
Opens a file and creates a new LazyCache for it.
This is a convenience constructor equivalent to calling LazyCache::from_read_seek
with a File.
§Errors
Returns an error if the file cannot be opened.
§Examples
use pure_magic::readers::LazyCache;
use std::path::Path;
let cache = LazyCache::<std::fs::File>::open(Path::new("file.bin"))?;Source§impl<R> LazyCache<R>
impl<R> LazyCache<R>
Sourcepub fn from_read_seek(rs: R) -> Result<Self, Error>
pub fn from_read_seek(rs: R) -> Result<Self, Error>
Creates a new LazyCache wrapping a Read + Seek type.
The cache is initialized with default settings: no hot or warm caches.
Use LazyCache::with_hot_cache and LazyCache::with_warm_cache to enable additional cache tiers.
§Errors
Returns an error if seeking to the end of the source fails.
§Examples
use pure_magic::readers::{LazyCache, DataRead};
use std::io::Cursor;
let data = b"hello world";
let cache = LazyCache::from_read_seek(Cursor::new(data)).unwrap();
assert_eq!(cache.data_size(), data.len() as u64);Sourcepub fn with_hot_cache(self, size: usize) -> Result<Self, Error>
pub fn with_hot_cache(self, size: usize) -> Result<Self, Error>
Enables the hot cache with the specified size.
The hot cache maintains two buffers: one at the head (beginning) and one
at the tail (end) of the source, each with size size / 2. This is useful
for optimizing access to the start and end of files.
§Errors
Returns an error if seeking or reading from the source fails.
Sourcepub fn with_warm_cache(self, warm_size: u64) -> Self
pub fn with_warm_cache(self, warm_size: u64) -> Self
Enables the warm cache with the specified size.
The warm cache uses memory-mapped storage for improved performance when reading larger regions. The size is clamped to be at least as large as the block size to ensure proper alignment.
Note: The memory mapping is performed lazily on first access.
Trait Implementations§
Source§impl<R> DataRead for LazyCache<R>
impl<R> DataRead for LazyCache<R>
Source§fn stream_position(&self) -> u64
fn stream_position(&self) -> u64
Source§fn read_range(&mut self, range: Range<u64>) -> Result<&[u8], Error>
fn read_range(&mut self, range: Range<u64>) -> Result<&[u8], Error>
Source§fn read_until_any_delim_or_limit(
&mut self,
delims: &[u8],
limit: u64,
) -> Result<&[u8], Error>
fn read_until_any_delim_or_limit( &mut self, delims: &[u8], limit: u64, ) -> Result<&[u8], Error>
limit bytes is reached. Read moreSource§fn read_until_utf16_or_limit(
&mut self,
utf16_char: &[u8; 2],
limit: u64,
) -> Result<&[u8], Error>
fn read_until_utf16_or_limit( &mut self, utf16_char: &[u8; 2], limit: u64, ) -> Result<&[u8], Error>
limit bytes is reached. Read moreSource§fn offset_from_start(&self, pos: SeekFrom) -> u64
fn offset_from_start(&self, pos: SeekFrom) -> u64
SeekFrom position.Source§fn read_count(&mut self, count: u64) -> Result<&[u8], Error>
fn read_count(&mut self, count: u64) -> Result<&[u8], Error>
count bytes from the current position. Read moreSource§fn read_exact_range(&mut self, range: Range<u64>) -> Result<&[u8], Error>
fn read_exact_range(&mut self, range: Range<u64>) -> Result<&[u8], Error>
Source§impl<R> Read for LazyCache<R>
impl<R> Read for LazyCache<R>
Source§fn read(&mut self, buf: &mut [u8]) -> Result<usize>
fn read(&mut self, buf: &mut [u8]) -> Result<usize>
1.36.0 · Source§fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>
read, except that it reads into a slice of buffers. Read moreSource§fn is_read_vectored(&self) -> bool
fn is_read_vectored(&self) -> bool
can_vector)1.0.0 · Source§fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>
buf. Read more1.0.0 · Source§fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>
fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>
buf. Read more1.6.0 · Source§fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>
fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>
buf. Read moreSource§fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>
fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>
read_buf)Source§fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>
fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>
read_buf)cursor. Read more1.0.0 · Source§fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
Read. Read more