use crate::docset::DocSet;
pub trait Postings: DocSet + 'static {
fn term_freq(&self) -> u32;
fn positions_with_offset(&mut self, offset: u32, output: &mut Vec<u32>) {
output.clear();
self.append_positions_with_offset(offset, output);
}
fn append_positions_with_offset(&mut self, offset: u32, output: &mut Vec<u32>);
fn positions(&mut self, output: &mut Vec<u32>) {
self.positions_with_offset(0u32, output);
}
fn offsets(&mut self, output: &mut Vec<(u32, u32)>) {
output.clear();
self.append_offsets(output);
}
fn append_offsets(&mut self, _output: &mut Vec<(u32, u32)>) {}
fn append_positions_and_offsets(&mut self, offset: u32, output: &mut Vec<(u32, u32, u32)>) {
let base = output.len();
let mut positions = Vec::new();
self.append_positions_with_offset(offset, &mut positions);
let mut byte_offsets = Vec::new();
self.append_offsets(&mut byte_offsets);
for (i, &pos) in positions.iter().enumerate() {
let (from, to) = byte_offsets.get(i).copied().unwrap_or((0, 0));
output.push((pos, from, to));
}
output[base..].sort_unstable_by_key(|&(pos, _, _)| pos);
}
}
impl Postings for Box<dyn Postings> {
fn term_freq(&self) -> u32 {
(**self).term_freq()
}
fn append_positions_with_offset(&mut self, offset: u32, output: &mut Vec<u32>) {
(**self).append_positions_with_offset(offset, output);
}
fn append_offsets(&mut self, output: &mut Vec<(u32, u32)>) {
(**self).append_offsets(output);
}
fn append_positions_and_offsets(&mut self, offset: u32, output: &mut Vec<(u32, u32, u32)>) {
(**self).append_positions_and_offsets(offset, output);
}
}