Skip to content

Commit ecdcb9b

Browse files
committed
cool
1 parent 4fdebe8 commit ecdcb9b

File tree

2 files changed

+121
-1
lines changed

2 files changed

+121
-1
lines changed

src/sys/tree.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,26 @@ impl<'treeseq> LLTree<'treeseq> {
225225
unsafe { bindings::tsk_treeseq_get_num_samples(self.as_ref().tree_sequence) };
226226
super::generate_slice(self.as_ref().samples, num_samples)
227227
}
228+
229+
pub fn parent_array(&self) -> &[NodeId] {
230+
super::generate_slice(self.as_ref().parent, self.treeseq.num_nodes_raw() + 1)
231+
}
232+
233+
pub fn left_sib_array(&self) -> &[NodeId] {
234+
super::generate_slice(self.as_ref().left_sib, self.treeseq.num_nodes_raw() + 1)
235+
}
236+
237+
pub fn right_sib_array(&self) -> &[NodeId] {
238+
super::generate_slice(self.as_ref().right_sib, self.treeseq.num_nodes_raw() + 1)
239+
}
240+
241+
pub fn left_child_array(&self) -> &[NodeId] {
242+
super::generate_slice(self.as_ref().left_child, self.treeseq.num_nodes_raw() + 1)
243+
}
244+
245+
pub fn right_child_array(&self) -> &[NodeId] {
246+
super::generate_slice(self.as_ref().right_child, self.treeseq.num_nodes_raw() + 1)
247+
}
228248
}
229249

230250
// Trait defining iteration over nodes.

src/trees/tree.rs

Lines changed: 101 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,14 +173,114 @@ impl<'treeseq> Tree<'treeseq> {
173173

174174
/// Return all roots as a vector.
175175
pub fn roots_to_vec(&self) -> Vec<NodeId> {
176-
self.roots().collect::<Vec::<_>>()
176+
self.roots().collect::<Vec<_>>()
177177
}
178178

179179
/// Get the list of sample nodes as a slice.
180180
pub fn sample_nodes(&self) -> &[NodeId] {
181181
self.inner.sample_nodes()
182182
}
183183

184+
/// # Failing examples
185+
///
186+
/// The lifetime of the slice is tied to the parent object:
187+
///
188+
/// ```compile_fail
189+
/// use streaming_iterator::StreamingIterator;
190+
/// let tables = tskit::TableCollection::new(1.).unwrap();
191+
/// let treeseq =
192+
/// tables.tree_sequence(tskit::TreeSequenceFlags::BUILD_INDEXES).unwrap();
193+
/// let mut tree_iter = treeseq.tree_iterator(tskit::TreeFlags::default()).unwrap();
194+
/// while let Some(tree) = tree_iter.next() {
195+
/// let r = tree.left_sib_array();
196+
/// drop(tree_iter);
197+
/// for _ in r {} // ERROR
198+
/// }
199+
/// ```
200+
pub fn left_sib_array(&self) -> &[NodeId] {
201+
self.inner.left_sib_array()
202+
}
203+
204+
/// # Failing examples
205+
///
206+
/// The lifetime of the slice is tied to the parent object:
207+
///
208+
/// ```compile_fail
209+
/// use streaming_iterator::StreamingIterator;
210+
/// let tables = tskit::TableCollection::new(1.).unwrap();
211+
/// let treeseq =
212+
/// tables.tree_sequence(tskit::TreeSequenceFlags::BUILD_INDEXES).unwrap();
213+
/// let mut tree_iter = treeseq.tree_iterator(tskit::TreeFlags::default()).unwrap();
214+
/// while let Some(tree) = tree_iter.next() {
215+
/// let r = tree.right_sib_array();
216+
/// drop(tree_iter);
217+
/// for _ in r {} // ERROR
218+
/// }
219+
/// ```
220+
pub fn right_sib_array(&self) -> &[NodeId] {
221+
self.inner.right_sib_array()
222+
}
223+
224+
/// # Failing examples
225+
///
226+
/// The lifetime of the slice is tied to the parent object:
227+
///
228+
/// ```compile_fail
229+
/// use streaming_iterator::StreamingIterator;
230+
/// let tables = tskit::TableCollection::new(1.).unwrap();
231+
/// let treeseq =
232+
/// tables.tree_sequence(tskit::TreeSequenceFlags::BUILD_INDEXES).unwrap();
233+
/// let mut tree_iter = treeseq.tree_iterator(tskit::TreeFlags::default()).unwrap();
234+
/// while let Some(tree) = tree_iter.next() {
235+
/// let l = tree.left_child_array();
236+
/// drop(tree_iter);
237+
/// for _ in l {} // ERROR
238+
/// }
239+
/// ```
240+
pub fn left_child_array(&self) -> &[NodeId] {
241+
self.inner.left_child_array()
242+
}
243+
244+
/// # Failing examples
245+
///
246+
/// The lifetime of the slice is tied to the parent object:
247+
///
248+
/// ```compile_fail
249+
/// use streaming_iterator::StreamingIterator;
250+
/// let tables = tskit::TableCollection::new(1.).unwrap();
251+
/// let treeseq =
252+
/// tables.tree_sequence(tskit::TreeSequenceFlags::BUILD_INDEXES).unwrap();
253+
/// let mut tree_iter = treeseq.tree_iterator(tskit::TreeFlags::default()).unwrap();
254+
/// while let Some(tree) = tree_iter.next() {
255+
/// let r = tree.right_child_array();
256+
/// drop(tree_iter);
257+
/// for _ in r {} // ERROR
258+
/// }
259+
/// ```
260+
pub fn right_child_array(&self) -> &[NodeId] {
261+
self.inner.right_child_array()
262+
}
263+
264+
/// # Failing examples
265+
///
266+
/// The lifetime of the slice is tied to the parent object:
267+
///
268+
/// ```compile_fail
269+
/// use streaming_iterator::StreamingIterator;
270+
/// let tables = tskit::TableCollection::new(1.).unwrap();
271+
/// let treeseq =
272+
/// tables.tree_sequence(tskit::TreeSequenceFlags::BUILD_INDEXES).unwrap();
273+
/// let mut tree_iter = treeseq.tree_iterator(tskit::TreeFlags::default()).unwrap();
274+
/// while let Some(tree) = tree_iter.next() {
275+
/// let p = tree.parent_array();
276+
/// drop(tree_iter);
277+
/// for _ in p {} // ERROR
278+
/// }
279+
/// ```
280+
pub fn parent_array(&self) -> &[NodeId] {
281+
self.inner.parent_array()
282+
}
283+
184284
/// Return an [`Iterator`] over all nodes in the tree.
185285
///
186286
/// # Parameters

0 commit comments

Comments
 (0)