use super::SearchScratch;
use crate::error::SearchError;
use std::collections::BinaryHeap;
impl SearchScratch {
pub(super) fn new(nodes: usize) -> Result<Self, SearchError> {
let mut marks = Vec::new();
marks
.try_reserve_exact(nodes)
.map_err(|_| SearchError::AllocationFailed)?;
marks.resize(nodes, 0);
Ok(Self {
marks,
generation: 0,
candidates: BinaryHeap::new(),
results: BinaryHeap::new(),
routing_probes: Vec::new(),
routing_probe_heap: BinaryHeap::new(),
routing_nodes: Vec::new(),
merged: Vec::new(),
})
}
pub(super) fn begin(&mut self) {
self.candidates.clear();
self.results.clear();
if self.generation == u32::MAX {
self.marks.fill(0);
self.generation = 1;
} else {
self.generation += 1;
}
}
pub(super) fn mark(&mut self, index: usize) -> bool {
if self.marks[index] == self.generation {
false
} else {
self.marks[index] = self.generation;
true
}
}
}