Skip to content

Commit c366071

Browse files
committed
Fix preorder stack population for when root changes within a tree.
Fixes #187
1 parent 5d1e63d commit c366071

File tree

1 file changed

+28
-1
lines changed

1 file changed

+28
-1
lines changed

src/trees.rs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -668,6 +668,11 @@ impl NodeIterator for PreorderNodeIterator<'_> {
668668
None => {
669669
if let Some(r) = self.root_stack.pop() {
670670
self.current_node_ = Some(r);
671+
let mut c = self.tree.right_child(r).unwrap();
672+
while c != NodeId::NULL {
673+
self.node_stack.push(c);
674+
c = self.tree.left_sib(c).unwrap();
675+
}
671676
}
672677
}
673678
};
@@ -1428,8 +1433,30 @@ pub(crate) mod test_trees {
14281433
assert_eq!(nsamples, tree.num_tracked_samples(n).unwrap());
14291434
}
14301435
assert_eq!(preoder_nodes.len(), postoder_nodes.len());
1436+
1437+
// Test our preorder against the tskit functions in 0.99.15
1438+
{
1439+
let mut nodes: Vec<NodeId> = vec![
1440+
NodeId::NULL;
1441+
unsafe { ll_bindings::tsk_tree_get_size_bound(tree.as_ptr()) }
1442+
as usize
1443+
];
1444+
let mut num_nodes: tsk_size_t = 0;
1445+
let ptr = std::ptr::addr_of_mut!(num_nodes);
1446+
unsafe {
1447+
ll_bindings::tsk_tree_preorder(
1448+
tree.as_ptr(),
1449+
-1,
1450+
nodes.as_mut_ptr() as *mut tsk_id_t,
1451+
ptr,
1452+
);
1453+
}
1454+
assert_eq!(num_nodes as usize, preoder_nodes.len());
1455+
for i in 0..num_nodes as usize {
1456+
assert_eq!(preoder_nodes[i], nodes[i]);
1457+
}
1458+
}
14311459
}
1432-
assert!(false);
14331460
}
14341461

14351462
#[test]

0 commit comments

Comments
 (0)