use std::collections::HashMap;
#[derive(Debug, Default)]
pub struct ElementIndex {
map: HashMap<u32, Vec<u32>>,
}
impl ElementIndex {
pub fn new() -> Self {
Self::default()
}
pub fn add(&mut self, local_name_hash: u32, node_ref: u32) {
self.map.entry(local_name_hash).or_default().push(node_ref);
}
pub fn find(&self, local_name_hash: u32) -> &[u32] {
self.map.get(&local_name_hash).map_or(&[], |v| v.as_slice())
}
pub fn len(&self) -> usize {
self.map.len()
}
pub fn is_empty(&self) -> bool {
self.map.is_empty()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn new_index_is_empty() {
let idx = ElementIndex::new();
assert!(idx.is_empty());
assert_eq!(idx.len(), 0);
}
#[test]
fn add_and_find_single() {
let mut idx = ElementIndex::new();
idx.add(42, 7);
assert_eq!(idx.find(42), &[7]);
}
#[test]
fn unknown_hash_returns_empty() {
let idx = ElementIndex::new();
assert!(idx.find(999).is_empty());
}
#[test]
fn multiple_elements_same_hash() {
let mut idx = ElementIndex::new();
idx.add(42, 1);
idx.add(42, 5);
idx.add(42, 9);
assert_eq!(idx.find(42), &[1, 5, 9]);
}
#[test]
fn different_hashes_independent() {
let mut idx = ElementIndex::new();
idx.add(10, 1);
idx.add(20, 2);
assert_eq!(idx.find(10), &[1]);
assert_eq!(idx.find(20), &[2]);
}
#[test]
fn len_counts_buckets() {
let mut idx = ElementIndex::new();
idx.add(10, 1);
idx.add(20, 2);
idx.add(10, 3); assert_eq!(idx.len(), 2); }
}