pub struct Cached<T: Indexable>{ /* private fields */ }Expand description
A PGM-Index wrapper with a small hot-key cache.
This struct uses interior mutability (Cell) to update the cache on read operations.
Therefore, it is !Sync and cannot be shared across threads without synchronization
(e.g., Mutex<Cached>).
Note: When serialized with serde, only the inner index is saved. The cache is recreated empty on deserialization.
§Example
use pgm_extra::index::external::Cached;
let keys: Vec<u64> = (0..10000).collect();
let index = Cached::new(&keys, 64, 4).unwrap();
// First lookup - cache miss, populates cache
assert!(index.contains(&keys, &5000));
// Second lookup - cache hit
assert!(index.contains(&keys, &5000));Implementations§
Source§impl<T: Indexable> Cached<T>
impl<T: Indexable> Cached<T>
Sourcepub fn new(
data: &[T],
epsilon: usize,
epsilon_recursive: usize,
) -> Result<Self, Error>
pub fn new( data: &[T], epsilon: usize, epsilon_recursive: usize, ) -> Result<Self, Error>
Build a new cached PGM-Index from sorted data.
Sourcepub fn from_index(index: Static<T>) -> Self
pub fn from_index(index: Static<T>) -> Self
Wrap an existing index with a cache.
Sourcepub fn lower_bound(&self, data: &[T], value: &T) -> usizewhere
T: Ord,
pub fn lower_bound(&self, data: &[T], value: &T) -> usizewhere
T: Ord,
Find the first position where data[pos] >= value.
Sourcepub fn upper_bound(&self, data: &[T], value: &T) -> usizewhere
T: Ord,
pub fn upper_bound(&self, data: &[T], value: &T) -> usizewhere
T: Ord,
Find the first position where data[pos] > value.
Sourcepub fn contains(&self, data: &[T], value: &T) -> boolwhere
T: Ord,
pub fn contains(&self, data: &[T], value: &T) -> boolwhere
T: Ord,
Check if the value exists in the data.
pub fn len(&self) -> usize
pub fn is_empty(&self) -> bool
pub fn segments_count(&self) -> usize
pub fn height(&self) -> usize
pub fn epsilon(&self) -> usize
pub fn epsilon_recursive(&self) -> usize
pub fn size_in_bytes(&self) -> usize
Sourcepub fn clear_cache(&self)
pub fn clear_cache(&self)
Clear all cached entries.
Sourcepub fn into_inner(self) -> Static<T>
pub fn into_inner(self) -> Static<T>
Consume and return the inner index.
Sourcepub fn range_indices<R>(&self, data: &[T], range: R) -> (usize, usize)where
T: Ord,
R: RangeBounds<T>,
pub fn range_indices<R>(&self, data: &[T], range: R) -> (usize, usize)where
T: Ord,
R: RangeBounds<T>,
Returns the (start, end) indices for iterating over data in the given range.
Sourcepub fn range<'a, R>(
&self,
data: &'a [T],
range: R,
) -> impl DoubleEndedIterator<Item = &'a T>where
T: Ord,
R: RangeBounds<T>,
pub fn range<'a, R>(
&self,
data: &'a [T],
range: R,
) -> impl DoubleEndedIterator<Item = &'a T>where
T: Ord,
R: RangeBounds<T>,
Returns an iterator over data in the given range.
Trait Implementations§
Source§impl<'de, T: Indexable> Deserialize<'de> for Cached<T>
impl<'de, T: Indexable> Deserialize<'de> for Cached<T>
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl<T: Indexable> External<T> for Cached<T>
impl<T: Indexable> External<T> for Cached<T>
Source§fn lower_bound(&self, data: &[T], value: &T) -> usizewhere
T: Ord,
fn lower_bound(&self, data: &[T], value: &T) -> usizewhere
T: Ord,
data[pos] >= value.Source§fn upper_bound(&self, data: &[T], value: &T) -> usizewhere
T: Ord,
fn upper_bound(&self, data: &[T], value: &T) -> usizewhere
T: Ord,
data[pos] > value.Source§fn contains(&self, data: &[T], value: &T) -> boolwhere
T: Ord,
fn contains(&self, data: &[T], value: &T) -> boolwhere
T: Ord,
Source§fn segments_count(&self) -> usize
fn segments_count(&self) -> usize
Source§fn size_in_bytes(&self) -> usize
fn size_in_bytes(&self) -> usize
Auto Trait Implementations§
impl<T> Freeze for Cached<T>
impl<T> !RefUnwindSafe for Cached<T>
impl<T> Send for Cached<T>
impl<T> !Sync for Cached<T>
impl<T> Unpin for Cached<T>
impl<T> UnwindSafe for Cached<T>
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
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>
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>
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