crate::ix!();
#[instrument(level = "trace", skip(skel))]
pub fn build_skeleton_level_map(skel: &Skeleton) -> HashMap<u16, u8> {
trace!("Building node->level map with BFS for Skeleton.");
let mut level_map = HashMap::<u16, u8>::new();
let mut visited = HashSet::new();
let mut queue = VecDeque::new();
if let Some(root_id) = skel.root_id() {
queue.push_back((*root_id, 0u8));
} else {
debug!("No root => empty level map.");
return level_map;
}
while let Some((nid, lvl)) = queue.pop_front() {
if !visited.insert(nid) {
trace!("Already visited node_id={} => skipping BFS re-processing", nid);
continue;
}
level_map.insert(nid, lvl);
if let Some(node_ref) = skel.nodes().iter().find(|n| n.id() == nid) {
for &child_id in node_ref.child_ids() {
queue.push_back((child_id, lvl.saturating_add(1)));
}
} else {
trace!("Node id={} not found in skeleton => ignoring children references.", nid);
}
}
trace!("Finished BFS => found {} nodes in level_map.", level_map.len());
level_map
}