use std::collections::BTreeMap;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum XrefEntry {
Normal { offset: u32, generation: u16 },
Compressed { container: u32, index: u32 },
Free,
}
#[derive(Debug, Clone, Default)]
pub struct Xref {
entries: BTreeMap<u32, XrefEntry>,
pub size: u32,
}
impl Xref {
pub fn new() -> Self {
Self::default()
}
pub fn insert(&mut self, object_number: u32, entry: XrefEntry) {
self.entries.insert(object_number, entry);
}
pub fn get(&self, object_number: u32) -> Option<&XrefEntry> {
self.entries.get(&object_number)
}
pub fn iter(&self) -> std::collections::btree_map::Iter<'_, u32, XrefEntry> {
self.entries.iter()
}
pub fn len(&self) -> usize {
self.entries.len()
}
pub fn is_empty(&self) -> bool {
self.entries.is_empty()
}
pub fn merge_older(&mut self, other: Xref) {
for (k, v) in other.entries {
self.entries.entry(k).or_insert(v);
}
if other.size > self.size {
self.size = other.size;
}
}
}