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<T: Indexable> Archive for Cached<T>
impl<T: Indexable> Archive for Cached<T>
Source§type Resolver = CachedResolver<T>
type Resolver = CachedResolver<T>
Source§fn resolve(&self, resolver: Self::Resolver, out: Place<Self::Archived>)
fn resolve(&self, resolver: Self::Resolver, out: Place<Self::Archived>)
Source§const COPY_OPTIMIZATION: CopyOptimization<Self> = _
const COPY_OPTIMIZATION: CopyOptimization<Self> = _
serialize. Read moreSource§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<__D: Fallible + ?Sized, T: Indexable> Deserialize<Cached<T>, __D> for Archived<Cached<T>>
impl<__D: Fallible + ?Sized, T: Indexable> Deserialize<Cached<T>, __D> for Archived<Cached<T>>
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> ArchivePointee for T
impl<T> ArchivePointee for T
Source§type ArchivedMetadata = ()
type ArchivedMetadata = ()
Source§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
Source§impl<T> ArchiveUnsized for Twhere
T: Archive,
impl<T> ArchiveUnsized for Twhere
T: Archive,
Source§type Archived = <T as Archive>::Archived
type Archived = <T as Archive>::Archived
Archive, it may be
unsized. Read moreSource§fn archived_metadata(
&self,
) -> <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata
fn archived_metadata( &self, ) -> <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata
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 moreSource§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
Source§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
Source§impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
Source§unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
Source§fn resolve_niched(out: Place<NichedOption<T, N1>>)
fn resolve_niched(out: Place<NichedOption<T, N1>>)
out indicating that a T is niched.