use super::Direction;
use crate::sector::Sector;
#[derive(Clone, Debug)]
pub struct QNIndex<S: Sector> {
blocks: Vec<(S, usize)>,
direction: Direction,
}
impl<S: Sector> QNIndex<S> {
pub fn new(mut blocks: Vec<(S, usize)>, direction: Direction) -> Self {
blocks.sort_by(|a, b| a.0.cmp(&b.0));
for (i, (sector, dim)) in blocks.iter().enumerate() {
assert!(
*dim > 0,
"QNIndex: block dimension must be > 0 for sector {sector:?}"
);
if i > 0 {
assert!(
blocks[i - 1].0 != *sector,
"QNIndex: duplicate sector {sector:?}"
);
}
}
Self { blocks, direction }
}
pub fn blocks(&self) -> &[(S, usize)] {
&self.blocks
}
pub fn direction(&self) -> Direction {
self.direction
}
pub fn num_blocks(&self) -> usize {
self.blocks.len()
}
pub fn total_dim(&self) -> usize {
self.blocks.iter().map(|(_, d)| d).sum()
}
pub fn block_dim(&self, idx: usize) -> usize {
self.blocks[idx].1
}
pub fn sector(&self, idx: usize) -> &S {
&self.blocks[idx].0
}
}