use super::{DocId, PostingCursor, PostingScore, StorageBackendResult};
use crate::read_control::StorageReadControl;
use uqa_core::memory::MemoryReservation;
pub struct BudgetedPostingReadCursor<'a> {
cursor: Box<dyn PostingReadCursor + 'a>,
_memory: MemoryReservation,
}
impl<'a> BudgetedPostingReadCursor<'a> {
pub fn new<T: PostingReadCursor + 'a>(
cursor: T,
control: &StorageReadControl,
) -> StorageBackendResult<Self> {
control.check()?;
let memory = control.memory().reserve(size_of::<T>())?;
Ok(Self {
cursor: Box::new(cursor),
_memory: memory,
})
}
}
impl PostingReadCursor for BudgetedPostingReadCursor<'_> {
fn doc_freq(&self) -> u64 {
self.cursor.doc_freq()
}
fn current(&self) -> Option<PostingScore> {
self.cursor.current()
}
fn advance(&mut self) -> StorageBackendResult<Option<PostingScore>> {
self.cursor.advance()
}
fn advance_to(&mut self, target: DocId) -> StorageBackendResult<Option<PostingScore>> {
self.cursor.advance_to(target)
}
}
pub trait PostingReadCursor: Send {
fn doc_freq(&self) -> u64;
fn current(&self) -> Option<PostingScore>;
fn advance(&mut self) -> StorageBackendResult<Option<PostingScore>>;
fn advance_to(&mut self, target: DocId) -> StorageBackendResult<Option<PostingScore>>;
}
pub struct OwnedPostingReadCursor(pub Box<dyn PostingCursor>);
impl PostingReadCursor for OwnedPostingReadCursor {
fn doc_freq(&self) -> u64 {
self.0.doc_freq()
}
fn current(&self) -> Option<PostingScore> {
self.0.current()
}
fn advance(&mut self) -> StorageBackendResult<Option<PostingScore>> {
self.0.advance()
}
fn advance_to(&mut self, target: DocId) -> StorageBackendResult<Option<PostingScore>> {
self.0.advance_to(target)
}
}