Skip to content

Commit ce97446

Browse files
committed
more
1 parent d891a48 commit ce97446

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

src/sys/tree.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use super::bindings::tsk_size_t;
55
use super::bindings::tsk_tree_t;
66
use super::flags::TreeFlags;
77
use super::newtypes::NodeId;
8+
use super::newtypes::SizeType;
89
use super::tskbox::TskBox;
910
use super::TreeSequence;
1011
use super::TskitError;
@@ -69,7 +70,7 @@ impl<'treeseq> LLTree<'treeseq> {
6970
self.inner.as_mut()
7071
}
7172

72-
pub fn as_ptr(&mut self) -> *const tsk_tree_t {
73+
pub fn as_ptr(&self) -> *const tsk_tree_t {
7374
self.inner.as_ptr()
7475
}
7576

@@ -112,6 +113,17 @@ impl<'treeseq> LLTree<'treeseq> {
112113
.num_rows,
113114
)
114115
}
116+
117+
pub fn num_tracked_samples(&self, u: NodeId) -> Result<SizeType, TskitError> {
118+
let mut n = tsk_size_t::MAX;
119+
let np: *mut tsk_size_t = &mut n;
120+
assert!(!self.as_ptr().is_null());
121+
// SAFETY: internal pointer not null and is initialized.
122+
let code = unsafe {
123+
super::bindings::tsk_tree_get_num_tracked_samples(self.as_ptr(), u.into(), np)
124+
};
125+
handle_tsk_return_value!(code, n.into())
126+
}
115127
}
116128

117129
// Trait defining iteration over nodes.

src/trees/tree.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use crate::sys::bindings as ll_bindings;
22
use crate::sys::{LLTree, TreeSequence};
33
use crate::NodeId;
44
use crate::Position;
5+
use crate::SizeType;
56
use crate::TreeFlags;
67
use crate::TskitError;
78

@@ -115,6 +116,15 @@ impl<'treeseq> Tree<'treeseq> {
115116
pub fn right_child<N: Into<NodeId> + Copy>(&self, u: N) -> Option<NodeId> {
116117
self.inner.left_sib(u.into())
117118
}
119+
120+
/// Get the number of samples below node `u`.
121+
///
122+
/// # Errors
123+
///
124+
/// * [`TskitError`] if [`TreeFlags::NO_SAMPLE_COUNTS`].
125+
pub fn num_tracked_samples(&self, u: NodeId) -> Result<SizeType, TskitError> {
126+
self.inner.num_tracked_samples(u)
127+
}
118128
}
119129

120130
impl<'ts> streaming_iterator::StreamingIterator for Tree<'ts> {

0 commit comments

Comments
 (0)